订单事件有多个消费者实例,Kafka 如何分配分区?扩容后为什么可能没有效果?
我的判断
同一消费组内一个分区同一时刻只交给一个消费者实例,所以有效并行度上限是分区数,扩容超过分区数不会增加吞吐。
订单 Topic 假设有 12 个分区、同一组 4 个实例,协调器会让每个实例大约消费 3 个分区。扩到 12 个可以提升并行度;扩到 20 个,仍有 8 个实例空闲。不同消费组互不影响,风控和通知可以各自完整消费同一批订单事件。
扩缩容、实例超时或分区变化会触发 rebalance。我们会使用 cooperative sticky 分配,减少不必要的全量撤销;消费处理过长时调大 max.poll.interval.ms 不是唯一办法,更重要的是把单批大小、处理耗时和 poll 节奏控制住。
如果扩容后没效果,我会看:分区是否已经一实例一个、lag 是否集中在某几个分区、消费者是在 CPU 忙还是等数据库/下游、单批处理是否串行。热点订单键造成分区倾斜时,加实例也救不了那个单分区。
最终容量按最慢分区规划,不只看全 Topic 平均 lag。