3.5.2.群组协调消费者要加入群组时,会向群组协调器发送一个 JoinGroup 请求,第一个加入群主的消费者成为群主,群主会获得群组的成员列表,并负责给每一个消费者分配分区 。分配完毕后,群主把分配情况发送给群组协调器,协调器再把这些信息发送给所有的消费者,每个消费者只能看到自己的分配信息,只有群主知道群组里所有消费者的分配信息 。群组协调的工作会在消费者发生变化(新加入或者掉线),主题中分区发生了变化(增加)时发生 。

文章插图
3.5.3.分区再均衡当消费者群组里的消费者发生变化,或者主题里的分区发生了变化,都会导致再均衡现象的发生 。从前面的知识中,我们知道,Kafka 中,存在着消费者对分区所有权的关系,这样无论是消费者变化,比如增加了消费者,新消费者会读取原本由其他消费者读取的分区,消费者减少,原本由它负责的分区要由其他消费者来读取,增加了分区,哪个消费者来读取这个新增的分区,这些行为,都会导致分区所有权的变化,这种变化就被称为 再均衡 。
再均衡对 Kafka 很重要,这是消费者群组带来高可用性和伸缩性的关键所在 。不过一般情况下,尽量减少再均衡,因为再均衡期间,消费者是无法读取消息的,会造成整个群组一小段时间的不可用 。
消费者通过向称为群组协调器的 broker(不同的群组有不同的协调器)发送心跳来维持它和群组的从属关系以及对分区的所有权关系 。如果消费者长时间不发送心跳,群组协调器认为它已经死亡,就会触发一次再均衡 。
在 0.10.1 及以后的版本中,心跳由单独的线程负责,相关的控制参数为 max.poll.interval.ms 。
3.6.Kafka 中的消费安全一般情况下,我们调用 poll 方法的时候,broker 返回的是生产者写入 Kafka 同时 kafka 的消费者提交偏移量,这样可以确保消费者消息消费不丢失也不重复,所以一般情况下 Kafka 提供的原生的消费者是安全的,但是事情会这么完美吗?
3.7.消费者提交偏移量导致的问题当我们调用 poll 方法的时候,broker 返回的是生产者写入 Kafka 但是还没有被消费者读取过的记录,消费者可以使用 Kafka 来追踪消息在分区里的位置,我们称之为 偏移量 。消费者更新自己读取到哪个消息的操作,我们称之为 提交 。
消费者是如何提交偏移量的呢?消费者会往一个叫做_consumer_offset 的特殊主题发送一个消息,里面会包括每个分区的偏移量 。发生了再均衡之后,消费者可能会被分配新的分区,为了能够继续工作,消费者者需要读取每个分区最后一次提交的偏移量,然后从指定的地方,继续做处理 。
分区再均衡的例子:某软件公司,有一个项目,有两块的工作,有两个码农,一个负责一块,干得好好的 。突然一天,小王桌子一拍不干了,老子中了 5 百万了,不跟你们玩了,立马收拾完电脑就走了 。然后你今天刚好入职,一个萝卜一个坑,你就入坑了 。这个过程我们就好比我们的分区再均衡,分区就是一个项目中的不同块的工作,消费者就是码农,一个码农不玩了,另一个码农立马顶上,这个过程就发生了分区再均衡
1)如果提交的偏移量小于消费者实际处理的最后一个消息的偏移量,处于两个偏移量之间的消息会被重复处理,
2)如果提交的偏移量大于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息将会丢失

文章插图
所以, 处理偏移量的方式对客户端会有很大的影响。KafkaConsumer API 提供了很多种方式来提交偏移量。
3.7.1.自动提交(重复消费不可避免)最简单的提交方式是让消费者自动提交偏移量 。如果 enable.auto.comnit 被设为 true,消费者会自动把从 poll()方法接收到的最大偏移量提交上去 。
提交时间间隔由 auto.commit.interval.ms 控制,默认值是 5s 。自动提交是在轮询里进行的,消费者每次在进行轮询时会检査是否该提交偏移量了,如果是,那么就会提交从上一次轮询返回的偏移量 。
不过,在使用这种简便的方式之前,需要知道它将会带来怎样的结果 。
假设我们仍然使用默认的5s提交时间间隔, 在最近一次提交之后的3s发生了再均衡,再均衡之后,消费者从最后一次提交的偏移量位置开始读取消息 。
这个时候偏移量已经落后了 3s,所以在这 3s 内到达的消息会被重复处理 。可以通过修改提交时间间隔来更频繁地提交偏移量, 减小可能出现重复消息的时间窗, 不过这种情况是无法完全避免的。
推荐阅读
- 程序员遭遇:一觉睡来7个未接电话,到公司时发现已被踢出群
- 程序员为什么一定要进大公司,除了薪资,这些才是决定性因素
- 某程序员跳槽到银行9天后辞职,晒出技术水平后留言:太落后了
- 成都与盖碗茶,饮盖碗茶有五道程序先容盖碗茶品饮程序
- 高级程序员到底长什么样子?
- 第一个登月的地球人是谁?
- 程序员工作必备:10个超实用的GitHub库
- 应用程序加固Tomcat篇
- 公众号小程序有什么用?
- 程序员用Python实现自动化控制键盘和鼠标
