RabbitMQ入门到实战——高级篇

消息的可靠性

 生产者的可靠性(确保消息一定到达MQ)

生产者重连

这⾥除了enabled是false外,其他 initial-interval 等默认都是⼀样的值。

生产者确认 

生产者确认代码实现

application中增加配置:(publisher-returns ⼀般不⽤配置)

 2. 在RabbitTemplate中设置回调函数 ReturnCallback ,在Rabbit发送信息失败时触发(如果开了 publisher-returns)

3. 在发送信息的RabbitTemplate 中指定 ConfirmCallback

总结:

设置⽇志级别

面试题:如何保证⽣产者发送消息的可靠性

⾸先,可以在Rabbit MQ中配置适量次数的⽣产者重试,重试时间等重连机制,避免⽹络波动影响 然后,如果是其他原因导致失败,Rabbit MQ也提供了接受信息后的回执,可以设置回调函数来保 证⽣产者接受信息。基本保证可靠性。 但是,由于MQ回调需要消耗额外的资源,如果不是对消息可靠性有较⾼要求,最好不要开启。(这里在P21测试中印证了,发100w条信息,半天才发40w条。关闭后显著提升速度) 

MQ的可靠性

问题:MQ出现故障,如宕机重启,消息会丢失。内存有限,MQ会阻塞

数据持久化durable

控制台页面:

Java代码实现(默认持久化)

paged out:当内存被占满,部分消息转移到磁盘,MQ阻塞不能访问的状态

非持久化:(优先写⼊内存)

 

持久化(直接写入磁盘 - 注意:这种模式下也会预先写⼀些信息到内存中保障安全性) 

Lazy queue

创建: ①⽤Bean创建

②基于注解

③控制台

总结(RabbitMQ如何保证消息可靠性)

  • 交换机、队列、发送的信息持久化
  • 使⽤LazyQueue(⾃动将所有消息持久化)

消费者可靠性

消费者确认

失败重试机制 

 重试策略

消费者确认问题:如果是业务异常,自动返回nack,程序会不断重试,不断抛异常。浪费资源
解决:设置重试策略,设定重试参数,重试多几次 

效果:重试三次后依然失败,将消息reject丢掉。

失败消息处理策略

问题:重试次数耗尽后,直接丢掉,处理草率

使⽤MessageRecoverer接⼝处理,以下是三种实现方式:

代码实现:

1.配置开启重试机制

2.定义接收失败消息的交换机、队列及其绑定关系

3.定义RepublishMessageRecoverer实现类

 总结

投递给异常交换机,需要实现 RepublishMessageRecoverer

业务幂等性

使⽤了MQ,不可避免的会有消息重复现象。就会导致消费者重复消费。要使非幂等业务转变为幂等。

 ⽅案1:给消息设置唯⼀id。如:类似token保证表单不重复提交。

 

缺点: 1. 业务增多。保存到数据库,判断id是否重复
2. 影响性能。涉及数据库操作(写、判断) 

 还可以基于乐观锁优化,避免线程并步运⾏:

面试题:微服务中的支付服务和交易服务如何保持订单状态⼀致? 

扩展:
为什么选择异步?同步异步(同步调用的问题),聊聊优化的时间。
生产者可靠性等等具体实现(也可突出自己用雪花,而不是默认的uuid)
幂等性判断如何实现?常见幂等方案有哪些
基于之前交易服务⼀直处于被动,再用个定时任务化为主动,定期查询支付状态 

消息过期机制

可以给每条消息指定一个有效期,一段时间内未被消费者处理,就过期了。这种机制允许系统自动清理和丢弃那些长时间未被消费的消息,以避免消息队列中积累过多的过期消息,从而保持系统的效率和可靠性。

例如:消费者(库存系统)挂了,一个订单 15 分钟还没被库存系统处理,这个订单其实已经失效了,哪怕库存系统再恢复,其实也不用扣减库存。
适用场景:清理过期数据、模拟延迟队列的实现(不开会员就慢速)、专门让某个程序处理过期请求。

