【RabbitMQ】幂等性保障 顺序性保障 消息积压问题

文章目录

  • Ⅰ. 幂等性保障
    • 一、幂等性介绍
      • ① 应用程序的幂等性介绍
      • ② MQ的幂等性介绍
    • 二、解决方案
      • ① 全局唯一ID
      • ② 业务逻辑判断
  • Ⅱ. 顺序性保障
    • 一、顺序性保障介绍
    • 二、顺序性保障方案
  • Ⅲ. 消息积压问题
    • 一、原因分析
    • 二、解决方案

Ⅰ. 幂等性保障

一、幂等性介绍

幂等性是数学和计算机科学中某些运算的性质,它们可以被多次应用,而不会改变初始应用的结果

① 应用程序的幂等性介绍

在应用程序中,幂等性就是指对一个系统进行重复调用(相同参数),不论请求多少次,这些请求对系统的影响都是相同的效果。

比如数据库的select操作。不同时间两次查询的结果可能不同,但是这个操作是符合幂等性的。幂等性指的是对资源的影响,而不是返回结果。查询操作对数据资源本身不会产生影响,之所以结果不同,可能是因为两次查询之间有其他操作对资源进行了修改。

比如i++这个操作,就是非幂等性的。如果调用方没有控制好逻辑,一次流程重复调用好几次,结果就会不同。

② MQ的幂等性介绍

对于 MQ 而言,幂等性是指对同一条消息进行多次消费,对系统的影响是相同的

一般消息中间件的消息传输保障分为三个层级:

  1. At most once:最多发一次。消息可能会丢失,但绝不会重复传输。
  2. At least once:最少发一次。消息绝不会丢失,但可能会重复传输。
  3. Exactly once:恰好发一次。每条消息肯定会被传输一次且仅传输一次。

其中 RabbitMQ 支持 “最多发一次” 和 “最少发一次”。而对于 “恰好发一次”,目前 RabbitMQ 还做不到,不仅是 RabbitMQ,目前市面上主流的消息中间件,都做不到这一点。

在业务使用中,对于可靠性要求比较高的场景,建议使用 “最少发一次”,以防止消息丢失。“最多发一次” 会因为消息发送过程中,网络问题,消费出现异常等种种原因,导致消息丢失。

以下场景可能会导致消息发送重复(包含但不限于)

  • 发送时消息重复:当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。如果此时 Producer 意识到消息发送失败并尝试再次发送消息,Consumer 后续会收到两条内容相同并且MessageID也相同的消息。

  • 响应时消息重复:消息消费的场景下,消息已投递到 Consumer 并完成业务处理,当客户端给服务端反馈应答的时候网络闪断。为了保证消息至少被消费一次,消息队列服务端将在网络恢复后再次尝试投递之前已被处理过的消息,Consumer 后续会收到两条内容相同并且MessageID也相同的消息。

但是“最少发一次” 会造成一个问题:消费端会收到重复的消息,也会造成对同一条消息进行多次处理。一些不重要的业务还好一点,对于重要的业务,如果不对重复的消息进行处理,会造成严重事故。

比如:当用户对一个订单付款之后,因为网络问题,付款成功的结果未返回给订单系统,当用户再次点击付款时,如果系统未做幂等性处理,那就会造成两次扣款

二、解决方案

MQ 消费者的幂等性的解决方法,一般有以下几种:

① 全局唯一ID

  1. 为每条消息分配一个唯一标识符
  2. 消费者收到消息后,先用该唯一ID判断该消息是否已经消费过,如果已经消费过,则放弃处理。
  3. 如果未消费过,消费者开始消费消息,业务处理成功后,把唯一ID保存起来(数据库或Redis等)

可以使用 Redis 的原子性操作setnx来保证幂等性,将唯一ID作为 key 放到 redis 中(SETNX messageID 1)。返回1,说明之前没有消费过,正常消费。返回0,说明这条消息之前已消费过,抛弃。

② 业务逻辑判断

在业务逻辑层面实现消息处理的幂等性。

例如:通过检查数据库中是否已存在相关数据记录,或者使用乐观锁机制来避免更新已被其他事务更改的数据,再或者在处理消息之前,先检查相关业务的状态,确保消息对应的操作尚未执行,然后才进行处理,具体根据业务场景来处理。

Ⅱ. 顺序性保障

一、顺序性保障介绍

消息的顺序性是指消费者消费的消息和生产者发送消息的顺序是一致的

比如生产者发送的消息分别是 msg1、msg2、msg3,那么消费者也是按照 msg1、msg2、msg3 的顺序进行消费的。

