Kafka的使用场景

原创
半兽人 发表于: 2016-07-03   最后更新时间: 2021-09-07 09:32:00  
{{totalSubscript}} 订阅, 131,526 游览

下面是一些关于Apache kafka非常流行的使用场景。这些领域的概述,可查看博客文章

消息

kafka更好的替换传统的消息系统,消息系统被用于各种场景(解耦数据生产者,缓存未处理的消息等),与大多数消息系统比较,kafka有更好的吞吐量,内置分区,副本和故障转移,这有利于处理大规模的消息。

根据我们的经验,消息往往用于较低的吞吐量,但需要低的端到端延迟,并需要提供强大的耐用性的保证。

在这一领域的kafka比得上传统的消息系统,如ActiveMQRabbitMQ

网站活动追踪

kafka原本的使用场景:用户的活动追踪,网站的活动(网页游览,搜索或其他用户的操作信息)发布到不同的主题中心,这些消息可实时处理,实时监测,也可加载到Hadoop或离线处理数据仓库。

每个用户页面视图都会产生非常高的量。

指标

kafka也常常用于监测数据。分布式应用程序生成的统计数据集中聚合。

日志聚合

许多人使用Kafka作为日志聚合解决方案的替代品。日志聚合通常从服务器中收集物理日志文件,并将它们放在中央位置(可能是文件服务器或HDFS)进行处理。Kafka抽象出文件的细节,并将日志或事件数据更清晰地抽象为消息流。这允许更低延迟的处理并更容易支持多个数据源和分布式数据消费。

流处理

kafka中消息处理一般包含多个阶段。其中原始输入数据是从kafka主题消费的,然后汇总,丰富,或者以其他的方式处理转化为新主题,例如,一个推荐新闻文章,文章内容可能从“articles”主题获取;然后进一步处理内容,得到一个处理后的新内容,最后推荐给用户。这种处理是基于单个主题的实时数据流。从0.10.0.0开始,轻量,但功能强大的流处理,就可以这样进行数据处理了。

除了Kafka Streams,还有Apache Storm和Apache Samza可选择。

事件采集

事件采集是一种应用程序的设计风格,其中状态的变化根据时间的顺序记录下来,kafka支持这种非常大的存储日志数据的场景。

提交日志

kafka可以作为一种分布式的外部日志,可帮助节点之间复制数据,并作为失败的节点来恢复数据重新同步,kafka的日志压缩功能很好的支持这种用法,这种用法类似于Apacha BookKeeper项目。

更新于 2021-09-07

幕熙 5年前

zookeeper与kafka之间具体的是一种什么关系呢?

半兽人 -> 幕熙 5年前

kafka之间是无法互相发现对方的,每个kafka向zk注册,说我是A节点(broker.id),我是B节点,这样组成了一个kafka集群。每个人通过zk来发现彼此。

自由如风 5年前

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

我回我自己呢

再见 5年前

请教您一个问题,假如我的一个topic 有三个分区,那么生产者生产一条消息后会均匀的分布到这三个分区,那么每个分区都有对这条消息的偏移量。那么假设我的消费者组里面有三个消费者ABC分别对应三个分区 ,那么a消费了这条消息后偏移量+1,那第二个分区中的此条消息不是还存在吗,这种情况该三个消费者是如何维护偏移量的呢?谢谢。

半兽人 -> 再见 5年前

1,生产者把消息发送给集群之后,任务完成了,他不需要知道谁是消费者。
2、消费者每个人维护自己的offset。

rheff -> 再见 5年前

群里问过大佬了,这个标注一下,一个消息只会放在一个分区里面。 防止大家和我一样理解有偏差。

一直在犯错 5年前

请问下,我的kafka服务 一个broker,一个分区,一条消息发送到topic成功后,消费者隔了很久(大概十几秒)才能接收到消息,感觉这延迟有点长,这是怎么回事呢?

msi -> 一直在犯错 5年前

可以看一下与zookeeper的通讯时长

Mora 6年前

