news 2026/6/10 14:31:22

RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?

微服务架构模式中,服务间的通信一般采用HTTP、RPC或者MQ(消息队列)。在这三种方案中,HTTP和RPC是一对一的方式,通常用来进行查询或者命令式的操作,MQ则多用于事件的发布和处理。

在实际项目中我们通常会遇到一种情况:

事件有多个订阅者,有的订阅者部署多个实例,要求每个事件只需要发布一次,每个订阅者都要能收到且仅能有其中一个实例收到并进行处理。

简单说就是既要所有订阅者都能收到消息,又要保证每个订阅者只能消费一次,不能重复消费。那么在使用RabbitMQ作为消息中间件时应该如何处理这个问题?

需求

微服务架构下使用RabbitMQ作为服务总线中间件,有这样一种场景,订单服务在用户提交订单后会发送OrderCreatedEvent事件,需要接收此事件的服务有以下几个:
1、日志服务(单点部署);
2、消息系统,给用户发送短信、邮件(单点部署);
3、仓储系统,接收通知备货,扣减库存等(多实例,有负载均衡),同一条消息仅允许一个实例消费;
4、财务系统,记录收入流水(多实例,有负载均衡),同一条消息仅允许一个实例消费;
5、BI系统,做销售统计等;

问题

OrderCreatedEvent发出后,5个服务均可以接收到消息并进行处理,但是仓储和财务部署了多个实例,也就意味着每个实例都能收到相同的消息,这种情况下如何避免重复消费?

方案

  1. /* by 01130.hk - online tools website : 01130.hk/zh/barcode.html */ OrderCreatedEvent事件建立一个/* by 01130.hk - online tools website : 01130.hk/zh/barcode.html */ fanout exchange

  2. 每个需要处理OrderCreatedEvent的订阅者单独建立一个queue,订阅者的所有实例都消费这一个queue的消息。

  3. 将所有OrderCreatedEvent订阅者的queue都bind到第一步建立的exchange上。

  4. 事件发布者将OrderCreatedEvent消息发布到exchange,由exchange将消息路由到对应的queue,最后由queue锁定一个消费者实例并进行投递。

以下是示意图

graph LR Producer((订单服务)) Exchange{{OrderCreatedEvent交换机(fanout exchange)}} QueueA@{shape: subproc, label: 日志系统队列} QueueB@{shape: subproc, label: 消息系统队列} QueueC@{shape: subproc, label: 仓储系统队列} ConsumerA1([日志系统实例]) ConsumerB1([消息系统实例]) ConsumerC1([仓储系统实例1]) ConsumerC2([仓储系统实例2]) ConsumerC3([仓储系统实例3]) style Producer fill:#003d5b,color:white,stroke:#003d5b style Exchange fill:black,color:white,stroke:black style QueueA fill:#926c15,color:white,stroke:white style QueueB fill:#926c15,color:white,stroke:white style QueueC fill:#926c15,color:white,stroke:white style ConsumerA1 fill:#606c38,color:white,stroke:white style ConsumerB1 fill:#606c38,color:white,stroke:white style ConsumerC1 fill:#666,color:white,stroke:white style ConsumerC2 fill:#606c38,color:white,stroke:white style ConsumerC3 fill:#666,color:white,stroke:white Producer --发布---> Exchange Exchange --绑定---> QueueA --消费---> ConsumerA1 Exchange --绑定---> QueueB --消费---> ConsumerB1 Exchange --绑定---> QueueC QueueC --消费---> ConsumerC1 QueueC --消费---> ConsumerC2 QueueC --消费---> ConsumerC3

四种主要 Exchange 类型