很多业务场景下,消息的消费是不用保证顺序的,比如使用 MQ 实现订单超时的处理。但有些业务场景,可能存在多个消息顺序处理的情况。比如用户信息修改,对同一个用户的同一个资料进行修改,需要保证消息的顺序。

一些资料显示 RabbitMQ 的消息能够保障顺序性,这是不严谨的。在不考虑消息丢失,网络故障等异常的情况下,如果只有一个消费者,最好也只有一个生产者的情况下,是可以保证消息的顺序性。如果有多个生产者同时发送消息,无法确定消息到达 RabbitMQ Broker 的前后顺序,也就无法验证消息的顺序性。

哪些情况可能会打破RabbitMQ的顺序性呢?下面介绍几种常见的场景:(下面以一个生产者的场景为背景)

  1. 多个消费者:当队列配置了多个消费者时,消息可能会被不同的消费者并行处理,从而导致消息处理的顺序性无法保证。
  2. 网络波动或异常:在消息传递过程中,如果出现网络波动或异常,可能会导致消息确认(ACK)丢失,从而使得消息被重新入队和重新消费,造成顺序性问题。
  3. 消息重试:如果消费者在处理消息后未能及时发送确认,或者确认消息在传输过程中丢失,那么MQ可能会认为消息未被成功消费而进行重试,这也可能导致消息处理的顺序性问题。
  4. 消息路由问题:在复杂的路由场景中,消息可能会根据路由键被发送到不同的队列,从而无法保证全局的顺序性。
  5. 死信队列:消息因为某些原因(如消费端拒绝消息)被放入死信队列,死信队列被消费时,无法保证消息的顺序和生产者发送消息的顺序一致。

包括但不仅限于以上几种情形会使 RabbitMQ 消息错序,如果要保证消息的顺序性,需要业务方使用 RabbitMQ 之后做进一步的处理。

二、顺序性保障方案

消息顺序性保障分为:局部顺序性保证全局顺序性保证

  • 局部顺序性:指在单个队列内部保证消息的顺序
  • 全局顺序性:指在多个队列或多个消费者之间保证消息的顺序

在实际应用中,全局顺序性很难实现,可以考虑使用业务逻辑来保证顺序性,比如在消息中嵌入序列号,并在消费端进行排序处理。相对而言,局部顺序性更常见,也更容易实现。

RabbitMQ 作为一个分布式消息队列,主要优化的是吞吐量和可用性,而不是严格的顺序性保证。如果业务场景确实需要严格的消息顺序,可能需要在应用层面进行额外的设计和实现。

接下来说一下消息的顺序性保证的常见策略:

1.单队列单消费者

最简单的方法是使用单个队列,并由单个消费者进行处理。同一个队列中的消息是先进先出的,这是RabbitMQ来帮助我们保证的。

2. 分区消费

单个消费者的吞吐太低了,当需要多个消费者以提高处理速度时,可以使用分区消费。把一个队列分割成多个分区,每个分区由一个消费者处理,以此来保持每个分区内消息的顺序性。

比如用户修改资料后,发送一条用户资料消息。消费者在处理时,需要保证消息发送的先后顺序。

但这种场合并不需要保证全局顺序。只需要保证同一个用户的消息顺序消费就可以。这时候就可以采用把消费按照一定的规则,分为多个区,每个分区由一个消费者处理。

RabbitMQ 本身并不支持分区消费,需要业务逻辑去实现,或者借助 spring-cloud-stream 来实现。

参考:https://docs.spring.io/spring-cloud-stream/reference/rabbit/rabbit_partitions.html

3. 消息确认机制

使用手动消息确认机制,消费者在处理完一条消息后,显式地发送确认,这样 RabbitMQ 才会移除并继续发送下一条消息。

4. 业务逻辑控制

在某些情况下,即使消息乱序到达,也可以在业务逻辑层面实现顺序控制。比如通过在消息中嵌入序列号,并在消费时根据这些信息来处理。

Ⅲ. 消息积压问题

一、原因分析

消息积压是指在消息队列中,待处理的消息数量超过了消费者处理能力,导致消息在队列中不断堆积的现象

