RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性
幂等性保障
幂等性(Idempotency) 是计算机科学和网络通信中的一个重要概念,指的是某个操作无论被执行多少次,所产生的效果与执行一次的效果相同。
应用程序的幂等性:
在应用程序中,幂等性就是指对一个系统进行重复调用(相同的参数),不论请求多少次,这些请求对系统的影响都是相同的结果。
比如数据库的 select
操作,不同时间两次查询的结果可能不同,但是这个操作是符合幂等性的,幂等性指的是对资源的影响,而不是返回结果。
查询操作对数据资源本身不会产生影响,之所以结果不同,可能是因为两次查询之间有其他操作对资源进行了修改。
比如 i++
操作,就是非幂等性的,如果调用方法没有控制好逻辑,一次流程重复调用好几次,结果就会不同。
MQ 幂等性:
对于 MQ 而言,幂等性就是指同一条消息,无论被消费者消费多少次,对系统的影响都是一样的。
一般消息中间件的消息传输保障分为三个层级:
- 最多一次(At most once):消息可能会丢失,但绝不会重发。
- 至少一次(At least once):消息绝不会丢失,但有可能会重复消费。
- 恰好一次(Exactly once):消息绝对不会丢失,也不会重复消费。
RabbitMQ 提供了 At most once
和 At least once
两种消息传输保障,但并不提供 Exactly once
保障,这是因为主流的消息队列中间件都没有提供这种保障。
在实际业务中,建议使用 最少一次
。最多一次
可能会导致因为网络问题、消费出现异常等等问题,导致消息丢失。
但是 最少一次
就会导致消息重发导致消息重复消费:
- 服务器发送给生产者的确认报文可能会因为网络等问题而丢失,导致生产者认为消息发送失败,然后重新发送消息给服务器。
- 消费者发送给服务器的确认报文也可能会因为网络等问题而丢失,导致服务器认为消息消费失败,然后发送给消息到消费者。
解决方案
全局唯一ID
- 为每条消息都分配一个标识符,比如
UUID
或者消息的唯一ID,总之保证其唯一性即可。 - 消费者收到该消息后,先判断该消息是否已经被消费过,如果消费过,则忽略该消息。
- 如果未消费过,则消费该消息,并将该消息的唯一 ID 记录到数据库或者缓存中,以便下次判断。(可以使用
Redis
的setnx
命令实现)
业务逻辑判断
在业务逻辑层面实现消息的幂等性。
顺序性保障
消息的顺序性是指消费者消费消息的顺序和生产者发送消息的顺序一致。
如果有多个生产者同时发送消息,是无法确定消息到达 RabbitMQ Broker 的前后顺序,也就无法保证消息的顺序性。
有以下几种情况可能会打破消息的顺序性:
- 多个消费者:但队列配置多个消费者时,消息可能会被不同的消费者并行处理,从而导致消息处理的顺序性无法保证。
- 网络波动或异常:由于网络等异常,导致消息被重发,从而导致消息的顺序性被打乱。
- 消息重试:如果消费者处理消息失败,则会将该消息重新放入队列,也就是消息重试,导致消息的顺序性被打乱。
- 消息路由问题:在复杂的路由场景中,消息可能会根据不同的路由键被分发到不同的队列,从而导致消息的顺序性被打乱。
- 死信队列:如果消费者处理消息失败,则会将该消息放入死信队列,导致消息的顺序性被打乱。
保障方案
顺序性保障分为两种:全局性顺序保障和局部性顺序保障。
全局性顺序保障是指在多个队列或多个消费者之间保证消息的顺序。
局部性顺序保障通常指的是在单个队列内部保证消息的顺序。
在实际开放中,全局性保障的实现较为复杂,RabbitMQ
作为一个分布式消息队列,保障的是高吞吐量和高可用性,而不是严格的顺序性保障,如果业务场景确实需要严格的顺序性保障,建议在应用层代码逻辑里作额外的处理。
常见的顺序性保障方案
- 单队列单消费者: 最简单的方法是使用单个队列,并由单个消费者进行处理。同一个队列中的消息是先进先出的,这是
RabbitMQ
来帮助我们保证的。 - 分区消费:单个消费者的吞吐太低了,当需要多个消费者以提高处理速度时,可以使用分区消费。把一个队列分割成多个分区,每个分区由一个消费者进行处理,以此来保持每个分区内消息的顺序性。
RabbitMQ
本身并不支持分区消费,需要业务逻辑去实现,或者借助Spring Cloud Stream
来实现。- 详细参考:Spring Cloud Stream RabbitMQ 分区消费
消息积压问题
消息积压是指在消息队列中,待处理的消息数量超过了消费者的处理能力,导致消费者处理不过来,消息堆积在队列中,积压的消息越来越多,最终导致消息队列的阻塞。
- 从生产者的维度看:消息生产过快,在流量高峰期,生产者以极高的速率发送消息,导致消息积压。
- 从消费者的维度看:消费者处理能力不足,消费者处理不过来,消息积压。
- 消费端业务逻辑复杂,耗时长。
- 消费端代码性能低下。
- 系统资源限制,如 CPU、内存、磁盘IO 等限制消费者处理消息的效率。
- 异常处理不当,消费者在处理消息时出现异常,导致消息无法被正确处理和确认。
- 网络问题
- RabbitMQ 服务器配置低下
解决方案
- 提高消费者的效率:
- 增加消费者实例数量,比如新增机器。
- 优化业务逻辑和性能
- 设置
prefetchCount
参数,限制每个消费者所能接收的消息数量,从而提高消费者的处理能力。 - 消息发生异常时,设置合理的重试策略,或者转入死信队列。
- 限制生产者的发送速度:
- 流量控制
- 限流
- 设置过期时间
- 资源与配置优化:
- 升级服务器硬件配置,提高 CPU、内存、磁盘IO 等资源的利用率。
- 优化 RabbitMQ 服务器配置,设置合理的配置。
相关文章:

RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性
幂等性保障 幂等性(Idempotency) 是计算机科学和网络通信中的一个重要概念,指的是某个操作无论被执行多少次,所产生的效果与执行一次的效果相同。 应用程序的幂等性: 在应用程序中,幂等性就是指对一个系统…...

java基础知识回顾1(可用于Java基础速通)考前,面试前均可用!
目录 一、初识java 二、基础语法 1.字面量 2.变量 3.关键字 4.标识符 声明:本文章根据黑马程序员b站教学视频做的笔记,可对应课程听,课程链接如下: 02、Java入门:初识Java_哔哩哔哩_bilibili 一、初识java Java是美国 sun 公…...

云原生CICD-Tekton入门到精通
文章目录 一、Tekton介绍二、Tekton组件介绍三、执行流程四、安装Tekton管道五、安装Tekton Dashboard六、安装Tekton Cli七、运行单Task八、运行流水线九、在流水线中使用secret十、taskSpec、taskRef、pipelineRef、pipelineSpec使用pipelineRef与taskRef结合使用(推荐)pipel…...
CMake跨平台编译生成:从理论到实战
一、引言 在当今软件开发中,跨平台开发已成为常态。无论是需要在Windows、Linux、macOS等多操作系统上运行,还是在不同的硬件架构(如x86、ARM等)间部署,跨平台编译生成都是一个无法回避的关键问题。CMake,…...
MCP 协议传输机制大变身:抛弃 SSE,投入 Streamable HTTP 的怀抱
在技术的江湖里,变革的浪潮总是一波接着一波。最近,模型上下文协议(MCP)的传输机制就搞出了大动静,决定和传统的服务器发送事件(SSE)说拜拜,转身拥抱 Streamable HTTP,这…...

opencv 图像的平移和旋转
warpAffine函数讲解,图片可自行下载,也可用自己的图片 原图im 平移im_shifted 旋转im_rotated # 图像仿射变换 # 步骤: 读取图像 -> 创建仿射变换矩阵 -> 仿射变换计算 # 平移变换矩阵:一种写法,直接写死 # 旋转变…...

