kafka消费者选取coordinator流程

176 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

kafka消费者

消费方式

kafka的消费者采用从broker中拉(pull)去消费数据的方式来进行消费,而没有采用推(push)的方式。原因是kafka的服务器broker消息的发送速率一般和消费者的消费速率不一样,导致消费者可能会来不及处理消息。

工作流程

1666248766585.png

从图中可以看出

  • 每一个分区的数据只能被一个消费者组中的一个消费者消费。
  • 一个消费者可以消费多个分区的数据。

单消费者消费多个分区的数据时,如果产生的数据较快。超过了消费者的消费速度,就会造成数据堆积,这时我们就需要消费者组

消费者组

消费者组(Consumer Group(CG))它是多个消费者组成,形成一个消费者组,只要他们的的消费者的groupId相同就是一个消费者组。

  • 消费者组里面的消费者负责消费不同分区的数据,一个分区的数据只能又一个消费者里的一个消费者消费。当消费者数量大于分区数量时候,多的消费者其实不起作用。
  • 消费者组之间互不影响,消费者组是一个订阅者。
  • 一个topic可以被多个消费者消费,但是每个消费者组消费的都是完整的数据

1666249732322.png

消费者初始化

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交互

  1. 消费者组里面每一个消费者发送JoinGroup请求到指定的brokercoordinator选择出来的)。
  2. coordinator从消费者组里面选择一个消费者作为leader
  3. 把要消费的topic数据发送给leader消费者。
  4. leader消费者定制消费方案。
  5. leader消费者把定制的消费方案发送给coordinator
  6. coordinator把具体的消费方案发送给每一个消费者。
  7. 每一个消费者都和coordinator保持心跳(默认三秒)一旦超过(session.timeout.ms=45s)该消费者就会移除,触发再平衡,或者消费者处理消息的时间过长也会触发再平衡,超过最大处理时间5分钟(可配置)。

4、coordinator的好处

当消费者组出现问题时,需要排查Broker日志,我们可以根据coordinator快速的确定在哪一台broker。