通常有以下几种原因:(基本是消费者的问题)

  1. 消息生产过快:在高流量或者高负载的情况下,生产者以极高的速率发送消息,超过了消费者的处理能力。
  2. 消费者处理能力不足:消费者处理处理消息的速度跟不上消息生产的速度,也会导致消息在队列中积压。
    1. 消费端业务逻辑复杂,耗时长
    2. 消费端代码性能低
    3. 系统资源限制,如CPU、内存、磁盘I/O等也会限制消费者处理消息的效率。
    4. 异常处理处理不当。消费者在处理消息时出现异常,导致消息无法被正确处理和确认。
  3. **网络问题:**因为网络延迟或不稳定,消费者无法及时接收或确认消息,最终导致消息积压。
  4. RabbitMQ 服务器配置偏低

消息积压可能会导致系统性能下降,影响用户体验,甚至导致系统崩溃。因此,及时发现消息积压并解决对于维护系统稳定性至关重要。

二、解决方案

遇到消息积压时,首先要分析消息积压造成的原因。根据原因来调整策略。

主要从以下几个方面来解决:

  1. 提高消费者效率
    1. 增加消费者实例数量,比如新增机器
    2. 优化业务逻辑,比如使用多线程来处理业务
    3. 合理设置prefetchCount,当一个消费者阻塞时,消息转发到其他未阻塞的消费者。
    4. 消息发生异常时,设置合适的重试策略,或者转入到死信队列
  2. 限制生产者速率
    1. 流量控制:在消息生产者中实现流量控制逻辑,根据消费者处理能力动态调整发送速率
    2. 限流:使用限流工具,为消息发送速率设置一个上限
    3. 设置过期时间。如果消息过期未消费,可以配置死信队列,以避免消息丢失,并减少对主队列的压力
  3. 资源与配置优化
    1. 比如升级 RabbitMQ 服务器的硬件,调整 RabbitMQ 的配置参数等

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

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

相关文章

学术探险家必备:书匠策AI如何重塑本科论文写作的“游戏规则”

在学术写作的江湖里,本科论文常被视为“新手村”的终极挑战——既要应对选题迷雾、文献洪流,又要破解逻辑迷宫、语言密码。但当AI技术以“学术外挂”的姿态闯入这片战场,一场颠覆传统的写作革命正在发生。今天,让我们以探险家的视…

学术新次元:书匠策AI如何用“黑科技”重塑本科论文写作

论文写作,是每个本科生必经的“学术成人礼”。但选题撞车、文献迷航、逻辑混乱、格式翻车……这些痛点像无形的枷锁,让无数学生困在“学术新手村”。如今,一款名为书匠策AI的智能工具正以“学术外挂”的姿态,将论文写作从“地狱模…

学术探险家的秘密武器:书匠策AI解锁本科论文写作新次元

在学术探索的浩瀚宇宙中,本科论文写作如同一次星际穿越,既需要精准导航避开黑洞陷阱,又需要高效引擎突破时间桎梏。当传统写作模式陷入"选题撞车-文献迷航-逻辑断层"的恶性循环时,一款名为书匠策AI的智能工具正以"…

学术变形记:书匠策AI如何让本科论文写作从“地狱模式”秒变“创意游乐场”

对于本科生而言,论文写作常被视为学术生涯的“第一道坎”——选题撞车、文献迷航、逻辑混乱、语言生硬……这些问题像无形的绳索,将无数初学者困在“学术新手村”。但如今,一款名为书匠策AI的智能工具正以“学术变形金刚”的姿态,…

学术航行新伙伴:书匠策AI——本科论文写作的“全能舵手”

在本科学习的最后阶段,论文写作就像一场充满挑战的航行。选题像是在茫茫大海中寻找方向,文献梳理如同收集航海图,逻辑构建好比搭建船只骨架,语言表达则是扬起的风帆,而格式调整就是确保航行合规的规则。许多学子在这场…

Maven简介之什么是Maven

Maven 是什么? 一个帮你管理 Java 项目的自动化工具,主要干两件事:依赖管理(管理 jar 包)通俗理解:以前你要手动下载各种 jar 包(如 MySQL 驱动、JSON 工具),现在只需在配置文件里写个清单,Maven 自动帮你下…

论文写作新纪元:书匠策AI如何成为本科生的“学术变形金刚”