RabbitMQ主要有四种核心的Exchange类型:Fanout(广播)、Direct(精确匹配)、Topic(模式匹配)和Headers(按头匹配),它们决定了消息如何从交换机路由到队列,其中Direct、Topic、Fanout最常用,而Headers和一些插件类型(如x-delayed-message)提供更灵活的路由功能。

  1. Fanout (扇出)

    • 特点:将消息广播到所有绑定到它的队列。
    • 路由规则:忽略路由键 (Routing Key)。
    • 场景:适用于日志系统、通知广播等需要消息分发到多个消费者的场景。
  2. Direct (直连)

    • 特点:消息根据与队列绑定的精确路由键来路由。
    • 路由规则消息的 Routing Key必须完全匹配队列绑定的 Routing Key
    • 场景:一个消费者处理特定类型的任务,如处理“用户注册”消息。
  3. Topic (主题)

    • 特点:使用通配符(*匹配一个词,#匹配零个或多个词)进行模式匹配路由。
    • 路由规则消息的 Routing Key模式需要与队列绑定的模式匹配。
    • 场景:日志级别过滤,如logs.info.*匹配所有 info 级别的日志,logs.#匹配所有日志.
  4. Headers (头部)

    • 特点:根据消息的 Headers 属性(键值对)进行路由,而不是 Routing Key。
    • 路由规则:匹配消息 Headers 中的键值对与绑定时设置的键值对。
    • 场景:当需要根据复杂属性匹配时,较少使用,因为性能不如前三者。

Demo

后面我将会提供以上方案的具体实现,包含Java.net两种版本。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:19:26

2024-2025阶段感悟

一、核心理念体系:心想事成 心学 基因 易经 你提出了一套以“心”为本、贯通中西、融合科学与灵性的成功/疗愈/创造模型,其底层逻辑可概括为:心之所向 → 潜意识重塑 → 能量聚焦 → 现实显化 这一过程,既是吸引力法则的实践&a…

作者头像 李华
网站建设 2026/6/9 19:47:03

GEO优化实战指南:如何让品牌在AI搜索中被优先引用

在GEO优化时代,搜索引擎不再只是提供一串蓝色链接等待用户点击,而是直接在搜索结果页面展示完整答案。这种行为被称为“零点击搜索”,意味着用户无需进入网站即可获取信息,这对内容曝光与商业转化提出了新挑战。传统SEO以关键词排…

作者头像 李华
网站建设 2026/6/10 10:55:27

FPGA在AI时代的角色重塑:硬件可重构性与异构计算的完美结合

引言:当摩尔定律放缓,架构创新登场截至2025年,半导体行业已普遍接受一个不可逆的事实:晶体管微缩带来的性能红利正在枯竭。台积电3nm工艺的每晶体管成本不降反升,而2nm以下制程面临量子隧穿、原子级制造等物理极限。国…

作者头像 李华
网站建设 2026/6/10 10:50:33

这6个工具,让你的Linux监控如鱼得水,运维效率翻倍!

今天想和大家分享一下我在日常运维工作中最常用的6个Linux系统监控工具。这些工具涵盖了命令行TUI(文本用户界面)和图形化GUI两种类型,能帮助我们快速定位性能瓶颈、监控资源使用、甚至直接管理进程。在服务器环境尤其是SSH远程接入时,命令行工具是首选,而在桌面或本地调试…

作者头像 李华
网站建设 2026/6/10 10:58:16

AI智能体 - A2A协议

打破孤岛:Google A2A 协议——构建下一代多智能体协作系统的基石 在 AI 智能体(AI Agents)飞速发展的今天,我们拥有了基于 LangGraph、CrewAI、Google ADK 等不同框架构建的强大智能体。然而,这些“超级大脑”往往各自…

作者头像 李华
网站建设 2026/6/10 10:51:39

突破与变革:2026年AI领域的技术创新与新机会

人工智能(AI)在过去的十年里已经从一种实验性技术变成了各行各业的核心动力之一。如今,随着AI技术的迅猛发展,2026年将是一个充满变革的时代。在这一年,AI不仅将在技术上取得突破,还将在多个领域催生新的商…

作者头像 李华