延迟消息

例如:会员/非会员:会员用户,我们希望立即处理其请求;而对于普通用户,我们希望让其排队等待一段时间(比如5分钟)后再进行处理。这时,可以利用延迟队列实现。消费者可以监听延迟队列,普通用户的请求由一个程序处理监听该延迟队列,而会员用户的请求则由另一个程序监听一个高优先级的队列。一旦你掌握了消息队列的知识,就可以实现这样的程序逻辑。延迟队列的实现可以借助消息过期机制。具体的实现思路是创建两个队列,第一个队列中的消息设置了过期时间,比如5分钟,然后将过期的消息转移到第二个队列中。接着,让相应的用户程序监听第二个队列,这样第二个队列就成为了延迟队列。 

死信

通过将设置消息过期时间,并令其过期达到延迟发送。

问题:死信交换机本身不是做延迟消息,需要等时间过期才能实现延迟消息

 

取消超时订单的基本思路

问题:每创建⼀个订单,队列都有⼀个30min延迟消息,MQ压⼒过大
解决:将30min切开,进行分段检查

 代码实现:

在订单业务的最后拓展代码:
1. 定义延迟消息体与延迟常量
        a. 延迟消息体

b. 延迟常量(交换机 - topic,队列,Key)

2. 发送信息

优化:每次都要new⼀个类,并配置。可以单独提取出来,new⼀个类

监听延迟信息

定义监听器:构造注⼊orderService,注解中开启延迟信息,传参为延迟消息体

5 与 6 应该为分布式事务,需要写在 OrderService 中,改动如下:

 

参考:MQ高级-15.延迟消息-监听延迟消息_哔哩哔哩_bilibili 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年全国职业院校技能大赛软件测试赛题—单元测试卷③

单元测试 一、任务要求 题目1:输入一个大写字母一个小写字母。根据输入的第一个字母和英文周几单词的第一个大写字母判断是周几,如果无法根据第一个大写字母判断,则继续根据输入的第二个小写字母进行判断,最终返回正确的英文周几…

Ubuntu下使用Virtual Box中显示没有可用的USB设备

Ubuntu中使用Virtual Box,但是使用到USB时只有USB1.1可以使用,并且提示没有可以使用的USB设备,解决方法如下 下载并安装Vitrual Box提供的功能扩展包 分别点击帮助->关于,查看当前使用的版本进入到Virtual Box官网下载链接根…

使用 gitee+sphinx+readthedocs 搭建个人博客

给大家安利如何快速搭建个人博客网站! 前言 这是我本地运行的一个使用sphinx构建的博客服务,这些文章,都是用markdown写的。 一直有个想法,就是把自己写的这些文件,搞成一个博客网站,放到网上&#xff0c…

1.1 计算机网络在信息时代的作用

1.1 计算机网络在信息时代的作用 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)所组成。网络中的结点可以是计算机、集线器、交换机或者路由器等。 图1-1 多个网络还可以通过路由器互连起来&a…

Chrome Dev Tools 配置

文章目录 前言偏好设置小结 前言 控制面板 > command shift p 呼出快捷指令面板,或者如下图操作 偏好设置 默认配置 中文配置 小结 把今天最好的表现当作明天最新的起点…….~ 投身于天地这熔炉,一个人可以被毁灭&#xff0…

kafka下载安装部署

Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速、可扩展、可持久化的特点。它现在是Apache旗下的一个开源系统,作为hadoop生态系统的一部分,被各种商业公司广泛应用。它的最大的特性就是可以实时的处理大量数据以满足各…

oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c

目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点:如果是全库导出导入的话,目标数据库没有的表空间我们要事先创建&#…

制造领域 基础概念快速入门介绍

1、基本背景知识 本定义结合国家标准文件有所发挥,仅供参考。 产品:是生产企业向用户或市场以商品形式提供的制成品; 成套设备:在生产企业一般不用装配工序连接,但用于完成相互联系的使用功能的两个或两个以上的产…

