RabbitMQ--延迟队列--使用/原理

news2024/11/17 1:50:39

原文网址:RabbitMQ--延迟队列--使用/原理_IT利刃出鞘的博客-CSDN博客

简介

        本文介绍RabbitMQ的延迟队列的用法。

        本内容也是Java后端面试中常见的问题。

概述

        延迟队列用来存放延迟消息。延迟消息:指当消息被发送以后,不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费。

        在AMQP协议中,或者RabbitMQ本身没有直接支持延迟队列的功能,但是有两种方案来实现:

  • 方案1:采用rabbitmq-delayed-message-exchange 插件实现。(RabbitMQ 3.6.x开始支持)
    • 推荐。原因:它解决了死信队列的消息投递问题:在第一条消息成为死信之前,后面的消息即使过期也不会投递为死信。
  • 方案2:通过前面所介绍的DLX和TTL模拟出延迟队列的功能。
    • 不推荐。原因:死信队列的设计目的是为了存储没有被正常消费的消息,便于排查和重新投递。死信队列没有对投递时间做出保证,在第一条消息成为死信之前,后面的消息即使过期也不会投递为死信。

        在图1-2中,不仅展示的是死信队列的用法,也是延迟队列的用法,对于queue.dlx这个死信队列来说,同样可以看作延迟队列。假设一个应用中需要将每条消息都设置为10秒的延迟,
生产者通过exchange.normal这个交换器将发送的消息存储在queue.normal这个队列中。消费者订阅的并非是queue.normal这个队列,而是queue.dlx这个队列。当消息从queue.normal这个队列中过期之后被存入queue.dlx这个队列中,消费者就恰巧消费到了延迟10秒的这条消息。

        在真实应用中,对于延迟队列可以根据延迟时间的长短分为多个等级,一般分为5秒、10秒、30秒、1分钟、5分钟、10分钟、30分钟、1小时这几个维度,当然也可以再细化一下。

        以下图(图2-1)为例进行说明。为简化,只设置5秒、10秒、30秒、1分钟这四个等级。根据需求的不同,生产者发送消息的时候通过设置不同的路由键,将消息发送到与交换器绑定的不同的队列中。这里队列也分别配置了DLX和相应的死信队列,当相应的消息过期时,就会转存到相应的死信队列(即延迟队列)中,这样消费者根据业务自身的情况,分别选择不同延迟等级的延迟队列进行消费。

图2-1

使用场景

延迟队列的使用场景有很多,比如:

  • 用户下订单场景:用户下单后有30分钟的时间支付,若30分钟内没有支付,则将这个订单取消。
    • 方案:用户下单后将取消订单的消息发送到延迟队列,延迟时间设置为30分钟。取消订单这个消息的订阅者程序在30分钟后收到消息,判断该订单的状态是否为已支付,若还没支付,则将该订单状态设置为:已取消。
  • 定时遥控场景:用户想用手机远程遥控家里的智能设备在指定的时间工作。
    • 方案:假设用户想要的操作是:开启热水器。首先,将开启热水器这个消息发送到延迟队列,延迟时间设置到用户想要的时间到现在时间的差值。开启热水器这个消息的订阅者程序在指定时间收到消息,再将指令推送到智能设备。

        需要注意的是,延迟队列的消息是不能取消的,解决方案是:在消费消息的时候判断这个消息对应的业务的当前状态。例如:对于取消订单来说,收到消息时,读取这个消息所对应的数据库信息,如果已经是已付款状态了,就不进行任何操作了,如果是未支付状态,则改为已取消。

其他网址

《RabbitMQ实战指南》=> 4.4 延迟队列

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

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

相关文章

业务:财会业务知识之借贷记账法

一、为什么要学习借贷记账法 如果你是一位金融行业的IT从业者,那你经常会接触到借贷的概念,只要复式记账的概念,其实也够用了,在记录交易流水时,跟业务问清楚哪些交易记录哪个借贷符号,记录哪些科目既可以…

【Java】从0开始个人网站建立(三)博客主页文章分页查询,预览显示

(一)工程建立到登录与认证-Spring boot、Shiro、Mybatis-Plus、MySql (二)博客显示与登录后按钮按照Shiro授权显示加载html (三)博客主页文章分页查询,预览显示 五、文章分页查询、预览显示 5…

Discrete Optimization课程笔记(3)—局部搜索

目录​​​​​​​ 1.局部搜索(Local Search) Case1: The Queens problem(Max/Min-Conflict) 2.邻域交换(swap neighborhood) Case2: Car Sequencing problem(number of violations) Case3: The Magic Square Problem(degree of violations) ​​​​​​​3.旅行商问题…

【Linux】进程的概念|查看进程的方法|子进程

文章目录基本概念“先描述”进程(PCB)task_ struct内容分类“再组织”进程最终结论:如何查看进程方法一:方法二:通过系统调用获取进程标识符通过系统调用创建进程子进程(fork)实验一&#xff1a…