IDEA2025版本使用Big Data Tools连接Linux上Hadoop的HDFS
目录 Windows的准备 1. 将与Linux上版本相同的hadoop压缩包解压到本地 编辑2.设置$HADOOP HOME环境变量指向:E:\hadoop-3.3.4 3.下载hadoop.dll和winutils.exe文件 4.将hadoop.dll和winutils.exe放入$HADOOP HOME/bin中 IDEA中操作 1.下载Big Data Tools插件 2.添加并连…...

hysAnalyser特色的TS流编辑、剪辑和转存MP4功能说明
摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具,融合了常规TS文件的剪辑,转存功能,可用于平常的视频开发和测试。 本文详细阐述了对MPEG-TS 流的节目ID,名称,PID,时间戳,流类型ÿ…...
Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和
Day125 | 灵神 | 二叉树 | 二叉树中的第K大层和 2583.二叉树中的第K大层和 2583. 二叉树中的第 K 大层和 - 力扣(LeetCode) 思路: 把每层的结果都放到一个vector数组里面,然后排序这个vector数组,返回第K大的元素即…...

Google机器学习实践指南(学习速率篇)
🔥Google机器学习核心概念精讲(学习速率) Google机器学习实战(7)-5分钟掌握学习速率。 学习速率:模型训练的关键超参数 学习速率是指在训练模型时用于梯度下降的一个标量。在每次迭代期间,梯度下降法都会将学习速率…...
JS实现直接下载PDF文件
pdf文件通过a标签直接下载会打开页面,所以,请求该文件的blob文件流数据,再通过window.URL.createObjectURL转成链接,就可以直接下载了。 只需要替换url和文件名称就行,文件名的后缀记得要写上pdf,不然会变成…...

使用KubeKey快速部署k8s v1.31.8集群
实战环境涉及软件版本信息: 使用kubekey部署k8s 1. 操作系统基础配置 设置主机名、DNS解析、时钟同步、防火墙关闭、ssh免密登录等等系统基本设置 dnf install -y curl socat conntrack ebtables ipset ipvsadm 2. 安装部署 K8s 2.1 下载 KubeKey ###地址 https…...
FreeSWITCH 纯内网配置
纯内网,且同一个网段,Fs 可简化配置,要点是: 1. 不需要事先配置 directory,任意号码都可以注册,且无挑战 2. 呼叫无挑战 不需要考虑那么多安全问题 配置如下: 1. 全局变量 <X-PRE-PROCESS cmd"…...

leetcode hot100:十四、解题思路大全:真·大全!
因为某大厂的算法没有撕出来,怒而整理该贴。部分题目有python版本的AC代码。本贴耗时4天呜呜呜 1.哈希 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下…...

kali的简化安装
首先点击kali的官网 https://www.kali.org/get-kali/#kali-platforms 点击虚拟机版本 下载VMware版本的压缩包 解压后 点击 后缀名为 .vmx的文件 原始账号密码为 kali kali 这样安装 就不需要我们再去配置镜像 等等复杂操作了...
交换机的连接方式堆叠和级联
以下是交换机的堆叠和级联各自的优缺点总结,帮助快速对比选择: 一、堆叠(Stacking) 优点 高性能 堆叠链路带宽高(如10G/40G/100G),成员间数据通过背板直连,无带宽瓶颈。支…...

