Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
一个MQ需要哪些部分?生产、消费、消息类别、存储等等。
对于kafka而言,kafka服务就像是一个大的水池。不断的生产、存储、消费着各种类别的消息。那么kafka由何组成呢?
1、 Kafka服务
> Topic:主题,Kafka处理的消息的不同分类。
> Broker :消息代理,Kafka集群中的一个kafka服务节点称为一个broker ,主要存储消息数据。存在硬盘中。每个topic 都是有分区的。
> Partition:Topic物理上的分组,一个topic 在broker 中被分为1个或者多个partition,分区在创建topic 的时候指定。
> Message:消息,是通信的基本单位,每个消息都属于一个partition
2、 Kafka服务相关
> Producer :消息和数据的生产者,向Kafka的一个topic 发布消息。
> Consumer:消息和数据的消费者,定于topic 并处理其发布的消息。
> Zookeeper:协调kafka的正常运行。
二、特点
1、高吞吐量:可以满足每秒百万级别消息的生产和消费——生产消费。QPS
2、持久性:有一套完善的消息存储机制,确保数据的高效安全的持久化——中间存储。
3、分布式:基于分布式的扩展和容错机制;Kafka的数据都会复制到几台服务器上。当某一台故障失效时,生产者和消费者转而使用其它的机器——整体健壮性。
kafka topic发生变化是如何实现再平衡的
在Kafka中,每个主题都分为一组分区。生产者将消息写到分区的尾部,而消费者则按照自己的步调阅读它们。Kafka通过在消费者组之间分配分区来扩展主题的使用,消费者组是一组共享公共组标识符的消费者。下图描述了具有三个分区的单个主题和具有两个成员的使用者组。
对于每个消费者组,选择一个经纪人作为小组协调员。小组协调员负责,管理消费者群体状态。在以下情况下将分区分配给使用者:
- 产生了一个新的消费者。
- 一个老消费者倒下了。
- 主题元数据发生变化。
将分区重新分配给使用者的过程称为使用者组重新平衡,当组首次连接到代理时:
- 消费者根据配置auto.offset.reset从每个分区的最早或最新偏移量开始读取。
- 然后按顺序读取每个分区中的消息。
- 使用者提交其已成功处理的消息的偏移量。
在下图中,使用者的位置在偏移量6上,并且其最后提交的偏移量在偏移量1上。
重新平衡使用者组后,会将新的使用者分配到一个分区。
- 它从最后提交的偏移量开始读取。
- 如果旧使用者处理了一些消息但在提交已处理消息的偏移量之前崩溃了,它将重新处理一些消息。
了解Kafka如何利用该poll方法来协调和重新平衡消费群体,这是一些自动提交使用者代码示例:
如果使用者在提交抵消成功处理的消息之前崩溃,则该分区的新使用者将重复处理已处理的未提交消息。频繁提交可减轻重新平衡/崩溃后重复项的数量。在上面的示例代码中,Kafka使用者库基于配置的auto.commit.interval.ms值自动提交,减小该值会增加提交频率。
某些应用程序可能选择手动提交以更好地管理消息使用,因此让我们讨论一下手动提交的不同策略。对于手动提交,我们需要将auto.commit.enable设置为false,并在事件循环中适当地使用KafkaConsumer.commitSync。