RabbitMQ消息可靠性 (投递+消费)

文章目录

    • Rabbitmq的消息可靠性投递
    • Rabbitmq的消息可靠性投递confirmCallback
    • Rabbitmq的消息可靠性投递returnCallback
    • Rabbitmq的消息确机制ACK

Rabbitmq的消息可靠性投递

什么是消息的可靠性投递

保证消息百分百发送到消息队列中去
1 保证mq节点成功接受消息,消息发送端需要接受到mq服务端接受到消息的确认应答
2 完善的消息补偿机制,发送失败的消息可以再感知并⼆次处理

RabbitMQ消息投递路径

⽣产者–>交换机->队列->消费者

通过两个的点控制消息的可靠性投递

⽣产者到交换机 通过confirmCallback
交换机到队列 通过returnCallback

建议

开启消息确认机制以后,保证了消息的准确送达,但由于频繁的确认交互, rabbitmq 整体效率变低,吞吐量
下降严重,不是⾮常重要的消息不建议⽤消息确认机制

Rabbitmq的消息可靠性投递confirmCallback

⽣产者到交换机

通过confirmCallback,⽣产者投递消息后,如果Broker收到消息后,会给⽣产者⼀个ACK。⽣产者通过ACK,可以确认这条消息是否正常发送到Broker,这种⽅式是消息可靠性投递的核⼼

开启confirmCallback

//旧版,确认消息发送成功,通过实现ConfirmCallBack接⼝,消息发送到交换器Exchange后触发回调
spring.rabbitmq.publisher-confirms=true
//新版,NONE值是禁⽤发布确认模式,是默认值,CORRELATED值是发布消息成功到交换器后会触发回调⽅法
spring.rabbitmq.publisher-confirm-type:correlated
@SpringBootTest
class ApplicationTests {@Autowiredprivate RabbitTemplate template;/*** 生产者到交换机可靠性投递测试*/@Testvoid testConfirmCallback(){template.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {/*** @param correlationData 配置* @param ack 交换机是否收到消息,true是成功,false是失败* @param cause 失败的原因*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {System.out.println("ConfirmCallback======>");System.out.println("correlationData======>correlationData="+correlationData);System.out.println("ack======>ack="+ack);System.out.println("cause======>cause="+cause);if(ack){System.out.println("发送成功");//更新数据库 消息的状态为成功  TODO}else {System.out.println("发送失败,记录到日志或者数据库");//更新数据库 消息的状态为失败  TODO}}});//数据库新增一个消息记录,状态是发送  TODO//发送消息template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "order.new","新订单");}

Rabbitmq的消息可靠性投递returnCallback

交换机到队列

通过returnCallback,消息从交换器发送到对应队列失败时触发

两种模式

交换机到队列不成功,则丢弃消息(默认)
交换机到队列不成功,返回给消息⽣产者,触发returnCallback

第⼀步 开启returnCallback配置

spring.rabbitmq.publisher-returns=true

第⼆步 修改交换机投递到队列失败的策略(丢弃或者返回给消息⽣产者)

//为true,则交换机处理消息到路由失败,则会返回给⽣产者
spring.rabbitmq.template.mandatory=true
@SpringBootTest
class ApplicationTests {@Autowiredprivate RabbitTemplate template;/*** 交换机到队列可靠性投递测试*/@Testvoid testReturnCallback(){template.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returned) {int code = returned.getReplyCode();System.out.println("code="+code);System.out.println("returned="+returned.toString());}});template.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "order.new","新订单ReturnsCallback");}
}

Rabbitmq的消息确机制ACK

消费者从broker中监听消息,需要确保消息被合理处理

ACK介绍

消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列
中删除,消费者在处理消息出现了⽹络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放⼊队列中,只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。

消息的ACK确认机制默认是打开的,消息如未被进⾏ACK的消息确认机制,这条消息被锁定Unacked

确认⽅式

⾃动确认(默认)
⼿动确认 manual
其他(基本不⽤,忽略)

