IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> (七)消息队列——RabbitMQ的死信交换机、TTL、延迟队列的实现 -> 正文阅读

[Java知识库](七)消息队列——RabbitMQ的死信交换机、TTL、延迟队列的实现

消息队列——死信交换机

一、初识死信交换机:

1、什么是死信队列:

死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。

在其他的MQ产品中,很多是没有交换机的概念的,在这些MQ产品中,死信队列就是Dead Letter Queue。在RabbitMQ中有交换机的概念,所以死信队列指的是死信交换机。

消息发送到交换机,交换机将消息路由到一个设置了过期时间的Queue,当消息没有在过期时间内被消费的时候,这个消息就会通过DLX重新发送到新的队列,进而被消费者消费。
在这里插入图片描述

2、消息什么时候会成为死信:

  1. 队列消息长度到达限制;也就是队列能存10条,但来了11条,第11条消息已经存不进去了,则最早的消息(第一条)则可能成为死信。
  2. 消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false;
  3. 原队列存在消息过期设置,消息到达超时时间未被消费;

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

给队列设置参数:
x-dead-letter-exchange :死信交换机的名称
x-dead-letter-routing-key:死信交换机的routing-key
在这里插入图片描述在这里插入图片描述
RepublishMessageRecoverer策略:在这里插入图片描述死信交换机:可以像Republish一样做一些消息兜底的处理,还可以做一些超市消息的处理。
在这里插入图片描述

二、TTL:

1、什么是TTL:

TTL 全称 Time To Live(存活时间/过期时间)。
当消息到达存活时间后,还没有被消费,消息会成为死信。
RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。

2、设置:

?设置队列过期时间使用参数:x-message-ttl,单位:ms(毫秒),会对整个队列消息统一过期。

? 设置消息过期时间使用参数:expiration。单位:ms(毫秒),当该消息在队列头部时(消费时),会单独判断这一消息是否过期。

? 如果两者都进行了设置,以时间短的为准。

3、实现:

我们声明一组死信交换机和队列,基于注解方式:
在这里插入图片描述要给队列设置超时时间,需要在声明队列时配置x-message-ttl属性:
在这里插入图片描述在这里插入图片描述

发送消息时,给消息本身设置超时时间:
在这里插入图片描述
在这里插入图片描述

三、延迟队列:

1、什么是延迟队列:

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。

2、案例分析:

下单后,30分钟未支付,取消订单,回滚库存

实现如上的案例,用户下单后会在数据库表中添加一条下单的记录。我们创建一个定时任务,比如每隔1分钟就查询这些订单记录,判断这些记录的下单时间和当前的时间相差是否超过30分钟,如果超过,则判断订单的状态,进而决定是否取消订单,回滚库存。

但是上面这种解决方式不够优雅,因为这样解决肯定会存在1分钟的误差,而且总是要查询。

如果使用延迟队列,用户下单后向消息队列发送一条消息,这条消息在30分钟后再被库存系统消费,库存系统消费了这条消息后再去判断订单的状态。这样只有在判断订单状态的时候会去查询一次数据库,不用循环去查询,性能更好。
在这里插入图片描述

3、延迟队列的实现:

RabbitMQ中没有延迟队列的实现,但我们可以使用TTL和死信队列来实现延迟队列。
在这里插入图片描述只需要给正常的队列设置过期时间为30分钟,然后把这个队列绑定到死信交换机,不去消费这些消息,而是让这些消息主动成为死信进而进入死信队列;然后让库存系统去监听死信队列。这样就可以让订单系统发送一条消息,库存系统30分钟后才收到这条消息。

4、使用插件实现延迟队列:

DelayExchange的本质还是官方的三种交换机,只是添加了延迟功能。因此使用时只需要声明一个交换机,交换机的类型可以是任意类型,然后设定delayed属性为true即可。
在这里插入图片描述基于java代码的方式:
在这里插入图片描述
然后我们向这个delay为true的交换机中发送消息,一定要给消息添加一个header:x-delay,值为延迟的时间,单位为毫秒:
在这里插入图片描述在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 12:56:41  更:2022-02-16 12:58:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:45:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码