RabbitMQ消息队列高级特性

news2025/1/14 1:01:14

文章目录

    • 1.消息的可靠投递
    • 2.ConSumer ACK消费者确认接收消息
    • 3.消费者限流
    • 4.TTL过期时间
    • 5.死信队列
    • 6.延迟队列
    • 7.日志与监控
    • 8.消息追踪

1.消息的可靠投递

在线上生产环境中,RabbitMQ可能会产生消息丢失或者是投递失败的一个场景,RabbitMQ为了避免这种场景的发生,提供了两种方式来控制消息传递的可靠性。

  • Confirm确认模式
    • 消息从生产者到MQ的Exchange过程中,如果消息成功到达,则会返回一个ConfirmCallback的确认函数。
  • Return退回模式
    • 消息从Exchange到队列的过程中,如果失败了则会返回一个ReturnCallback的函数。

我们可以利用RabbitMQ的两种可靠性投递模式分析产生失败的原因,从业务逻辑上解决问题。

2.ConSumer ACK消费者确认接收消息

ConSumer ACK是指消费方接收到消息数据后的确认方式,消费者从MQ中读取到消息数据后,需要返回一个确认接收的动作。

确认有三种方式:

  • 自动确认
    • acknowledge=“none”
    • 自动确认是指当接收消息后,程序自动向MQ回应消息已经收到,MQ在队列中将消费的数据删除。
  • 手动确认
    • acknowledge=“manual”
    • 收到消息后,程序需要收到确认消息有没有收到,收到调用代码进行查阅,当接收没有问题回应MQ消息已经收到。
  • 根据异常情况确认
    • acknowledge=“auto”
    • 需要根据不同的场景定义不通的处理方式。

3.消费者限流

消费者限流这个特性是非常有必要的,在前面我们提到过削峰填谷的概念,削峰填谷就是消费者限流的概念。

当系统高并发时,生产者一直在发消息数据,MQ全部存储在队列中,如果消费方没有进行限流的操作,那么大了的消费数据读取可能就会使消费者挂掉,因此就需要对消费方读取消息数据的频次进行限流,例如每秒5千个请求,我们允许消费者每秒从MQ中读取一千个请求,至少不会使消费者由于压力巨大而崩溃。

另外当消费方挂掉后,MQ中堆积了大量请求,如果没有限流,一下都让消费者读取,消费者还会挂掉。

4.TTL过期时间

RabbitMQ中可以对消息数据设置TTL过期时间,当消息达到过期时间后,还没有被消费者读取,MQ就会自动将消息进行清除。

RabbitMQ可以对消息设置过期时间,也可以对整个队列设置过期时间。

一个典型的应用场景:订单系统为生产者,用户下单后发送一条消息到MQ消息队列,MQ对这条消息的过期时间为30分钟,如果用户在30分内没有下单,就会被取消订单。

5.死信队列

死信队列在任何MQ消息队列中间件中都有这个概念,在RabbitMQ中私信队列简称为DLX(Dead Letter Exchange)死信交换机,RabbitMQ与其他的MQ中间件不同,RabbitMQ有Exchange交换机的概念,因此死信队列在RabbitMQ中也被成为死信交换机。

在没有Exchange交换机概念的MQ消息队列中,通常就被成为死信队列Dead Letter Queue。

什么是死信队列?当有消息数据成为死信消息时,消息所在的队列会将消息传递到DLX死信交换机上,由死信交换机再将消息数据存放在死信交换机,等待消费者读取数据。

消息成为死信的情况:

  • 队列中存储的消息太多,无法再写入新的消息时,新消息就会成为死信消息。
  • 消费者拒绝读取队列中的消息,并且不把消息重新放到原来所在的队列中,此时消息也会成为死信消息。
  • 队列中的消息设置了过期时间,消息到达过期时间后没有被消费者消费,此时消息也会成为死信消息。

死信队列的典型应用场景:当消息设置了TTL过期时间,超过过期时间后消息数据没有被消费,此时消息成为了死信消息,消息所在的队列会将消息传递给DLX死信交换机,再由死信交换机将数据写入到死信队列中,等待消费者读取数据。

image-20220309134302019

队列如何绑定死信交换机:

需要给队列设置绑定参数,才可以绑定死信交换机,设置x-dead-letter-exchange(死信交换机名称)和 x-dead-letter-routeing-key(死信交换机的routeingkey)

当有消息成为死信消息后,队列会根据死信交换机的名称以及消息中指定的死信交换机routeingkey,将死信消息传递给死信交换机,死信交换在通过死信队列的routeingkey,将消息数据写入到死信队列。

image-20220309140308465

6.延迟队列

**延迟队列:**消息进入队列后不会立即被消费,当到达指定时间后,才可以被消费。

延迟队列的典型应用场景:

  • 电商订单系统,用户拍了一件商品,处于待付款的状态,但是库存系统的数量会发生改变,业务逻辑上会给用户30分钟的付款时间,如果30分钟内完成支付了则流程结束,若30分钟内没有支付则会取消订单,并且通过程序代码回滚库存的数量。
  • 定期发生短信给用户,例如当用户注册满7天后,发生一条问候短信,7天这个时间段就可以在MQ的延迟队列里进行设置,7天后调用消费者发生短信。

