知识卡片

消费者组避免同一事件被重复处理

专业/工作 · 525.c

内容

标准发布订阅模型下,订阅同一个队列的所有消费者都会各收到一份消息副本——这在”不同应用各自关心同一事件”时是对的(派单服务和邮件服务都想知道订单被接受了),但如果同一个应用部署了多个副本(比如派单服务开了三个实例保证高可用),三个副本都收到同一条消息、都去执行一次派单逻辑,就会导致同一个订单被重复处理。消费者组的解法是把同一个应用的所有副本划进同一个组,组内所有消费者共享同一份订阅,一条消息只会被组里的某一个消费者拿到并处理,不同组之间才各自独立收到完整副本。发散:这条规则划定了一个很实用的心智模型——用应用名作为消费者组名,就自动获得了”同一个逻辑消费者的多个物理副本之间不会互相打架”这个保证,是水平扩展和事件驱动架构结合时几乎必须要有的一层保护,没有它,副本数量一多就直接触发重复处理的 bug。

参考来源

《Cloud Native Spring in Action》第10章《Event-driven applications and functions》