Vortex GPGPU的github流程跑通与功能模块波形探索(三)
文章目录 前言一、./build/ci下的文件结构二、基于驱动进行仿真过程牵扯的文件2.1 blackbox.sh文件2.2 demo文件2.3 额外牵扯到的ramulator2.3.1 ramulator简单介绍2.3.2 ramulator使用方法2.3.3 ramulator的输出2.3.4 ramulator的复现2.3.4.1 调试与验证(第 4.1 节…...
React深度解析:Hooks体系与Redux Toolkit现代状态管理实践
前言 React作为当今最流行的前端框架之一,其生态体系不断演进,为开发者提供了更高效、更优雅的解决方案。本文将深入探讨React的两大核心主题:Hooks体系(特别是useState和useEffect)以及Redux Toolkit现代状态管理方案…...

实用蓝牙耳机哪款好?先做好使用场景分析!
市面上的蓝牙耳机款式繁多,618到来之际,消费者如何选择适合自己的蓝牙耳机?实用蓝牙耳机哪款好?关键在于做好使用场景分析!今天,就带大家结合不同的使用场景,分享三款倍思音频的精品蓝牙耳机。 …...
Rules and Monetization
The system creates rules that allow them to monetize. The system doesn’t just enforce rules — it creates them strategically to monetize control. 🔧 How It Works: Invent a rule (e.g., “You need a permit to sell food.”)Claim it’s for safety …...

防火墙NAT地址组NAT策略安全策略
本文仅供学习交流,所涉及的知识技术产权归属华为技术有限公司所有!!! 本文仅供学习交流,所涉及的知识技术产权归属华为技术有限公司所有!!! 本文仅供学习交流,所涉及的…...
python开发环境管理和包管理
在 Python 开发中,环境管理 和 包管理 是两个非常重要的概念。它们帮助开发者: 这里写目录标题 一、什么是 Python 环境管理?二、什么是 Python 包管理?三、常见文件说明(用于包管理和环境配置)四、典型流程…...

Windows 使用 WSL 安装 Ubuntu
一,前言 Windows 上轻松跑 Linux 又不想用笨重的VMware 和VirtualBox ,怎么办? 开源项目 Windows Subsystem for Linux (WSL)。它解决了许多开发者在 Windows 和 Linux 间切换的痛点,实现在 Windows 上无缝跑 Linux 工具和命令。…...
.jsx文件和.tsx文件有什么区别
.tsx 和 .jsx 是两种用于 React 开发的 JavaScript 文件扩展名,它们的主要区别在于对 TypeScript 的支持以及使用场景。以下是详细对比: 定义 .jsx:是 JavaScript XML 的缩写,用于在 JavaScript 中编写类似 XML 的 JSX 语法&…...

第九天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 创造美好的代价是努力,失望以及毅力,首先是痛苦,然后才是欢乐。 时间是快的,看怎么利用,安排好一切事情,才能从容面对…...
每日算法 -【Swift 算法】寻找字符串中最长回文子串(三种经典解法全解析)
🧩 最长回文子串问题:三种经典解法全解析(含代码注释) 本文将系统讲解“最长回文子串”问题的三种常见解法:中心扩展法、动态规划、马拉车算法(Manacher’s Algorithm),并进行对比与…...
《Cesium全生态解析:从入门到精通的3D地理空间开发指南》
在WebGL、GIS和三维可视化技术高速发展的今天,Cesium 已经从一个开源地图引擎成长为全球开发者构建数字地球的核心工具。从地球到火星,从网页到游戏引擎,Cesium以其跨平台、高精度和无限扩展性,重新定义了我们对空间数据的交互方式…...
pytorch LSTM 结构详解
最近项目用到了LSTM ,但是对LSTM 的输入输出不是很理解,对此,我详细查找了lstm 的资料 import torch.nn as nnclass LSTMModel(nn.Module):def __init__(self, input_size1, hidden_size50, num_layers2):super(LSTMModel, self).__init__()…...

流程自动化引擎:重塑企业数字神经回路
在数字经济高速发展的今天,企业运营的核心逻辑正在经历一场静默的革命。流程自动化引擎作为这场变革的中枢神经系统,通过智能化的技术手段重构企业的业务逻辑与决策链路,将原本离散的“数字神经元”编织成高效协同的神经网络。这种技术不仅打…...

nginx web服务日志分析
特点: 实时分析:支持实时分析 Nginx 日志,无需预先存储大量日志数据,能即时反馈网站的访问情况。轻量级高效:资源占用少,运行速度快,适合处理高流量网站的日志分析。多种输出格式:除…...