RabbitMQ几大应用问题

目录

1.幂等性保障

2.顺序性保障

3.消息积压


1.幂等性保障

(1)介绍幂等性

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

比如说,重复多次调用同一个函数,函数返回的结果也相同。

比如,牛羊吃进去的是草,拉出来的也是

(2)MQ上的幂等性

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

为什么会有同一个消息多次消费,是因为可能触发重试等机制

所以对于消息中间件,对消息传输保障分为三个层级:

1)At most once:最多一次。消息可能会丢失,但绝不会重复传输。

2)At least once:最少一次。消息绝不会丢失,但可能会重复传输。

3)Exactly once:恰好一次。每条消息肯定会被传输一次且传输一次。

对于目前的中间件来说,只能支持前面两种,最后一种也无法做到。

(3)MQ如何保障幂等性

为什么要保证幂等性?

比如用户下单一个商品,在支付页面因为网络缘由,多次点击,这个时候就只能认为是一次消费。

所以幂等性保障,就是可以正确的处理相同重复的消息。对于RabbitMQ保障幂等性有两个方面:保证全局ID和代码逻辑判断,主要方法还是需要靠全局唯一ID

1)全局唯一ID

做法:给每条消息分配一个全局唯一的ID。这个ID可以自定义生成,比如UUID,UUID+时间戳等。

当消费者收到消息后,就可以根据唯一ID判断该消息是否已经被消费过,如果已经被消费观过,则可以不做处理,进而可以避免重复消费的问题。

对于未消费过的消息,就可以进行消费;在消费完成后,就需要把该ID进行保存起来,表明该ID的消息已经被消费过。

2)业务逻辑判断

这个方面就考验程序猿的代码能力了。比如通过检查数据库中是否已经存在相关的数据记录;或者在处理消息前,检查相关业务的状态,确保消息对应的操作尚未执行,然后再进行处理。


2.顺序性保障

顺序性保障,是指消费者消费的消息和生产者生产的消息顺序一致。

对于很多的业务场景,对顺序性是没有要求的;但是一些场景下是有要求的,比如对同一个用户的同一个信息进行修改。

(1)会打破顺序性的场景

1)多个消费者

当存在多个消费者的时候,消息被哪一个消费者消费是不确定的,也可能并行处理,就会导致消息的顺序性无法保证

2)网络波动或异常

在消息传递过程中,如果出现网络波动或者异常,可能导致消息会重新入队,进行直接影响顺序性。

3)消息重试

消费者消费完成后没有及时对消息进行确认,或者确认丢失,MQ可能认为消息未发送成功进而重试,也会导致消息处理的顺序性问题。

4)消息路由问题

消息会根据不同的路由规则进入不同的队列,因为每个队列的情况都会不太一样,就无法保证全局的顺序性。

5)死信队列

当消息因为一些原因进入死信队列后,再被消费者消费,就无法保证消息的顺序性和生产者发送消息的顺序一致。


上述的比较常见的场景,如果需要保障顺序性,就需要做出相应的处理。

(2)如何保障顺序性

消息顺序性保障分为:局部顺序性保障和全局顺序性保障。一般都为局部性保障,全局性保障较为困难。

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

下面介绍两个常用的顺序性保障策略

1)单个消费者和单个队列

这样的策略下,就能从很大的几个方面下杜绝了一些情况,进而跟容易保障消息的顺序性问题。

2)分区消费

这里的分区指的是将一个队列划分成多个区域,每个区域引入一个消费者进行消费,这个时候保障每个分区内的顺序性即可。

3)消息确认机制

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

4)业务逻辑控制

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


3.消息积压

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

(1)产生的原因

  • 消息生产过快

在高流量或者高负载的情况下,生产者以极高的速率发送消息,超过了消费者的处理能力,这也就是本质原因

  • 消费者处理能力不足
  1. 消费端业务逻辑复杂,耗时长
  2. 消费端代码性能低
  3. 系统资源限制,如CPU、内存、磁盘I/O等也会限制消费者处理消息的效率
  4. 异常处理不当。比如消费者在处理消息时出现异常,导致消息无法被正确处理和确认
  • 网络问题

比如网络延迟或不稳定,消费者无法及时接收或者确认消息,最终导致消息积压

  • RabbitMQ服务器配置偏低

消息积压会导致系统性能下降,影响用户体验,甚至导致系统崩溃

(2)解决方案

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

比如升级RabbitMQ服务器的硬件,调整RabbitMQ的配置参数等

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

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

相关文章

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来,FICC 投资交易呈现活跃多元态势,创新转型稳步推进。FICC 平台电子化方兴未艾,是机构提升服务效率和质量的一大着力点。因此,在 FICC 平台建设上,许多机构都进行了深入研究,积累了丰富的实践经验。 …

(五)Web前端开发进阶2——AJAX

目录 1.Ajax概述 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.HMLHttpRequest对象 7.前后端分离开发(接口文档) 8.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。…

linux文件的权限

前言 在linux操作系统中,账户分为两类,一类是普通用户,一类是超级用户,普通用户在许多方面受权限约束,而超级用户几乎不受约束。 root账户和普通账户的切换 有三种方式能够切换账号 su su 直接使用,会弹…

1-无监督学习求解旅行商问题(NeurIPS 2023)(未完)