image-20220309143708634

以上两种常见的场景都是要求消费者一段时间后再对数据进行处理,实现该需求的方式有以下两种。

  • 定时器
    • 通过在程序里面设置一个定时器,30分钟后在将消息数据传递给库存系统,但是多多少少会存在误差,如果按分钟级的定时器,那么至少会存在1分钟的误差,程序会比对订单表中的时间与当前时间,计算出差值,如果按秒级定时器,那么对于数据库的压力是非常大的,不推荐使用定时器方式。
  • 延迟队列
    • 通过MQ的延迟队列,当发布者将数据写入到队列后,设置30分钟的延迟,消费者再30分钟后读取消息数据,基本上不存在误差,并且只读取一次数据库表的时间进行比对,方式比较优雅。

虽然延迟队列的功能很好用,但是RabbitMQ并没有延迟队列的功能,不过我们可以通过TTL+死信队列的方式实现延迟队列的功能。

TTL+死信队列实现延迟队列

用户在订单系统下单后,会发送一条消息数据到RabbitMQ的Exchange交换机,Exchange交换机将数据写入到队列中,这个队列设置TTL过期时间为30分钟,并且不允许消费者读取数据,30分钟后消息成为死信消息,此时队列将死信消息发送到DLX死信交换机,死信交换机再将消息数据传递给死信队列,然后由消费者从死信队列中读取数据并进行处理。

image-20220309144512530

7.日志与监控

RabbitMQ的日志存放在/var/log/rabbitmq/rabbix@xxx.log中,xxx表示主机名。

日志中包含了RabbitMQ的版本号、Erlang版本号、RabbitMQ服务节点名称、Cookie的hash值、RabbitMQ配置文件地址、内存限制、磁盘限制、默认账户guest的创建已经权限配置。

在Web控制台中有很多RabbitMQ的监控信息。

RabbitMQ常用命令

rabbitmqctl list_queues					//查看队列
rabbitmqctl environment					//查看环境变量
rabbitmqctl list_exchanges				//查看exchange
rabbitmqctl list_queues aa messages_unacknowledged					//查看未被确认的队列
rabbitmqctl list_users					//查看用户
rabbitmqctl list_queues name memory				//查看单个队列的内存使用
rabbitmqctl list_connections					//查看链接
rabbitmqctl list_queues name messages_ready					//查看准备就绪的队列
rabbitmqctl list_consumers				//查看消费者信息

8.消息追踪

在使用任何消息中间件的过程中,难免会出现某条消息异常丢失的情况。对于RabbitMQ而言,可能是因为生产者或消费者与RabbitMQ断开了连接,而它们与RabbitMQ丈采用了不同的确认机制;也有可能是因为交换器与队列之间不同的转发策略;甚至是交换器并没有与任何队列进行绑定,生产者又不感知或者没有采取相应的措施;另外RabbitMQ本身的集群策略也可能导致消息的丢失。这个时候就需要有一个较好的机制跟踪记录消息的投递过程,以此协助开发和运维人员进行问题的定位。
在RabbitMQ中可以使用Firehose和rabbitmq_tracing插件功能来实现消息追踪。

trace交换机默认自带,需要开启才可以使用:rabbitmqctl trace_on

image-20220309153318432

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

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

相关文章

Redis慢查询分析

慢查询分析 谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来。 执行一条命令分为如下4个部分…

【每日算法 数据结构(C++)】—— 05 | 判断单链表是否有环(解题思路、流程图、代码片段)

文章目录 01 | 👑 题目描述02 | 🔋 解题思路03 | 🧢 代码片段 The future belongs to those who believe in the beauty of their dreams. 未来属于那些相信梦想之美的人 01 | 👑 题目描述 给你一个单链表,请判断其中是…

Mac(M1)上安装Ubuntu虚拟机

Mac(M1)上安装Ubuntu虚拟机 0.下载资料汇总 VMware Fusionhttps://www.vmware.com/products/fusion/fusion-evaluation.htmlubuntu-desktop-arm64.isohttps://cdimage.ubuntu.com/jammy/daily-live/current/ 1.安装VMware Mac版本的VMware叫 VMware …

黑马程序员前端 Vue3 小兔鲜电商项目——(十一)支付页

文章目录 基础数据渲染封装接口数据渲染 支付功能实现支付携带参数支付宝沙箱账号信息 支付结果页展示模版代码绑定路由渲染数据 倒计时逻辑函数封装 支付页有俩个关键数据,一个是要支付的钱数,一个是倒计时数据(超时不支付商品释放)。 基础…

Tomcat项目更新Tomcat版本,重新配置conf,并在Idea运行项目,服务器替换SSL证书

Tomcat项目更新Tomcat版本,重新配置conf,并在Idea运行项目 1.下载Tomcat包2.Tomcat配置-ssi配置3.Idea运行 Tomcat 项目4.服务器Tomcat替换SSL证书4. Tomcat 项目重启 1.下载Tomcat包 Tomcat 官网 - https://tomcat.apache.org/ jdk1.8.0_191 我选择的…

