下面是一些关于Apache kafka
非常流行的使用场景。这些领域的概述,可查看博客文章。
消息
kafka更好的替换传统的消息系统,消息系统被用于各种场景(解耦数据生产者,缓存未处理的消息等),与大多数消息系统比较,kafka有更好的吞吐量,内置分区,副本和故障转移,这有利于处理大规模的消息。
根据我们的经验,消息往往用于较低的吞吐量,但需要低的端到端
延迟,并需要提供强大的耐用性的保证。
在这一领域的kafka比得上传统的消息系统,如ActiveMQ
或RabbitMQ
。
网站活动追踪
kafka原本的使用场景:用户的活动追踪,网站的活动(网页游览,搜索或其他用户的操作信息)发布到不同的主题中心,这些消息可实时处理,实时监测,也可加载到Hadoop或离线处理数据仓库。
每个用户页面视图都会产生非常高的量。
指标
kafka也常常用于监测数据。分布式应用程序生成的统计数据集中聚合。
日志聚合
许多人使用Kafka作为日志聚合解决方案的替代品。日志聚合通常从服务器中收集物理日志文件,并将它们放在中央位置(可能是文件服务器或HDFS)进行处理。Kafka抽象出文件的细节,并将日志或事件数据更清晰地抽象为消息流。这允许更低延迟的处理并更容易支持多个数据源和分布式数据消费。
流处理
kafka中消息处理一般包含多个阶段。其中原始输入数据是从kafka主题消费的,然后汇总,丰富,或者以其他的方式处理转化为新主题,例如,一个推荐新闻文章,文章内容可能从“articles”主题获取;然后进一步处理内容,得到一个处理后的新内容,最后推荐给用户。这种处理是基于单个主题的实时数据流。从0.10.0.0
开始,轻量,但功能强大的流处理,就可以这样进行数据处理了。
除了Kafka Streams,还有Apache Storm和Apache Samza可选择。
事件采集
事件采集是一种应用程序的设计风格,其中状态的变化根据时间的顺序记录下来,kafka支持这种非常大的存储日志数据的场景。
提交日志
kafka可以作为一种分布式的外部日志,可帮助节点之间复制数据,并作为失败的节点来恢复数据重新同步,kafka的日志压缩功能很好的支持这种用法,这种用法类似于Apacha BookKeeper
项目。
zookeeper与kafka之间具体的是一种什么关系呢?
kafka之间是无法互相发现对方的,每个kafka向zk注册,说我是A节点(broker.id),我是B节点,这样组成了一个kafka集群。每个人通过zk来发现彼此。
auto.offset.reset= latest
这个配置项,肯定能保证不重复消费,但它是不是会出现最近部分消息从未被消费
它是在当前没有了偏移量值,便进行偏移量重置。没有当前偏移量,其实就是丢失了消费信息,无从判断消费情况。如果我要为自己产品选择哪种重置方案,我大概率是latest。
是不是默认的策略就是latest呢?
static { CONFIG = new ConfigDef().... .define(AUTO_OFFSET_RESET_CONFIG, Type.STRING, "latest", in("latest", "earliest", "none"), Importance.MEDIUM, AUTO_OFFSET_RESET_DOC)... }
这么看默认值是latest
我回我自己呢
请教您一个问题,假如我的一个topic 有三个分区,那么生产者生产一条消息后会均匀的分布到这三个分区,那么每个分区都有对这条消息的偏移量。那么假设我的消费者组里面有三个消费者ABC分别对应三个分区 ,那么a消费了这条消息后偏移量+1,那第二个分区中的此条消息不是还存在吗,这种情况该三个消费者是如何维护偏移量的呢?谢谢。
1,生产者把消息发送给集群之后,任务完成了,他不需要知道谁是消费者。
2、消费者每个人维护自己的offset。
群里问过大佬了,这个标注一下,一个消息只会放在一个分区里面。 防止大家和我一样理解有偏差。
请问下,我的kafka服务 一个broker,一个分区,一条消息发送到topic成功后,消费者隔了很久(大概十几秒)才能接收到消息,感觉这延迟有点长,这是怎么回事呢?
可以看一下与zookeeper的通讯时长
看了文章之后有几个疑问。想请教一下大神
1.Kafka适合用作数据存储吗,如果适合,那么怎么保证Consumer连接Kafka接收消息时对数据的不重复消费(就是当Consumer应用程序关闭后再打开消息重复接收了)。
2.Topic消息的生命周期最低可以配置多少?
3.那么可以将每个Topic分别设置不同的有效时间吗?例如Topic1的消息有效时间是5分钟,Topic消息的有效时间是7天。
1、比如默认保留7天消息,如果你磁盘够大,你保留1年都可以,不重复消费是你自己配置的。比如auto.offset.reset= latest,就不会重复了,当你需要重新消费之前的数据,改成earliest就可以了。
2、topic消息的生活周期同上,看你保留多久。
3、消息是没有状态的,也就是说没有有效时间,默认保留7天。但是你不能把保留时间设置5分钟吧。那你还是用rabbitMQ做吧。kafka不合适。
非常感谢大神的解答!再请教几个问题:
4.我将producer应用程序发送消息到Kafka完全设置为异步非阻塞的,例如在C语言的producer接口中需要调用rd_kafka_flush()来等待完成producer请求,若果不等待,这样是不是会有丢数据的风险?
5.另外Kafka方面怎么保证数据完全接收到producer消息呢,是不是每发1条(或若干条)然后对producer进行确认?
你可以看下 https://www.orchome.com/511 中的ack介绍。
c语言没用过额,抱歉,但是默认kafka的客户端发送是批量发送的,也就是说,消息并没有马上发送到kafka,而是先保留在缓存中,进行批量准备,然后发送,这也是kafka高效的原因之一,所以你要等待。
默认kafka异步发送可以通过异步回调通知来确保消息是否成功发送,c语言客户端不知道有没有提供,你可以关注下c语言版本的客户端。
好的~感谢大神!
您说的消息批量发送,其实是先进入缓存,这里的缓存作用是类似语事务那样的?如果一条数据写入kafka有问题,这次批量写入就会作废掉,以此来保证写入kafka中的消息顺序?
不会作废,重发失败的消息会排到后面去。
好的,谢谢;
消息往往用于较低的吞吐量?这句话有些不理解
消息往往用于低吞吐量的场景。与很早之前的消息用途对比。
是不是说现在的消息用途吞吐量低,以前的吞吐量高?
反了。
嗯,谢谢
谢谢分享
你好 能提供一些Kafka连接oracle的例子吗
最近事情比较多,以后会提供相关的使用场景。
可以的 好人一生平安
数量你好,我想问一下,一般broker实例与zookeeper的对应关系如何?
zookeeper是干什么的,你还需要了解一下。
不是,我表述错了,我是想部署生产环境,打算部署三个broker实例,但zookeeper部署一个可以吗?
可以是可以,但为了容错还是部署zookeeper集群比较好。
broker和zookeeper的对应比例倒是没什么,都是独立集群。
我是想做伪集群,性能提升咋样?
性能跟zookeeper的多少无关系
那就是别必要做zookeeper伪集群喽,一旦出故障,都会出问题
zookeeper 是作为性能协调工具的角色存在。存储着你Kafka服务的一些些元数据(partitions、offset等等)。zookeeper集群的作用在于保证Zookeeper服务的高可用。因此你可以根据你的需要来选择是否构建zookeeper集群。