持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
kafka消费者
消费方式
kafka的消费者采用从broker中拉(pull)去消费数据的方式来进行消费,而没有采用推(push)的方式。原因是kafka的服务器broker消息的发送速率一般和消费者的消费速率不一样,导致消费者可能会来不及处理消息。
工作流程
从图中可以看出
- 每一个分区的数据只能被一个消费者组中的一个消费者消费。
- 一个消费者可以消费多个分区的数据。
单消费者消费多个分区的数据时,如果产生的数据较快。超过了消费者的消费速度,就会造成数据堆积,这时我们就需要消费者组。
消费者组
消费者组(Consumer Group(CG))它是多个消费者组成,形成一个消费者组,只要他们的的消费者的groupId相同就是一个消费者组。
- 消费者组里面的消费者负责消费不同分区的数据,一个分区的数据只能又一个消费者里的一个消费者消费。当消费者数量大于分区数量时候,多的消费者其实不起作用。
- 消费者组之间互不影响,消费者组是一个订阅者。
- 一个topic可以被多个消费者消费,但是每个消费者组消费的都是完整的数据。
消费者初始化
1、什么是coordinator?
coordinator:协调员,每一个消费者组都会选择一个broker作为自己的coordinator,它来负责监控这个消费者组里每个消费者是否宕机了,如果有一个宕机了,就会进行重新平衡(rebalance)
2、coordinator选择
coordinator节点选择 = groupid的hashcode值 % 50( __consumer_offsets的分区数量默认是50)
例如:groupid的hashcode值 = 1,1% 50 = 1,那么去查看包含__consumer_offsets 主题的一号分区,在哪个broker上,就选择这个节点的coordinator 作为这个消费者组的老大。消费者组下的所有的消费者提交offset的时候就往这个分区去提交offset。
3、消费者与coordinator交互
- 消费者组里面每一个消费者发送JoinGroup请求到指定的
broker(coordinator选择出来的)。 - coordinator从消费者组里面选择一个消费者作为leader
- 把要消费的topic数据发送给leader消费者。
- leader消费者定制消费方案。
- leader消费者把定制的消费方案发送给coordinator
- coordinator把具体的消费方案发送给每一个消费者。
- 每一个消费者都和coordinator保持心跳(默认三秒)一旦超过(session.timeout.ms=45s)该消费者就会移除,触发再平衡,或者消费者处理消息的时间过长也会触发再平衡,超过最大处理时间5分钟(可配置)。
4、coordinator的好处
当消费者组出现问题时,需要排查Broker日志,我们可以根据coordinator快速的确定在哪一台broker。