消息队列消费者组
Consumer Group 是什么?
一组消费者分摊分区,组内一条消息只被处理一次
类比:同一个部门的同事轮流处理工单,一件工单只归一个人
它解决什么问题
单消费者处理不过来,就加人。但加人不能导致一条消息被处理两次——消费者组用「分区分配」解决这件事:一个分区同时只属于组内一个消费者。
不同消费者组之间互不影响,各自维护自己的 offset。这就是「一条消息可以被多个系统各消费一次」的实现方式。
Rebalance 的代价
组内成员增减、订阅的 Topic 变化、分区数变化,都会触发 Rebalance:所有消费者暂停消费、重新分配分区。
期间会出现消费停顿,甚至重复消费。所以要用静态成员(static membership)、合理的 session.timeout,避免频繁上下线。
- 消费者数 ≤ 分区数,多出来的会空闲
- 分区分配策略:Range、RoundRobin、Sticky、CooperativeSticky
- RocketMQ 对应概念叫 ConsumerGroup + 集群/广播模式