先说结论

同一个消费者组内,一个分区在同一时刻只会分配给一个消费者;增加消费者数量可以提高并行度,但超过分区数的消费者会处于空闲状态。

分区与并行度

Kafka 在分区内部保证消息顺序,不保证不同分区之间的全局顺序。需要相同业务键有序时,应使用稳定的 key,让相关消息进入同一分区。

消费位点

消费者处理完成后提交 offset,表示下一条要消费的位置。自动提交配置简单,但可能在业务尚未处理完成时提交;手动提交更可控,但必须处理好提交时机和异常。

为什么会重复消费?

消费者完成业务操作后,在提交 offset 前宕机,重启后会再次读取同一条消息。Kafka 常见语义是至少一次,因此消费者应使用业务唯一键、状态机或去重表实现幂等。

再均衡

消费者加入、离开,分区数变化或心跳超时可能触发再均衡。再均衡期间分区会重新分配,频繁发生会造成消费暂停。应合理配置处理时间、心跳和批量拉取参数。

参考资料

位点提交的正确边界

先提交后处理,崩溃时可能丢业务结果;处理后提交,提交失败会再次消费。因此通常关闭自动提交,在业务成功后提交,并通过唯一键、消息 ID 或状态机实现幂等。批量处理时应按分区记录连续成功的最大位点,不能越过失败消息。

常见问题

追问 1:消费者越多吞吐越高吗?

不是。并行度受分区数限制;无限增加分区还会增加元数据、文件句柄和再均衡成本。

追问 2:如何保证同一订单消息有序?

以订单 ID 作为稳定分区键,让同一订单进入同一分区,并在消费端按分区顺序处理。Kafka 不保证跨分区全局有序。

追问 3:消费积压怎么排查?

先确认 Lag 是否持续增长,再检查生产突增、消费者报错、单条处理慢、分区倾斜、活跃消费者数和下游依赖,不应只靠盲目扩容。