Rabbitmq Direct Exchange(直连交换机)可以保证消费不被重复消费吗,可以多个消费者,但是需要保证同一个消息,不会被投递给多个消费者

在 RabbitMQ 中,默认情况下,不能保证消息不被重复消费,但可以通过 队列绑定方式 + 消费者竞争机制 来确保 同一消息只被一个消费者处理。以下是几种可行的方案:


方案 1:单队列 + 竞争消费者模式(默认行为)

原理

  • 多个消费者订阅同一个队列,RabbitMQ 会以 轮询(Round-Robin) 方式分发消息。

  • 天然保证同一消息只被一个消费者消费(因为队列里的消息被取出后就不再存在)。

代码示例

python

# 生产者发送消息到队列
channel.basic_publish(exchange="",routing_key="single_queue",  # 直连队列(不经过 Exchange)body="message1"
)# 消费者1和消费者2竞争消费同一个队列
channel.basic_consume(queue="single_queue", on_message_callback=consumer1)
channel.basic_consume(queue="single_queue", on_message_callback=consumer2)

✅ 结果

  • message1 只会被 consumer1  consumer2 中的一个消费,不会重复。

适用场景

  • 需要 多个消费者并行处理不同消息,但 同一消息只需处理一次

  • 注意:如果消费者处理失败并 requeue,消息可能被重新投递(需额外处理,见方案3)。


方案 2:单活跃消费者(Single Active Consumer)

原理

  • RabbitMQ 3.8+ 支持 单活跃消费者模式,同一队列同一时间只有一个消费者能接收消息。

  • 其他消费者处于备份状态,主消费者断开后自动切换。

配置方式

python

channel.queue_declare(queue="sac_queue",arguments={"x-single-active-consumer": True}  # 启用单活跃消费者
)

✅ 结果

  • 即使多个消费者订阅 sac_queue,也 只有1个消费者能获取消息

适用场景

  • 需要 严格串行处理消息(如订单状态机变更)。

  • 缺点:无法利用多消费者并行提升吞吐量。


方案 3:业务幂等性(最佳实践)

原理

  • 允许消息被多次投递,但业务逻辑保证 重复消费不影响结果

  • 实现方式:

    • 数据库唯一约束(如 order_id 防重复)。

    • 乐观锁(更新前检查 version 字段)。

    • Redis 记录已处理消息ID(如 SET message_id 1 EX 3600)。

代码示例

python

def process_order(message):order_id = message.body.order_idif redis.get(f"processed:{order_id}"):  # 检查是否已处理return# 处理业务逻辑...redis.set(f"processed:{order_id}", "1", ex=3600)  # 标记已处理

✅ 优点

  • 高可用,可扩展多个消费者。

  • 兼容 RabbitMQ 默认的轮询分发机制。

适用场景

  • 高并发场景(如支付回调、库存扣减)。


方案 4:分布式锁(严格一致性)

原理

  • 消费者处理消息前,先获取 分布式锁(Redis / ZooKeeper)。

  • 确保同一时间只有一个消费者能处理消息。

代码示例

python

def callback(message):lock_key = f"lock:{message.body.order_id}"if redis.set(lock_key, "1", nx=True, ex=10):  # 尝试加锁try:process_message(message)finally:redis.delete(lock_key)  # 释放锁else:channel.reject(message.delivery_tag, requeue=True)  # 重新入队

✅ 结果

  • 同一 order_id 的消息 只会被一个消费者处理

适用场景

  • 严格避免重复消费(如金融交易)。


对比总结

方案是否严格唯一消费扩展性实现复杂度适用场景
单队列+竞争消费者✅ 是★★★默认场景,需防止 requeue
单活跃消费者✅ 是★★严格串行处理
业务幂等性❌ 否(业务防重)★★★★★★高并发系统(推荐)
分布式锁✅ 是★★★★★★金融级严格一致性

最终建议

  1. 优先使用业务幂等性(方案3),兼容高并发和故障恢复。

  2. 如果需要严格单消费者:

    • 低吞吐场景 → 单活跃消费者(方案2)。

    • 高吞吐场景 → 分布式锁(方案4)。

  3. 不要依赖 Direct Exchange 的 routing_key 来防重复,它只影响消息进入哪个队列,不影响队列内消息的分发方式。


🚀 关键结论
RabbitMQ 的 队列(Queue) 是保证消息只被一个消费者消费的关键,而不是 Exchange 类型。正确绑定队列和消费者,配合业务幂等或锁机制,即可避免重复消费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91557.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的OTP语音芯片有哪些?

唯创知音在 OTP 语音芯片有着26年的历史,有着丰富的技术积累与产品迭代历程。1999 年,唯创知音在广州成立,彼时便开始在电子领域积极探索。2000 年,公司敏锐捕捉到语音芯片行业的发展潜力,正式进军该领域。经过数年技术…

分布式光伏发电系统中的“四可”指的是什么?

在分布式光伏电站规模爆发式增长的今天,“看不见、管不住、调不动”的难题却成为行业痛点。如何让散布各处的光伏电站真正成为稳定高效的“绿色能量站”?2025年《分布式光伏发电开发建设管理办法》大型工商业项目(≥6MW)明确要求具…

健康管理系统新趋势:AI + 物联网如何重塑健康管理

一、传统健康管理的痛点与变革之必然长久以来,我们熟悉的健康管理方式存在明显局限:数据孤岛严重:体检报告在抽屉里沉睡,健身手环数据仅存于手机,不同医疗机构信息互不相通,个人健康信息犹如碎片散落各处。…

git基本操作【GIT-2】

git基本操作初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改如何配置 Git 来忽略指定的文件和文件模式、如何迅速而简单地撤销错误操作、如…

【数据准备】——深度学习.全连接神经网络

