加载中...
竞争消费者模式让多个消费者实例共同从同一消息队列取消息,每条消息只被其中一个实例处理,从而实现负载分摊与水平扩展。它是消息驱动系统提升吞吐、削峰填谷的基本手段,要求消息处理具备幂等性。

| 英文名 | Competing Consumers |
| 出处 | 《企业集成模式》 |
| 核心机制 | 共享队列、竞争领取 |
| 典型实现 | RabbitMQ、Kafka 消费者组 |
| 前提要求 | 消费幂等 |
竞争消费者模式(Competing Consumers Pattern)是一种消息处理设计模式:多个消费者实例同时监听同一个消息队列,彼此竞争地领取消息,每条消息只交给其中一个实例处理。生产者只管投递,处理能力则通过增减消费者实例数量水平伸缩。
该模式收录于经典著作《企业集成模式》(Enterprise Integration Patterns,格雷戈尔·霍普与鲍比·伍尔夫著),也是微软 Azure 架构中心整理的云设计模式之一。它与发布-订阅模式互补:发布-订阅让每个订阅者都收到消息副本,用于广播;竞争消费者让一组实例分摊同一批消息,用于扩容。RabbitMQ 的多消费者共享队列、Kafka 消费者组内按分区分配、SQS 的多实例拉取都是典型落地。
竞争消费者适合可异步、可并行、量大的任务:订单后续处理、邮件与短信发送、图片转码、日志入库等。配合队列长度指标还能实现自动扩缩容,队列积压时自动加实例,空闲时缩容省钱,这正是削峰填谷的经典实现。
问:为什么要求消息处理幂等?答:因为队列通常保证至少一次投递,网络抖动或消费者崩溃会导致同一消息被重复处理;只有处理逻辑幂等(重复执行结果不变),系统才是正确的。
问:消息顺序还能保证吗?答:多个实例并行消费必然打乱全局顺序。若业务要求某类消息有序,可按业务键把消息路由到固定分区,仅在分区内保持顺序,如 Kafka 的做法。

| 英文名 | Competing Consumers |
| 出处 | 《企业集成模式》 |
| 核心机制 | 共享队列、竞争领取 |
| 典型实现 | RabbitMQ、Kafka 消费者组 |
| 前提要求 | 消费幂等 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