spring:rabbitmq:#开启⼿动确认消息,如果消息重新⼊队,进⾏重试listener:simple:acknowledge-mode: manual
@Component
@RabbitListener(queues = "order_queue")
public class OrderMQListener {@RabbitHandlerpublic void messageHandler(String body, Message message, Channel channel) throws IOException {long msgTag = message.getMessageProperties().getDeliveryTag();System.out.println("msgTag="+msgTag);System.out.println("message="+message.toString());System.out.println("body="+body);//复杂业务逻辑//告诉broker,消息已经被确认//成功确认,使⽤此回执⽅法后,消息会被rabbitmq broker 删除channel.basicAck(msgTag,false);//告诉broker,消息拒绝确认//channel.basicNack(msgTag,false,true);//channel.basicReject(msgTag,true);}
}

deliveryTag介绍

表示消息投递序号,每次消费消息或者消息重新投递后,deliveryTag都会增加

basicNack和basicReject介绍

basicReject⼀次只能拒绝接收⼀个消息,可以设置是否requeue。
basicNack⽅法可以⽀持⼀次0个或多个消息的拒收,可以设置是否requeue。

⼈⼯审核异常消息

设置重试阈值,超过后确认消费成功,记录消息,⼈⼯处理

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

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

相关文章

jzoj4024-石子游戏【SG函数,博弈论】

正题 大意 有n堆石头,每堆石头有aiai个每次可以拿走一堆或者Y个(仅当gcd(Y,ai)1gcd(Y,ai)1)。拿走最后一堆石头的人就赢了,两个人都是聪明绝顶的。 解题思路 考虑构建SG函数: SG(x)mex(SG(x−y)(gcd(x,y)1) υ …

程序配置amp;amp;ConfigurationManager

配置组件是.net framework中非常常用的功能。在创建.net framework 工程时,系统不仅会自动生成app.config文件,而且还提供了非常强大的访问类库。但是这些好东西,在.net core 2.0中已经不复存在,至少说没有.net framework 中那么完…

既然参与,那就做好,我相信我们是最棒的!!!

‍‍大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。今天是3班的KTV项目答辩,也是20级的最后一个班级,连续6天的KTV项目答辩终于告一段落。回顾各班所做的项目,通过我自己参与点评的以及从班内参观同学…

又发生频繁FGC,这次是谁的锅

转载自 又发生频繁FGC,这次是谁的锅 这是笨神JVMPocket群里一位名为"云何*住"的同学提出来的问题,问题现象是CPU飙高并且频繁FullGC。 重现问题 这位同学的业务代码比较复杂,为了简化业务场景,笔者将其代码压缩成如…

jzoj4025-找回密码【后缀自动机】

正题 大意 一个字符串,要求第k小的子串。 解题思路 先建立一个后缀自动机,然后用一个numinum_inumi​表示第iii个节点的可以到达的点所表示的子串总和,然后从第1号点开始查找,判断一下找到第k小所在的节点后,然后查找…

三个剩两个,两个剩一个,最后一个都没剩下。

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。今天文章的标题本来是:“从未见过如此不要脸耍无赖的人!!!”,后来想了想,毕竟公众号里面还有那么多不同身份的粉丝&a…

算法面试,如何在100 亿URL中判断某个URL是否存在

转载自 算法面试,如何在100 亿URL中判断某个URL是否存在 如果面试官问你,一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节。问这个黑名单要怎么存?若此时随便输入一个 url,如何判断该 url 是否在这个…

链表 题

文章目录找出链表中类中点的位置判断该链表是否为回文结构将单向链表按某值划分成左边小、中间相等、右边大的形式给定一个有next指针和rand指针的Node 组成的无环单链表头节点,实现一个函数完成链表的复制,返回新链表的头节点给定两个可能有环也可能无环…

.NET Core 2.0迁移技巧之web.config配置文件

大家都知道.NET Core现在不再支持原来的web.config配置文件了,取而代之的是json或xml配置文件。官方推荐的项目配置方式是使用appsettings.json配置文件,这对现有一些重度使用web.cofig配置的项目迁移可能是不可接受的。 但是好消息是,我们是…

jzoj2136-(GDKOI2004)汉诺塔【找规律,模拟】

正题 大意 将汉诺塔的规则改为只能移动到相邻的柱子,然后求有n个圆盘时在第m步时每个盘所在的位置。 解题思路 我们先将3个盘的移动情况推出来:(1,1,1)->(2,1,1)->(3,1,1)->(3,2,1)->(2,2,1)->(1,2,1)->(1,3,1)->(2,3,1)->(3,…

学会它,可以替你写100行 200行 300行……的代码

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。今天,给大家分享一个非常非常使用的小技巧,那就是:“在webstrom中创建一个简单的vue模板”,根据这个方法,你可以任意的创建html模…

Java中随机数的原理,以及使用时的注意点

转载自 Java中随机数的原理,以及使用时的注意点 1 前言 一提到 Java 中的随机数,很多人就会想到 Random,当出现生成随机数这样需求时,大多数人都会选择使用 Random 来生成随机数。Random 类是线程安全的,但其内部使…

MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

dotnet core 2.0 发布已经好几天了,期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0,升级过程还是比较顺利的,变动也不是太多。升级的过程中也少不了 Entity Framwork Core 的升级,在这篇文章中主要介绍下 MySql 数据库使用…

下午带着几个同学打了两节课的牌~

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。大赛的项目目前正在火热进行中,靳天宇小组做的是扑克牌的游戏,除了要做大家耳熟能详的“斗地主”之外,另外在我的建议下准备再加两种玩法,一…

Java 0xffffffff隐式类型转换的坑

一、场景复现 项目需求,long的低32位存储ip地址,需要将ip信息展示成为字符串ip。 public static void main(String[] args){long ipLong 0x457145130A1901F6L;String ip longToIp(ipLong&0xffffffff);//取低32位System.out.println(ipLong);Syst…

jzoj2137-(GDKOI2004)城市统计【二维前缀和,bfs】

正题 大意 有n*n的矩阵,有居民区有商业区,每个居民区曼哈顿距离最近的商业区的曼哈顿距离就是那个居民区离商业区的距离。每个格子统计一下以它为中心的2∗r12∗r12∗r12∗r1的矩阵内所有居民区离商业区的距离的和。 解题思路 先bfs计算所有居民离商业…

Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍

Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web程序员来说,Asp.Net下的任何web框架都会去特别关注&…

二叉 树

文章目录递归方式 先序、中序、后序 遍历非递归方式 先序、中序、后序 遍历实现二叉树的按层遍历求二叉树的最大宽度二叉树的序列化和反序列化二叉树有 left、right、parent ,给这样二叉树的某个结点,返回该节点的后继节点折纸条递归方式 先序、中序、后…

“老师,弃了吧,做个别的……”“笑话,都到这个份上了,怎么能弃掉呢?”...

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。最近项目小组一直在按照原计划做项目,聊天程序(高仿版微信)已经趋于尾声,做的还可以,剩下的就是美化和慢慢的完善小问题了&#…

IntelliJ IDEA 源值1.5已过时,将在未来所有版本中删除

转载自 IntelliJ IDEA 源值1.5已过时&#xff0c;将在未来所有版本中删除 原因&#xff1a; IDEA默认把项目的源代码版本设置为jdk1.5&#xff0c;目标代码设置为jdk1.5 解决方案&#xff1a; 1修改Maven的Settings.xml文件添加如下内容 <profile><id>jdk-1.8&…