目录 1 数据加载器 1.1 构建数据类 1.1.1 Dataset类 1.1.2 TensorDataset类 1.2 数据加载器 2 数据加载案例 2.1 加载csv数据集 2.2 加载图片数据集 2.3 加载官方数据集 2.4 pytorch实现线性回归 1 数据加载器 分数据集和加载器2个步骤~ 1.1 构建数据类 1.1.1 Dat…

健康生活,从细节开始

健康生活,从细节开始在当今快节奏的生活中,健康逐渐成为人们关注的焦点。拥有健康的身体,才能更好地享受生活、追求梦想。那么,如何才能拥有健康呢?这就需要我们从生活中的点滴细节入手,培养良好的生活习惯…

javax.servlet.http.HttpServletResponse;API导入报错解决方案

javax.servlet.http.HttpServletResponse;API导入报错解决方案与Postman上传下载文件验证 1. 主要错误:缺少 Servlet API 依赖 错误信息显示 javax.servlet.http 包不存在。这是因为你的项目缺少 Servlet API 依赖。 解决方案: 如果你使用的是 Maven&…

reids依赖删除,但springboot仍然需要redis参数才能启动

背景:项目需要删除redis。我删除完项目所有配置redis的依赖,启动报错。[2025-07-17 15:08:37:561] [DEBUG] [restartedMain] DEBUG _.s.w.s.H.Mappings - [detectHandlerMethods,295] [] - o.s.b.a.w.s.e.BasicErrorController:{ [/error]}: error(HttpS…

【前端】CSS类命名规范指南

在 CSS 中,合理且规范的 class 命名格式对项目的可维护性和协作效率至关重要。以下是主流的 class 命名规范和方法论:一、核心命名原则语义化命名:描述功能而非样式 ✅ .search-form(描述功能)❌ .red-text&#xff08…

C++网络编程 4.UDP套接字(socket)编程示例程序

以下是基于UDP协议的完整客户端和服务器代码。UDP与TCP的核心区别在于无连接特性&#xff0c;因此代码结构会更简单&#xff08;无需监听和接受连接&#xff09;。 UDP服务器代码&#xff08;udp_server.cpp&#xff09; #include <iostream> #include <sys/socket.h&…

King’s LIMS:实验室数字化转型的智能高效之选

实验室数字化转型不仅是技术升级&#xff0c;更是管理理念和工作方式的革新。LIMS系统作为这一转型的核心工具&#xff0c;能够将分散的实验数据转化为可分析、可复用的资产&#xff0c;为科研决策提供支持&#xff1b;规范检测流程&#xff0c;减少人为干预&#xff0c;确保结…

【力扣 中等 C】97. 交错字符串

目录 题目 解法一 题目 待添加 解法一 bool isInterleave(char* s1, char* s2, char* s3) {const int len1 strlen(s1);const int len2 strlen(s2);const int len3 strlen(s3);if (len1 len2 ! len3) {return false;}if (len1 < len2) {return isInterleave(s2, s1,…

Class9简洁实现

Class9简洁实现 %matplotlib inline import torch from torch import nn from d2l import torch as d2l# 初始化训练样本、测试样本、样本特征维度和批量大小 n_train,n_test,num_inputs,batch_size 20,100,200,5 # 设置真实权重和偏置 true_w,true_b torch.ones((num_inputs…

ELK日志分析,涉及logstash、elasticsearch、kibana等多方面应用,必看!

目录 ELK日志分析 1、下载lrzsc 2、下载源包 3、解压文件,下载elasticsearch、kibana、 logstash 4、配置elasticsearch 5、配种域名解析 6、配置kibana 7、配置logstash 8、进行测试 ELK日志分析 1、下载lrzsc [rootlocalhost ~]# hostnamectl set-hostname elk ##…

终极剖析HashMap:数据结构、哈希冲突与解决方案全解

文章目录 引言 一、HashMap底层数据结构&#xff1a;三维存储架构 1. 核心存储层&#xff08;硬件优化设计&#xff09; 2. 内存布局对比 二、哈希冲突的本质与数学原理 1. 冲突产生的必然性 2. 冲突概率公式 三、哈希冲突解决方案全景图 1. 链地址法&#xff08;Hash…

1.1.5 模块与包——AI教你学Django

1.1.5 模块与包&#xff08;Django 基础学习细节&#xff09; 模块和包是 Python 项目组织和代码复用的基础。Django 项目本质上就是由多个模块和包组成。理解和灵活运用模块与包机制&#xff0c;是写好大型项目的关键。 一、import、from-import、as 的用法 1. import 用于导入…

UE5 相机后处理材质与动态参数修改

一、完整实现流程1. 创建后处理材质材质设置&#xff1a;在材质编辑器中&#xff0c;将材质域(Material Domain)设为后处理(Post Process)设置混合位置(Blendable Location)&#xff08;如After Tonemapping&#xff09;创建标量/向量参数&#xff08;如Intensity, ColorTint&a…

Django基础(三)———模板

前言 在之前的文章中&#xff0c;视图函数只是直接返回文本&#xff0c;而在实际生产环境中其实很少这样用&#xff0c;因为实际的页面大多是带有样式的HTML代码&#xff0c;这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多的模板系统&#xff0c;其中最知名最好用的…

mysql6表清理跟回收空间

mysql6表清理跟回收空间 文章目录mysql6表清理跟回收空间1.清理表2.备份表或者备份库3.回收表空间4.查看5.验证业务1.清理表 ## 登录 C:\Program Files\MySQL\MySQL Server 5.6\bin>mysql -uroot -p Enter password: ****** Welcome to the MySQL monitor. Commands end w…

Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-30-新发布【1T 万亿】参数量大模型&#xff01;K…