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 

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

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

相关文章

《MySQL系列-InnoDB引擎06》MySQL锁介绍

文章目录 第六章 锁1 什么是锁2 lock与latch3 InnoDB存储引擎中的锁3.1 锁的类型3.2 一致性非锁定读3.3 一致性锁定读3.4 自增长与锁3.5 外键和锁 4 锁的算法4.1 行锁的三种算法4.2 解决Phantom Problem 5 锁问题5.1 脏读5.2 不可重复读5.3 丢失更新 6 阻塞7 死锁 第六章 锁 开…

深度解析Cron表达式:精确控制任务调度的艺术

深度解析Cron表达式:精确控制任务调度的艺术 希望我们都可以满怀期待的路过每一个转角 去遇见 那个属于自己故事的开始 去追寻那个最真实的自己 去放下 去拿起 安然,自得,不受世俗牵绊… 导言 在计算机科学领域,任务调度是一项关…

openssl3.2 - 官方dmeo学习 - server-cmod.c

文章目录 openssl3.2 - 官方dmeo学习 - server-cmod.c概述配置文件格式样例笔记END openssl3.2 - 官方dmeo学习 - server-cmod.c 概述 从配置文件中读参数, 建立TLS服务器, 死等客户端来连接. 客户端连接后, 打印客户端发来的内容. 配置文件格式有要求 配置文件格式样例 # …

MySQL 8.0中新增的功能(十)

XA语句的复制过滤 以前,在使用--replicate-do-db或--replicate-ignore-db时,无论binlog_format的值如何,XA START、XA END、XA COMMIT和XA ROLLBACK语句都会由默认数据库进行过滤,这可能会导致事务被忽略。从MySQL 8.0.31开始&am…

【PyQt5设计】:自动点击神器 - 解决重复性的点击和输入操作

文章目录 自动点击神器介绍测试窗口介绍自动点击神器的使用教程资源领取注意事项 自动点击神器介绍 本次使用PyQt5设计的【自动点击神器】旨在解决重复性的点击工作,解放双手,具有及时性和准确性,可选择坐标位置或图片两种方式实现鼠标的定位…

CMake入门教程【高级篇】编译器优化级别

文章目录 1. 什么是编译器优化级别?2. 如何在CMake中设置编译器优化级别?3. 如何跨平台设置编译器优化级别?4. 如何根据构建类型设置编译器优化级别?结论1. 什么是编译器优化级别? 编译器优化级别是编译器在编译代码时,对代码进行优化的程度。优化级别可以影响代码的执行…

uniapp如何分包加载

在uni-app中,可以通过配置manifest.json文件来实现分包加载。以下是具体操作步骤: 在项目根目录下找到并打开manifest.json文件。在"uni-app"节点中,找到并修改"subPackages"节点,添加需要分包的页面路径。 …

Python(35):Python3 通过https上传文件和下载文件

Python(35):Python3 通过https上传文件和下载文件 Python http方式的下载,参考:https://blog.csdn.net/fen_fen/article/details/113753983 https需要先安装需要的模块 1、上传示例 1.1、调用: upload_strategy(access_token,"123456789") 1.2、上传代码 g…

横版动作闯关游戏:幽灵之歌 GHOST SONG 中文版

在洛里安荒凉的卫星上,一件长期休眠的死亡服从沉睡中醒来。踏上发现自我、古老谜团和宇宙骇物的氛围2D冒险之旅。探索蜿蜒的洞穴,获得新的能力来揭开这个外星世界埋藏已久的秘密。 游戏特点 发现地下之物 探索这个广阔而美丽如画,充满密室和诡…

一个常用的项目架构图

给大家分享一个常用的架构图,需要使用的可以免费那走: 用户通过公网IP或者域名访问,穿过防火墙后,映射到nginx组件,在反向代理到各个模块;资源放在Nas盘,数据放在各个中间件;各个模块…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin 手指在上面的图上移动,“剪切”出上面图中以手指触点为中心的图(半径图),然后在下面的ImageView显示。 impor…

中国大学生计算机设计大赛—人工智能实践赛赛道—赛后感想

1.比赛介绍 中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一,是全国普通高校大学生竞赛排行榜榜单赛事之一。自2008年开赛至2019年,一直由教育部高校与计算机相关教指委等或独立或联合主办。大赛的目的是以赛促学、以赛促教、以赛促创&…

【技能拾遗】——如何寻找/制作电子书

📖 前言:无纸化学习已经越来越流行了,尤其是这几年大家上网课,把厚厚的课本和笔记装进pad里面,其便利性想必大家都深有感受。但是还有不少同学不知道该如何去找正规教材的PDF版本,下面就以我这两年的无纸化…

RTL编码(1)——概述

一、RTL级描述 RTL(Register Transfer Level)级:寄存器+组合逻辑,其功能与时序用Verilog HDL(以下简称Verilog)或VHDL代码描述。 RTL描述包含了同步数字电路最重要的三个特征:组合逻…

SQLServer 系统概述

目录 1.SQL语言的发展和特点 2.SQL语言的特点 1.SQL语言的发展和特点 SQL是利用一些简单的语句构成的基本语法,来存储数据库的内容。目前已经成为关系型数据库系统中使用最广泛的语言。 1974年SQL语言由Boyce和Chamberlin提出来。 1975~1979年研制了著名的关系数…

外贸自建站新手教程指南?海洋建站的技巧?

外贸自建站怎么做比较好?搭建外贸网站的参数有哪些? 外贸自建站成为许多企业迈向国际市场的重要一步。随着全球经济的不断发展,搭建一个专业而有效的外贸自建站对企业而言至关重要。海洋建站将为您提供一份详尽的新手教程指南,帮…

通过Studio 3T对Mongodb进行 创建数据库/集合 增删查改集合文档操作

首先 你需要安装Studio 3T 以及启动 Mongodb服务 具体可以参考我的文章 Studio 3T客户端连接Mongodb数据库服务 我们之前 通过 use 数据库名随便输切换是可以的 但除了这里能看到的 它们都仅存在于内存 我们右键顶部菜单 选择 添加数据库/创建数据库 这里 我们输入数据库名称…

HarmonyOS自定义组件生命周期函数介绍

aboutToAppear 在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。 aboutToDisappear 在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变…

【Leetcode】253.会议室II

一、题目 1、题目描述 给你一个会议时间安排的数组intervals,每个会议时间都包括开始和结束时间 intervals[i] = [starti,endi],为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。 示例1: 输入:intervals = [[0,3…

rust中Atomic Ordering含义总结

Relaxed 最基础的内存排序要求,只要求当前原子操作是要么完全执行,要么还未执行,其操作结果的可见性同步在其他线程没有任何顺序的保证Acquire 适用于读取数据操作,要求: 当前线程不能有其他的读或写被 reorder 在 loa…