kafka消费者组
在之前的kafka简介的文章中简单地说明过消费者组的概念,这里在展开说明一下
消费者组是由一个或多个消费者实例组成的群组,具有可扩展性和容错性的一种机制。消费者组内的消费者共享一个消费者组ID(GroupId),组内的所有消费者协调在一起来消费订阅主题的所有分区,一个分区只能被组内的一个消费者消费,多余的消费者会闲置
消费者组的概念使得kafka拥有了两种消费模式
点对点和发布订阅
- 点对点模式就是一个主题的消息只对一个消费者组消费
- 发布订阅模式就是一个主题中的消息被多个消费者群组共同消费
消费者重平衡
通过增加消费者组的消费者来进行水平扩展提升消费能力,那么新增加消费者会触发什么操作使得其进行了水平扩展了呢?那就是消费者重平衡。
何时会触发
- 消费组成员发生变化时(新的消费者加入消费者组、消费者离开消费者组)
- 订阅的主题数发生变化(如果使用的是正则表达式进行订阅,新建匹配正则表达式的主题会触发)
- 订阅主题的分区数发生变化
过程
新加入的消费者会分摊之前消费者的部分消息,也就是把一个主题中的部分分区所有权从一个消费者转移到了另一个消费者,这种重平衡操作使得消费者组具有高可用性和伸缩性。
在重平衡期间,消费者无法读取消息,造成整个消费者组在重平衡期间都不可用,且当分区被重新分配给另一个消费者时,消息当前的读取状态就会丢失,就需要从__consumer_offset
这个特殊的主题中进行获取,该主题中就是保存的每次所发送消息中的分区偏移量,该主题的主要作用就是消费者触发重平衡后记录偏移量使用的,消费者每次向这个主题发送消息,当触发重平衡后,消费者停止工作,每个消费者可能会分到对应的分区,然后消费者从该主题中获取对应的分区偏移量
但是这里有个问题,那就是提交的偏移量如果小于客户端最后一次处理的偏移量时,那么位于这两个偏移量之间的消息可能会被重复处理
如果提交的偏移量大于最后一次消费时的偏移量,那么处于这两个偏移量之间的消息就会丢失