【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践:
一、消息唯一标识符 (Message Deduplication)
-
原理
- 每条消息携带全局唯一ID(如 UUID、Snowflake ID)
- 消费者维护已处理消息ID的存储(Redis/DB)
-
实现步骤
// 生产者端 MessageProperties props = new MessageProperties(); props.setMessageId(UUID.randomUUID().toString()); Message message = new Message(body.getBytes(), props);// 消费者端 @RabbitListener(queues = "order_queue") public void process(Message message) {String msgId = message.getMessageProperties().getMessageId();if (redis.setnx(msgId, "processed") == 1) {// 处理业务逻辑// 成功后设置过期时间防止存储膨胀redis.expire(msgId, 72 * 3600); } else {// 幂等拦截} }
二、版本号控制 (Optimistic Concurrency Control)
-
适用场景
数据更新类操作(如账户余额修改) -
实现方案
-- 消息体包含数据版本号 UPDATE account SET balance = new_balance, version = version + 1 WHERE id = 123 AND version = current_version;
三、状态机驱动 (State Machine)
-
应用场景
订单状态流转(创建→支付→发货) -
实现示例
public void handleOrderMessage(OrderMessage msg) {Order order = orderDao.get(msg.getOrderId());if (order.getStatus() != msg.getExpectedStatus()) {log.warn("状态不匹配,当前状态:{}", order.getStatus());return;}// 执行状态变更逻辑 }
四、业务唯一键约束
- 实现方式
CREATE TABLE payment_records (id BIGINT PRIMARY KEY,order_no VARCHAR(64) UNIQUE, -- 业务唯一键amount DECIMAL(10,2) );-- 插入时捕获唯一键冲突 try {insertPaymentRecord(); } catch (DuplicateKeyException e) {// 幂等处理 }
五、消息确认策略优化
-
关键配置
spring:rabbitmq:listener:simple:acknowledge-mode: manual # 手动ACKretry:enabled: truemax-attempts: 3 # 最大重试次数 -
处理逻辑
@RabbitListener(queues = "critical_queue") public void process(Message message, Channel channel) throws IOException {try {// 业务处理channel.basicAck(tag, false);} catch (Exception e) {channel.basicNack(tag, false, false); // 直接进入死信队列} }
六、分布式锁机制
- Redis 分布式锁示例
public void processWithLock(Message msg) {String lockKey = "msg_lock:" + msg.getId();try {if (redisLock.tryLock(lockKey, 30)) {// 真正的业务处理}} finally {redisLock.unlock(lockKey);} }
七、时序控制 (Timestamp Validation)
- 实现逻辑
if (message.getEventTime() < lastProcessedTime.get()) {log.info("丢弃过期消息,事件时间:{}", message.getEventTime());return; }
八、消息轨迹追踪表
-
设计表结构
CREATE TABLE message_log (message_id VARCHAR(64) PRIMARY KEY,status ENUM('PROCESSING','SUCCESS','FAILED'),processed_time DATETIME,retry_count INT DEFAULT 0 ); -
处理流程
// 开启事务 beginTransaction(); try {// 1. 插入消息记录insertMessageLog(msgId, "PROCESSING");// 2. 执行业务操作processBusinessLogic();// 3. 更新状态updateMessageStatus(msgId, "SUCCESS");commit(); } catch (Exception e) {rollback(); }
最佳实践组合建议
-
金融交易场景
唯一ID + 版本号控制 + 数据库唯一约束 + 分布式锁 -
电商订单场景
状态机 + 业务唯一键 + 消息轨迹表 -
日志处理场景
时序验证 + Redis去重 + 自动重试策略
注意事项
-
存储选择权衡
- Redis: 高性能但存在数据丢失风险
- 数据库: 可靠性高但性能较低
- 建议:关键业务使用DB+缓存双写
-
清理策略
- 设置合理的TTL(例如72小时)
- 定时任务清理已处理记录
-
性能优化
- 使用Bloom Filter减少内存消耗
- 批量查询优化(如一次查询1000个ID是否存在)
通过以上方案组合,可在不同业务场景中实现可靠的幂等处理,建议根据实际业务压力和数据一致性要求选择合适的实现层级。
相关文章:
【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践: 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一IDÿ…...
flutter在安卓模拟器上运行
目录 下载android studio,然后把其中的模拟器设为环境变量,然后在vscode/cursor中使用插件,打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
与本地电脑PDF文档对话的PDF问答程序
文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时,了解LangChain框架的理论知识固然重要,但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作,你可…...
QT之改变鼠标样式
QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标,…...
后端开发:开启技术世界的新大门
在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...
Sun-Panel:简洁且美观的导航首页开源项目!!
在这个数字化飞速发展的时代,我们几乎每个人都拥有自己的服务器或者NAS。但问题来了,管理这些设备往往需要记住一大堆复杂的命令和界面,对于像了不起这样追求简洁生活的程序员来说,简直是噩梦! 今天介绍一款界面清爽&…...
第4章 信息系统架构(四)
4.6 网络架构 网络是信息技术架构中的基础,不仅是用户请求和获取IT信息资源服务的通道,同时也是 信息系统架构中各类资源融合和调度的枢纽。特别是云计算、大数据和移动互联网技术飞速发 展的今天,网络更加成为实现这些技术跨越的重要环节。…...
【Java八股文】07-Redis面试篇
【Java八股文】07-Redis面试篇 Redis面试篇认识redis为什么用 Redis 作为 MySQL 的缓存? 数据结构讲一下Redis底层的数据结构ZSet底层是由什么实现的 线程模型Redis 是单线程吗?Redis怎么进行I/O多路复用的?Redis 采用单线程为什么还这么快&a…...
Windows PyCharm的python项目移动存储位置后需要做的变更
项目使用的venv虚拟环境,因此项目移动存储位置后需要重新配置python解释器的位置,否则无法识别,若非虚拟环境中运行,则直接移动后打开即可,无需任何配置。 PyCharm版本为2021.3.3 (Professional Edition),其…...
微信小程序消息推送解密
package com.test.main.b2b;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Arrays;/*** author * version 1.0* description: 解谜微信小…...
《道德经的现代智慧:解码生活与商业的底层逻辑2》
第二章:人际互动的智慧 🤝 引言:现代人际关系的困境 🌟 时代背景:超连接时代的人际迷思 🌐 在这个前所未有的超连接时代,我们似乎比任何时候都更"在线"、更"联系"&#…...
通过监督微调提升多语言大语言模型性能
引言 澳鹏助力一家全球科技公司提升其大语言模型(LLM)的性能。通过提供结构化的人工反馈形式的大语言模型训练数据,让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话,并依据回复的相关性、连贯性、准确…...
用deepseek学大模型05逻辑回归
deepseek.com:逻辑回归的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点,及如何改进解决及改进方法数据推导。…...
图解循环神经网络(RNN)
目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同,…...
vue文件没有name属性怎么被调用
如果你在 index.vue 文件中定义了一个组件,但没有在组件定义中使用 name 属性,你仍然可以通过几种方式来引用和使用这个组件。 1. 使用局部注册 在父组件中直接导入并注册 index.vue 中的组件(index.vue没有name属性)࿰…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-build.py
build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...
alt+tab切换导致linux桌面卡死的急救方案
环境 debian12 gnome43.9 解决办法 观察状态栏,其实系统是没有完全死机的,而且gnome也可能没有完全死机。 1. alt f4 关闭桌面上的程序,因为这个方案是我刚刚看到的,所以不确定能不能用,比起重启系统,…...
Spark(2)linux和简单命令
(一)Linux的文件系统 文件系统:操作系统中负责管理和存储文件信息的软件结构称为文件管理系统。 文件系统的结构通常叫做目录树结构,从斜杆/根目录开始; Linux号称万物皆文件,意味着针对Linux的操作,大多…...
如何在Windows下使用Ollama本地部署DeepSeek R1
参考链接: 通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细) 【DeepSeek应用】DeepSeek R1 本地部署(OllamaDockerOpenWebUI) 如何将 Chatbox 连接到远程 Ollama 服务:逐步指南 首先需要安装oll…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