如何在电脑、手机《酷游链接》录制屏幕?一看就会!也有剪辑录制视频的方法哦!

最近,我的生活中出现了许多需要录制电脑屏幕的场景! 『酷游链kw9㍠N͜E͜T提供』娜娜友善提醒,要自己输入才会显示出来!比如会议,教学等场景。这些场景我们可以通过Windows10的内建软体来解决。另外,也出现…

Python小白应该怎么学习字典

1.Python 字典 字典 字典是一个无序、可变和有索引的集合。在 Python 中,字典用花括号编写,拥有键和值。 例子:创建并打印字典 thisdict {"brand": "Porsche","model": "911","year": 1963 } pr…

MUR20100DC-ASEMI快恢复二极管MUR20100DC

编辑-Z MUR20100DC在TO-263封装里采用的2个芯片,其尺寸都是102MIL,是一款共阴极快恢复对管。MUR20100DC的浪涌电流Ifsm为200A,漏电流(Ir)为10uA,其工作时耐温度范围为-55~150摄氏度。MUR20100DC采用抗冲击硅芯片材质,…

技术管理第二板斧建团队-沟通

一、沟通的核心原则 我认为,沟通是内心想法和思考逻辑的外延,如果你有良好的沟通能力,可以在整个团队中营造公开透明的信任氛围,让信息透明的同时,也让团队成员愿意发出自己的声音。 但实际情况中,很多人…

TypeScript 中对【函数类型】的约束使用解读

概述 函数是JavaScript 中的 一等公民 概念:函数类型的概念是指给函数添加类型注解,本质上就是给函数的参数和返回值添加类型约束 声明式函数: 在 TypeScript 中,一个函数有输入和输出,需要对其进行约束,需要把输入和…

电力载波远程控制系统

随着电力技术的不断发展,电力载波远程控制系统成为了现代电力系统中的重要组成部分。电力载波远程控制系统是一种利用电力载波技术实现远程控制的系统,可以对电力系统中的各种设备进行实时监测、控制和管理,提高电力系统的安全性、可靠性和效…

Efficient Video Transformers with Spatial-Temporal Token Selection阅读笔记

摘要 Video Transformers在主要视频识别基准测试中取得了令人印象深刻的结果,但其计算成本很高。 在本文中,我们提出了 STTS,这是一种令牌选择框架,它根据输入视频样本在时间和空间维度上动态选择一些信息丰富的令牌。 具体来说&…

Qt/C++编写视频监控系统78-视频推流到流媒体服务器

一、前言 视频推流作为独立的模块,目前并没有集成到视频监控系统中,目前是可以搭配监控系统一起使用,一般是将添加好的摄像头通道视频流地址打开后,读取视频流重新推到流媒体服务器,然后第三方可以从流媒体服务器拉取…

博世中国×牛客:精准人才简历增长100%!智能制造大揭秘

当一家智能制造巨头,在面向人工物联网企业的全面转型中,人才需求发生变化,年轻的校园顶尖科技人才成为刚需。 此时,内部需求激增,人才要求高还翻倍增长,但外部供需失衡,人才供给极少。尽管已然…

编译原理二:有限状态机

文章目录 1. 有限状态机介绍1.1. 确定性有限状态机(DFA)1.2. 非确定性有限状态机(NFA)1.3. 有限状态机的应用 2. 例子:实现一个简易版本的分词 1. 有限状态机介绍 有限状态机是一种计算模型,它可以接受一串…

脑机接口科普0023——黑门03:伦理道德中的电车难题

本文禁止转载!!!!! 脑机接口科普0022——黑门02:伦理道德问题_sgmcy的博客-CSDN博客 前文中,罗列了一下脑机接口这个技术中,会遇到哪些伦理道德的问题。 前文末,以黑门…

Stable Diffusion 对图像进行风格化

风格化是基于现有图像转换成另一种风格的操作方法,通常应用于img2img中,将文字提示中特定的新风格应用于原图像上进行修改。在这个过程中并非使用随机的潜在状态,而是采用原始图像去编码初始潜在状态。在此基础上通过加入少量的随机性&#x…

【观察】新华三:数据中心可组合架构创新,提供多元算力的“最优解”

今天,以ChatGPT为代表的AIGC大模型,已经在国内形成了“海啸效应”,几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力,就在于大模型的最大价值在于普遍提升个人生产力,而各行各业的公司都在积极寻找应…

linux下照片添加水印乱码

java程序给图片添加中文文字水印显示乱码 原因:linux服务器没有对应的文字 解决步骤 在windows系统下文字中选一个文字(微软雅黑) windows文字保存路径:C:\Windows\Fonts 上传到linux服务器:/usr/share/fonts 新建…

Revit做基坑放坡开挖方法及快速生成基坑

一、Revit做基坑放坡开挖方法 1、建立基坑顶与基坑底轮廓参照线,使用地形表面工具通过放置点创建原始平整场地过后的地形(有坐标点可以直接导入)。 2、修改原始地形名称为:开挖前,阶段化:现有类型。 3、使用平整区域,弹…