在学术江湖里,本科论文写作常被视为“新手村的第一场BOSS战”——选题撞车、文献迷航、逻辑混乱、语言生硬……这些问题像无形的绳索,将无数初学者困在原地。但别慌!今天我们要揭秘一位“学术变形金刚”——书匠策AI(官网&#xf…

React useState 数组 push/splice 后页面不刷新?深度解析状态被『蹭』出来的影子更新陷阱

深入理解 React 状态不可变性:规避 push/splice 的影子更新陷阱 在 React 开发实践中,状态(State)的管理逻辑是构建稳定应用的核心。初学者常会陷入一个技术误区:使用原生的数组方法(如 push 或 splice&…

学术超进化:书匠策AI如何让你的本科论文从“青铜”变“王者”

论文写作,是每个本科生从“学术菜鸟”到“科研战士”的必经之路。但选题撞车、文献混乱、逻辑断裂、查重翻车……这些痛点像一道道“天堑”,让无数学生困在“论文地狱”里反复挣扎。如今,一款名为书匠策AI的智能工具正以“学术外挂”的姿态&a…

学术探险家的秘密武器:书匠策AI本科论文写作全攻略

在学术的浩瀚宇宙中,每一位本科生都是手持“论文”这把钥匙的探险家。但面对选题迷茫、文献如海、逻辑混乱、语言生硬等重重关卡,如何才能高效通关?今天,我们将揭秘一款名为书匠策AI的“学术外挂”,它如何以智能之力&a…

学术“变形记”:书匠策AI如何让本科论文写作从“青铜”变“王者”

对于本科生而言,论文写作常被视为学术生涯的“第一场硬仗”——选题撞车、文献迷航、逻辑混乱、语言生硬……这些问题像无形的枷锁,将无数初学者困在“学术新手村”。但如今,一款名为书匠策AI的智能工具正以“学术变形金刚”的姿态&#xff0…

GitHub 热榜项目 - 日榜(2026-01-17)

GitHub 热榜项目 - 日榜(2026-01-17) 生成于:2026-01-17 统计摘要 共发现热门项目: 9 个 榜单类型:日榜 本期热点趋势总结 本期GitHub热榜显示AI应用开发正全面渗透工程实践,智能体框架superpowers和agents.md通过标准化方法…

学术超能力觉醒:书匠策AI如何让本科生论文写作“开挂”

论文写作,曾是无数本科生心中的“噩梦”——选题撞车、文献混乱、逻辑断裂、格式翻车……这些痛点像一道道无形的墙,将学生困在“学术新手村”。但如今,一款名为书匠策AI的智能工具正以“学术外挂”的姿态,将论文写作从“地狱模式…

学术探秘:书匠策AI如何成为本科论文写作的“超级引擎”

在学术的浩瀚宇宙中,本科论文写作曾像一场孤独的星际航行——选题如迷雾中的灯塔,忽明忽暗;文献似散落的星辰,难以连成星座;逻辑像错综的星轨,稍有不慎便偏离方向。而今,一款名为书匠策AI的智能…

探索AI原生应用与检索增强生成的发展机遇

探索AI原生应用与检索增强生成的发展机遇关键词:AI原生应用、检索增强生成(RAG)、大语言模型、知识融合、智能应用创新摘要:当AI从“工具”进化为“核心引擎”,一场应用形态的革命正在发生——这就是“AI原生应用”。而…

Leetcode 剑指 Offer II 158. 库存管理 II

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 仓库管理员以数组 stock 形式记录商品库存表。stock[i] 表示商品…

学术“变形记”:用书匠策AI把本科论文从“青铜”炼成“王者”

对于本科生来说,论文写作就像一场“升级打怪”的冒险:选题时像在迷雾森林里找出口,文献综述时仿佛在知识海洋里捞针,写作时又像在搭建一座没有图纸的积木城堡。但别怕!现在有一款名为书匠策AI的学术“魔法棒”&#xf…

2026年承德服务不错的西点学校,唐山欧米奇就业渠道广 - 工业品牌热点

在西点烘焙行业快速发展的当下,选择一所口碑不错的西点烘焙学校,是开启职业技能提升或创业梦想的关键一步。面对市场上各类西点学校,如何找到服务不错的西点学校?以下将从不同特色维度,为你推荐5所值得关注的西点…

2025年市面上口碑好的智能门窗厂家选哪家,全屋门窗/家居装修/环保门窗/豪宅设计/法式门窗企业找哪家 - 品牌推荐师

随着智能家居市场的爆发式增长,智能门窗作为家庭场景中高频使用的硬件,其技术迭代与市场需求呈现双向驱动。据第三方机构统计,2024年国内智能门窗市场规模突破320亿元,年复合增长率达21.3%,但行业仍面临产品同质化…

本科论文“开挂指南”:用书匠策AI解锁学术新次元

对于本科生而言,论文写作像一场“升级打怪”的冒险:选题撞车、文献读不完、逻辑混乱、格式扣分……这些问题让无数学生深夜抓狂。但如今,一款名为书匠策AI的科研工具正以“学术外挂”的姿态,将论文写作从“地狱模式”变为“轻松通…