Java基于PHP+MySQL客户信息管理系统的设计与实现

随着我国经济的发展,越来越多的企业出现,但是相对企业来说客户才是企业的根本,如何能够更好的当下的客户信息进行管理,是很多企业一直以来所关心的问题,如果对客户的信息不够重视最终将会使企业在激烈的竞争中失去活力,为此我们开发了本客户信息管理系统。 本客户信息管理系统采…

IB究竟在考什么?IB真的有传闻中的那么难吗?

提起学习“国际课程之王”IB的感受,学生们估计都能开一个“吐槽大会”了,IB很难,不少人学IB,GET到的第一个技能,就是“熬夜”。▲IB学生做的搞笑图:凌晨三点,唯一一扇亮着灯的窗户一定是属于IB学…

安装与调试Dragonfly实现自动化测试项目

通过ASP.NET Core Selenium 实现 Web 自动化平台 1、获取项目 从Gitee上拉取代码到本地。地址: 点击这里 有多种方式拉取,我使用的zip下载方式。 2、解压运行 这里我是在F盘新建了一个文件夹,只放这一个项目。 点击解压文件,找到“.sln”…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生社团管理系统9p5w4

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了,确实,从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做,创…

逻辑回归-为什么模型会更加侧重于学习那些数值比较大的列

np.random.seed(24)features,labels arrayGenReg(w[1,-1,1])将第一个特征取值调大100倍 features[:,:1] features[:,:1] * 100 features --- array([[ 132.92121726, -0.77003345, 1. ],[ -31.62803596, -0.99081039, 1. ],[-107.08162556, -1.43…

python爬取网页内的指定内容-不需要技术一样爬取网页详细教程

爬虫文章采集,我们怎么利用爬虫采集自己想要的文章内容,我们需要学习python爬虫吗?如果完全靠自己自学,又是从零基础开始学习Python的情况下,按照每个人的学习和理解能力的不同,我认为大致上需要半年到一年…

【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)

麻了,之前写的博客全是收藏,没人点赞,来点赞行不行! GitHub同步更新(已分类):Data_Structure_And_Algorithm-Review 公众号:URLeisure 的复习仓库 公众号二维码见文末 以下是本篇…

我国火箭回收历程介绍

引言 火箭回收技术对于节约火箭发射成本具有重要意义,中国的火箭回收技术研发步履不停,本文将总结中国的可重复使用发动机和垂直回收火箭发展现状,数据更新时间为2022年11月11日。如需了解火箭回收相关概念. 提示:本文图片和表格…

Loss模块

导入包 from utils import cos_sim, euclidean_dist 方法 EucSoftmax 变量 “”"Calculate cos distance loss. Args:protos: protos vector in now episode (**class_size, hidden_size**)querys: queres vector to classify **(querys_len, hidden_size)**querys_y…

深浅拷贝的区别?如何实现一个深拷贝?

一.数据类型存储 js中存在两大数据类型: 基本数据类型:保存在栈内存中; 引用数据类型:保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中。 二.浅拷贝 浅拷贝:…

CRM系统的功能有哪些?

**CRM系统**的功能有:1、联系人管理;2、沟通跟踪;3、潜客管理;4、电子邮件集成;5、文档管理;6、报价/提案管理;7、商机管理;8、工作流自动化;9、报表/分析;10…

利用Seagate service获得system shell

这是挖掘 CVE-2022-40286 漏洞的记录。 闲来无事,我上网随便找了一个驱动来进行测试。我想找一个知名公司的产品,但是又不能是太偏太难懂的东西。 我最先发现了一个叫"Seagate Media Sync"的软件,这是一个将文件复制到希捷无线硬…

SR-MPLS技术基础讲解

目录 SR-MPLS基础概念 使用Segment Routeing MPLS技术的优点 Segment Routeing MPLS的基本原理 SRGB Segment ID Bind SID 粘连标签 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展…

pyinstaller瘦身指南

目录说明无优化直接打包优化:创建专用虚拟环境原因分析和总结说明 之前写了一个自动化办公的python脚本,按需求打包exe。经过不断优化打包过程,把26.1MB的文件变成了9.5MB的文件。 打包工具pyinstaller。 安装: pip install pyi…

Ubuntu1804里进行KITTI数据集可视化操作

需要做的准备工作 1、需要提前安装kitti2bag(终端输入即可安装) pip install kitti2bag 如果没有pip,按照Ubuntu给的提示先安装pip 2、下载kitti数据集(下载圈出的两部分) kitti数据集的百度网盘链接 kitti数据集链接_FYY2LHH的博客-CSDN博客 文件存放位置如图 上图…

Android Material Design之Chip, ChipGroup(十二)

效果图 资源引入 implementation com.google.android.material:material:1.4.0属性 Chip 属性描述android:id控件idstyle样式属性系统默认4种 1.style/Widget.MaterialComponents.Chip.Entry 2.style/Widget.MaterialComponents.Chip.Choice3.style/Widget.MaterialCompon…