文章目录 Abstract1 Introduction2 Our ModelAbstract 我们提出了 UTSP,一种用于解决旅行商问题 (TSP) 的无监督学习 (UL) 框架。 我们使用替代损失来训练图神经网络(GNN)。 GNN 输出一个热图,表示每条边成为最佳路径一部分的概率。 然后,我们应用本地搜索来根据热图生成…

在vue3项目中,如何正确定义不同类型ref变量的类型

Vue 3 引入了 Composition API,它使用 ref 和 reactive 等函数来创建响应式的变量。在 TypeScript 中,我们需要确保类型正确地反映这些变量的实际类型。 定义ref变量 下面是几个示例,展示了如何在 Vue 3 项目中使用 TypeScript 来定义 ref …

【CSS3】css开篇基础(5)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

net framework 3.5组件更新失败错误代码0x80072f8f怎样解决

浏览器地址栏输入www.dnz9.com远程解决netframework问题 当遇到.NET Framework 3.5 组件更新失败,错误代码为 0x80072f8f 时,可以尝试以下几种解决方法: 一、检查网络连接和时间设置 网络连接 错误代码 0x80072f8f 通常与网络相关问题有关。首…

STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器

1、简要说明与电路图 LED灯与蜂鸣器都是GPIO的输出操作,给高低电平实现。GPIO操作也是后续操作的基础,没有什么难度,记不住寄存器没关系,只要把流程理清楚就可以了。 端口配置成推挽输出模式,高低电平均有驱动能力。 …

计算机网络网络层笔记

互联网提供的两种服务 1.虚电路服务 2.数据报服务 需要记住的是现在只用第二种也就是数据报服务 网际协议IP 物理层的中断系统:转发器(hub) 链路层的中断系统:交换机 网络层的中断系统:路由器 网络层以上:网关 如上图所示,网关是用来访问其他的网段的一个接口,网关的地…

commitlint+lint-staged+husky

步骤 1. 安装依赖 pnpm i -D husky lint-staged commitlint commitlint/cli commitlint/config-conventional 2. 初始化命令 npx husky init 3. 配置 // commit-msg,现npx husky add 添加指令已被废弃,手动添加 npx --no-install commitlint --edi…

大屏可视化:舞动数据与美观的“设计秘籍”

大屏可视化鉴赏:踏入软件系统产品设计之旅,让我们一同鉴赏那些闪耀在智慧农业、智慧园区、智慧社区及智慧港口等领域的大屏可视化杰作。每一帧画面,都是科技与创新的完美融合,数据跃然屏上,智慧触手可及。 >> 数…

持续基础怎么搞?Jenkins+Docker+Git实战

在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部署、交付(…

EDA --软件开发之路

之前一直在一家做数据处理的公司,从事c开发,公司业务稳定,项目有忙有闲,时而看下c,数据库,linux相关书籍,后面跳槽到了家eda公司,开始了一段eda开发之路。 eda 是 electric design …

「Mac畅玩鸿蒙与硬件10」鸿蒙开发环境配置篇10 - 项目实战:计数器应用

本篇将通过一个简单的计数器应用,带你体验鸿蒙开发环境的实际操作流程。本项目主要练习组件的使用、事件响应和状态管理,帮助开发者熟悉基本的应用构建流程。 关键词 计数器应用组件操作事件响应状态管理HarmonyOS 应用开发一、创建计数器项目 1.1 在 DevEco Studio 中新建项…

串口通信以及USART和UART以及IIC和SPI-学习笔记

串行通讯与并行通讯 串行通讯是指设备之间通过少量数据信号线(一般8根以下)、地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,串行通讯同一时刻只能传输一个数据位的数据,但通讯距离比并行通讯远、抗干…

window快捷键:window + v 打开剪切板历史记录 / 非常实用

一、剪切板历史记录功能介绍 1.1、window v 打开剪切板历史记录 / 文字、图片都可记录 1.2、window v 最近使用 1.3、window v 表情符号 1.4、window v GIF 1.5、window v 颜文字 1.6、window v 符号 二、欢迎交流指正

寻找专业在线微信投票和点赞服务团队攻略

在当今的社交网络时代,微信投票和点赞活动日益频繁,无论是企业评选、才艺比赛还是个人荣誉的角逐,都可能需要一定的投票和点赞支持。然而,要找到领先、高效、专业的在线微信投票和点赞服务团队并非易事。以下是一些关键步骤和注意…

115页PPT华为管理变革:制度创新与文化塑造的核心实践

集成供应链(ISC)体系 集成供应链(ISC)体系是英文Integrated Supply Chain的缩写,是一种先进的管理思想,它指的是由相互间提供原材料、零部件、产品和服务的供应商、合作商、制造商、分销商、零售商、顾客等…

HTML5和CSS3常见面试题

😊HTML5和CSS3常见面试题 1.HTML5有哪些新特性?2.你是如何理解语义化标签的?3.CSS3有哪些新特性?4.rem和em的区别是什么?5.如何实现自适应布局?6.清除浮动的方法有哪些?7.伪元素清除的原理是什么…

17. 从尾到头打印链表

文章目录 QuestionIdeasCode Question 输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。 返回的结果用数组存储。 数据范围0≤链表长度 ≤1000。 样例 输入:[2, 3, 5] 返回:[5, 3, 2] Ideas 直接遍历链表,然后倒序…