【kafka系列】消费者组
目录
消费者组功能点
1. 动态负载均衡
2. 容错高可用
3. 消费进度管理
4. 并行消费能力
5. 消费隔离性
其他要点
1. Rebalance过程详解
2. 位移提交的精确语义
3. 消费者限速策略
4. 跨机房消费设计
消费者组功能点
1. 动态负载均衡
核心机制:通过Rebalance实现分区重新分配
- 触发条件:消费者加入/退出、订阅主题变化、分区数量变更
- 类比场景:团队任务自动重组(类似敏捷团队根据成员变化调整任务分配)
2. 容错高可用
- 心跳检测:
session.timeout.ms
控制消费者存活判定 - 位移持久化:通过
_consumer_offsets
主题记录消费进度 - 故障转移:崩溃的消费者分配的分区会被其他成员接管
3. 消费进度管理
- 位移提交模式:
-
- 自动提交(风险点:可能提交未处理完的消息)
- 手动同步/异步提交(精准控制但复杂度高)
- 位移重置策略:
auto.offset.reset=earliest/latest/none
4. 并行消费能力
- 分区-消费者绑定原则:一个分区同一时刻只能被一个消费者读取
- 横向扩展公式:消费者数量 ≤ 订阅主题的分区总数
5. 消费隔离性
- 消费组隔离:不同消费组独立消费同一主题(广播模式实现基础)
- 事务隔离:通过
isolation.level=read_committed
读取已提交消息
其他要点
1. Rebalance过程详解
- 问题示例:"描述消费者组Rebalance触发的条件和完整流程?"
- 考点拆解:
-
- 阶段划分:JoinGroup → SyncGroup → Awaiting
- 协议版本:Eager rebalance vs Incremental Cooperative rebalance区别
- 源码定位:
ConsumerCoordinator.poll()
中的状态机转换
2. 位移提交的精确语义
- 问题示例:"如何实现至少一次(at-least-once)和精确一次(exactly-once)语义?"
- 标准答案:
-
- 至少一次:先处理消息后同步提交位移
- 精确一次:启用事务生产者+
isolation.level=read_committed
3. 消费者限速策略
- 问题示例:"如何控制消费者不拉取过量消息导致OOM?"
- 技术要点:
-
max.poll.records
控制单次poll数量- 结合
pause()/resume()
动态控制分区拉取 - 使用
ConsumerRebalanceListener
实现背压
4. 跨机房消费设计
- 问题示例:"如何设计多机房消费者组保证地域亲和性?"
- 解决方案:
-
- 使用
client.rack
参数指定机架信息 - 配合Broker的
broker.rack
实现优先本地消费 - 源码验证:
NetworkClient.handleCompletedReceives()
中的元数据校验
- 使用