看了文章之后有几个疑问。想请教一下大神
1.Kafka适合用作数据存储吗,如果适合,那么怎么保证Consumer连接Kafka接收消息时对数据的不重复消费(就是当Consumer应用程序关闭后再打开消息重复接收了)。
2.Topic消息的生命周期最低可以配置多少?
3.那么可以将每个Topic分别设置不同的有效时间吗?例如Topic1的消息有效时间是5分钟,Topic消息的有效时间是7天。


半兽人 -> Mora 6年前

1、比如默认保留7天消息,如果你磁盘够大,你保留1年都可以,不重复消费是你自己配置的。比如auto.offset.reset= latest,就不会重复了,当你需要重新消费之前的数据,改成earliest就可以了。
2、topic消息的生活周期同上,看你保留多久。
3、消息是没有状态的,也就是说没有有效时间,默认保留7天。但是你不能把保留时间设置5分钟吧。那你还是用rabbitMQ做吧。kafka不合适。

Mora -> 半兽人 6年前

非常感谢大神的解答!再请教几个问题:
4.我将producer应用程序发送消息到Kafka完全设置为异步非阻塞的,例如在C语言的producer接口中需要调用rd_kafka_flush()来等待完成producer请求,若果不等待,这样是不是会有丢数据的风险?
5.另外Kafka方面怎么保证数据完全接收到producer消息呢,是不是每发1条(或若干条)然后对producer进行确认?

半兽人 -> Mora 6年前

你可以看下 https://www.orchome.com/511 中的ack介绍。

c语言没用过额,抱歉,但是默认kafka的客户端发送是批量发送的,也就是说,消息并没有马上发送到kafka,而是先保留在缓存中,进行批量准备,然后发送,这也是kafka高效的原因之一,所以你要等待。

默认kafka异步发送可以通过异步回调通知来确保消息是否成功发送,c语言客户端不知道有没有提供,你可以关注下c语言版本的客户端。

Mora -> 半兽人 6年前

好的~感谢大神!

Gu -> 半兽人 6年前

您说的消息批量发送,其实是先进入缓存,这里的缓存作用是类似语事务那样的?如果一条数据写入kafka有问题,这次批量写入就会作废掉,以此来保证写入kafka中的消息顺序?

半兽人 -> Gu 6年前

不会作废,重发失败的消息会排到后面去。

Gu -> 半兽人 6年前

好的,谢谢;

NO.万 7年前

消息往往用于较低的吞吐量?这句话有些不理解

半兽人 -> NO.万 7年前

消息往往用于低吞吐量的场景。与很早之前的消息用途对比。

NO.万 -> 半兽人 7年前

是不是说现在的消息用途吞吐量低,以前的吞吐量高?

半兽人 -> NO.万 7年前

反了。

NO.万 -> 半兽人 7年前

嗯,谢谢

谢谢分享

你好 能提供一些Kafka连接oracle的例子吗

最近事情比较多,以后会提供相关的使用场景。

可以的  好人一生平安

箕毕 8年前

数量你好,我想问一下,一般broker实例与zookeeper的对应关系如何?

半兽人 -> 箕毕 8年前

zookeeper是干什么的,你还需要了解一下。

箕毕 -> 半兽人 8年前

不是,我表述错了,我是想部署生产环境,打算部署三个broker实例,但zookeeper部署一个可以吗?

半兽人 -> 箕毕 8年前

可以是可以,但为了容错还是部署zookeeper集群比较好。
broker和zookeeper的对应比例倒是没什么,都是独立集群。

箕毕 -> 半兽人 8年前

我是想做伪集群,性能提升咋样?

半兽人 -> 箕毕 8年前

性能跟zookeeper的多少无关系

箕毕 -> 半兽人 8年前

那就是别必要做zookeeper伪集群喽,一旦出故障,都会出问题

芥为之舟 -> 箕毕 7年前

zookeeper 是作为性能协调工具的角色存在。存储着你Kafka服务的一些些元数据(partitions、offset等等)。zookeeper集群的作用在于保证Zookeeper服务的高可用。因此你可以根据你的需要来选择是否构建zookeeper集群。

查看kafka更多相关的文章或提一个关于kafka的问题,也可以与我们一起分享文章