国产系统-银河麒麟桌面版V10安装字体-wps安装字体

安装系统:银河麒麟V10 demodemo-pc:~/桌面$ cat /proc/version Linux version 5.10.0-8-generic (builddfa379600e539) (gcc (Ubuntu 9.4.0-1kylin1~20.04.1) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #33~v10pro-KYLINOS SMP Wed Mar 22 07:21:49 UTC 20230.系统缺失…

API设计:从基础到优秀实践

在这次深入探讨中,我们将深入了解API设计,从基础知识开始,逐步进阶到定义出色API的最佳实践。 作为开发者,你可能对许多这些概念很熟悉,但我将提供详细的解释,以加深你的理解。 API设计:电子商…

设计模式-数据映射模式

设计模式专栏 模式介绍模式特点应用场景技术难点代码示例Java实现数据映射模式Python实现数据映射模式 数据映射模式在spring中的应用 模式介绍 数据映射模式是一种将对象和数据存储映射起来的数据访问方式。具体来说,对一个对象的操作会映射为对数据存储的操作。这…

springCould中的Stream-从小白开始【12】

🥚今日鸡汤🥚 见过一些人,他们朝九晚五😭,有时也要加班,却能把生活过得很😎有趣。他们有自己的爱好,不怕独处。他们有自己的坚持,哪怕没人在乎。🤦‍♂️ 开心…

靶机实战(10):OSCP备考之VulnHub Tre 1

靶机官网:Tre: 1[1] 实战思路: 一、主机发现二、端口发现(服务、组件、版本)三、漏洞发现(获取权限) 8082端口/HTTP服务 组件漏洞URL漏洞(目录、文件)80端口/HTTP服务 组件漏洞URL漏…

华为ipv4+ipv6双栈加isis多拓扑配置案例

实现效果:sw1中的ipv4和ipv6地址能ping通sw2中的ipv4和ipv6地址 R2-R4为存IPV4连接,其它为ipv6和ipv4双连接 sw1 ipv6 interface Vlanif1 ipv6 enable ip address 10.0.11.1 255.255.255.0 ipv6 address 2001:DB8:11::1/64 interface MEth0/0/1 inter…

K8S的dashboard使用账号密码登录

原文网址:K8S的dashboard使用账号密码登录-CSDN博客 简介 本文介绍K8S的dashboard使用账号密码登录的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题,吊打面试官&…

服务器数据传输安全如何保障?保障意义是什么?

数据安全,是指通过采取必要措施确保数据处于有效保护和合法利用的状态,以及具备保障持续安全状态的能力。数据安全应保证数据生产、存储、传输、访问、使用、销毁、公开等全过程的安全,并保证数据处理过程的保密性、完整性、可用性。无论是互…

网络安全B模块(笔记详解)- 隐藏信息探索

隐藏信息探索 1.访问服务器的FTP服务,下载图片QR,从图片中获取flag,并将flag提交; ​ 通过windows电脑自带的图片编辑工具画图将打乱的二维码分割成四个部分,然后将四个部分通过旋转、移动拼接成正确的二维码 ​ 使用二维码扫描工具CQR.exe扫描该二维码 ​ 获得一串…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺,4*A53架构,Android 9.0操作系统,搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力,专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…

菱形以及各种组合图形讲解(*#@¥$)

引言: ***形对于新手了解循环以及嵌套循环帮助是非常大的。(以下的题各题之间有关联) 我们最终目的,就是会编程写菱形;看下面的图片 解题思路:运用拆分法,我们将菱形分为4个部分,看…

时间差异导致数据缺失,如何调整Grafana时间与Prometheus保持同步?

Grafana时间如何调快或调慢? 在k8s环境中,常使用prometheusgrafana做监控组件,prometheus负责采集、存储数据,grafana负责监控数据的可视化。 在实际的使用中,有时会遇到这样的问题,k8s集群中的时间比真实…