Kafka学习笔记(四):Consumer Groups & Consumer Offsets
Consumer Groups
- 在一个应用中的所有消费者作为消费者组读取数据
- 组内的每个消费者从独立的分区读取
- 如果消费者多于分区,那么一些消费者会处于非活动状态(作为备用的消费者)
- 分区是最小的并行单位
- 一个消费者可以消费多个分区
- 一个分区可以被多个消费者组里的消费者消费
- 但是,一个分区不能同时被同一个消费者组里的多个消费者消费
1. 发布- 订阅模式
每条消息需要被每个消费者都进行消费:每个消费者都属于不同的消费者组
2. 点对点(一对一)
一条消息只要有被消费就可以:所有消费者都属于同一个消费者组
Consumer Offsets
- kafka 保存消费者组的 offsets
- 提交的 offsets 在 kafka topic 中被称为
__consumer_offsets
- 当组内的一个消费者处理完从 kafka 收到的数据后,它会阶段性地提交 offsets (kafka 代理会写入到
__consumer_offsets
,而不是消费者组自身) - 如果一个消费者崩溃,重启后能根据提交的消费者偏移量重新开始读取数据
消费者交付语义
- Java 消费者默认会自动提交偏移量(至少一次)
- 手动提交有3种语义
- 至少一次(推荐)
- 消息被处理后提交偏移量
- 如果处理失败,消息会再被读取
- 这意味着,我们可以对消息进行重复处理,因此,我们需要确保我们的处理是幂等的(指再次处理不会影响我们的系统)
- 最多一次
- 消息收到就提交偏移量
- 如果处理失败,消息就会丢失(当然也不会再次被读取)
- 正好一次
- 对于 kafka => kafka workflows:使用 Transactional API
- 对于 kafka => 外部系统 workflows:使用幂等消费者