先说结论
同一个消费者组内,一个分区在同一时刻只会分配给一个消费者;增加消费者数量可以提高并行度,但超过分区数的消费者会处于空闲状态。
分区与并行度
Kafka 在分区内部保证消息顺序,不保证不同分区之间的全局顺序。需要相同业务键有序时,应使用稳定的 key,让相关消息进入同一分区。
消费位点
消费者处理完成后提交 offset,表示下一条要消费的位置。自动提交配置简单,但可能在业务尚未处理完成时提交;手动提交更可控,但必须处理好提交时机和异常。
为什么会重复消费?
消费者完成业务操作后,在提交 offset 前宕机,重启后会再次读取同一条消息。Kafka 常见语义是至少一次,因此消费者应使用业务唯一键、状态机或去重表实现幂等。
再均衡
消费者加入、离开,分区数变化或心跳超时可能触发再均衡。再均衡期间分区会重新分配,频繁发生会造成消费暂停。应合理配置处理时间、心跳和批量拉取参数。
参考资料
位点提交的正确边界
先提交后处理,崩溃时可能丢业务结果;处理后提交,提交失败会再次消费。因此通常关闭自动提交,在业务成功后提交,并通过唯一键、消息 ID 或状态机实现幂等。批量处理时应按分区记录连续成功的最大位点,不能越过失败消息。
常见问题
追问 1:消费者越多吞吐越高吗?
不是。并行度受分区数限制;无限增加分区还会增加元数据、文件句柄和再均衡成本。
追问 2:如何保证同一订单消息有序?
以订单 ID 作为稳定分区键,让同一订单进入同一分区,并在消费端按分区顺序处理。Kafka 不保证跨分区全局有序。
追问 3:消费积压怎么排查?
先确认 Lag 是否持续增长,再检查生产突增、消费者报错、单条处理慢、分区倾斜、活跃消费者数和下游依赖,不应只靠盲目扩容。