协调者角色
协调者本身是kafka集群的一个broker,负责一个或多个消费者组的消费位移offset提交以及Rebalance工作。如何确定协调者?
- 协调者所在分区:消费者组groupID的哈希值 % _consumer_offsets队列分区数量
- 步骤1确定的分区的leader副本所在broker即为协调者。
消费位移提交
消费者本地会维护一个消费位移offset,每次从kafka队列中拉取消息时都会使用该offset,消费成功之后更新offset。但是消费者组中不同消费者实例在执行过程中可能因为Rebalance重平衡过程导致消费的分区发生变化。新的消费者实例再连接到分区时,需要知道上一任消费者的消费进度,以便在此基础上继续消费。为此kafka需要保存整个消费者组在不同topic的不同partition上的消费位移。
在旧版本中,消费者组的消费位移被保存在zk上,但是zk是强一致模型,每次更新都需要保证超过半数的zk实例完成更新只有才能返回,因此更新操作性能较差。而消费者位移又是一个需要频繁更新的操作,因此直接保存在zk上性能很差。
因此在新版本中,kafka在集群中默认新建了一个_consumer_offsets队列,用这个队列来保存消费位移。这个队列中的消息以kv的形式存储,key是由消费者groupId、topic、partition id组成,能够唯一标识每一个消费者组在指定topic的指定partition上的消费位移。
提交方式
消费位移的提交方式有两种,自动提交和手动提交。
自动提交位移会由后台线程定期提交位移。这种方式缺点很明显
- 可能会造成消息的重复消费。比如定期提交位移的时间是5s,