浅谈RabbitMQ的延迟队列

Part 01、  延迟队列是什么 

延迟队列代表了一种强大的消息传递机制,允许我们在将消息发送至RabbitMQ时,规定它们只能在未来某个预定的时间点被消费。这种特殊类型的消息被简称为"延迟消息"。

以RabbitMQ为例,它允许我们通过延迟队列实现这种消息的延迟传递和消费。通过将消息放入延迟队列,我们可以确保消息在特定时间之后才会被传递给消费者,从而实现了对消息传递的精确控制。这对于构建高效的异步任务调度、定时提醒和实现时间敏感性业务逻辑非常有价值。

Part 02、延迟队列的实现 

延迟队列的实现原理实际上是将消息投递到一个普通队列中,不过该队列具有一项特殊属性:消息的消费被推迟了一段时间。这个延迟时间可以是灵活设定的,也可以是固定的。一旦消息进入队列,一个定时器开始计时;一旦计时器到达设定的时间,消息就会被移送到等待消费的队列中,准备被消费。在RabbitMQ中,提供了x-delayed-message插件为开发者快速实现延迟队列,主要包含以下几步:

1.安装插件: 确保安装了 RabbitMQ。然后,通过执行命令安装并启用 x-delayed-message 插件:

代码段:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

2.创建交换器: 使用 x-delayed-message 插件创建一个延迟交换器(Delayed Message Exchange)。这个交换器将用于处理延迟消息。

代码段:

rabbitmqadmin declare exchange name=delayed_exchange type=x-delayed-message arguments='{"x-delayed-type":"direct"}'

3.发送延迟消息: 当需要发送延迟消息时,将消息发送到刚创建的延迟交换器,并设置消息的延迟时间。这可以通过在消息头中添加 x-delayed-message 属性来实现。

代码段:

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
builder.headers(new HashMap<String, Object>(){{put("x-delay", 1000);}});
AMQP.BasicProperties properties = builder.build();
channel.basicPublish("delayed_exchange", "delayed_routing_key", properties, message.getBytes());

4.创建队列和绑定: 创建一个普通的队列,并将其绑定到延迟交换器上。这样,延迟交换器会根据消息的延迟时间将消息传递给队列。

代码段:

# 创建普通队列
rabbitmqadmin declare queue name=delayed_queue
# 将队列绑定到延迟交换器
rabbitmqadmin declare binding source=delayed_exchange destination_type=queue destination=delayed_queue routing_key=delayed_queu

5.消费消息: 启动一个消费者来从队列中获取延迟消息。一旦延迟时间过去,消息会被传递给消费者。

代码段:

channel.exchangeDeclare("delayed_exchange", "x-delayed-message", true, false, arguments);
channel.queueDeclare("delayed_queue", true, false, false, null);
channel.queueBind("delayed_queue", "delayed_exchange", "delayed_routing_key");
channel.basicConsume(queue=queue_name, on_message_callback=callback, auto_ack=True)
channel.startConsuming()

总的来说,x-delayed-message 插件使得在 RabbitMQ 中实现延迟队列变得更加直观和方便,它允许将消息的延迟时间嵌入消息本身,无需使用TTL和死信队列来处理延迟消息。

Part 03、延迟队列的应用场景 

延迟队列在现代分布式系统中具有广泛的应用场景,下面列举了一些常见的应用场景:

1.红包定时抢夺:在红包抢夺场景中,用户发起红包活动后,可能希望在一段时间后才开始抢夺,而非立即开启。在这种情况下,我们可以将红包信息发送至一个延迟队列。经过预定时间后,系统会自动触发红包的开启,这时用户才能实际参与抢红包活动。这种方式能够更好地掌控红包活动的时间,为用户提供更灵活的体验。

图1红包定时抢夺流程

图1红包定时抢夺流程

2.商品预售:在商品预售流程中,订单需要在未来特定时间点进行处理,如在一段时间后才能进行发货。在这种情况下,我们可以将这类订单置于延迟队列中,待预定时间一到,再进行相应的处理操作。这种方法能够有效地处理那些需要时机掌握的订单,确保在合适的时间点完成相应的任务。

图2商品预售发货流程

图2商品预售发货流程

3.优惠券定时生效:在优惠券管理系统中,存在一些优惠券需要在未来特定时间点才能生效。在这种情况下,我们可以将这些待激活的优惠券置于延迟队列中,待预定时间到达时再进行激活处理。通过这种方式,我们能够灵活地控制优惠券的生效时间,确保在合适的时机为用户提供优惠服务。

图3优惠券生效流程

图3优惠券生效流程

Part 04、 延迟队列的注意事项  

1.延迟队列不要使用太多:使用延迟队列可以在一定程度上减少系统的负载,但是使用过多的延迟队列会导致系统变得更加复杂,维护起来也更加困难。

2.延迟队列可能会导致消息丢失:在RabbitMQ中,当一个带有TTL消息被发送到队列中时,如果队列中的消息太多,或者队列的消费者速度太慢,就会导致消息失效,如果没有使用死信机制,消息就会被丢失。为了避免这种情况发生,我们需要对队列进行监控,及时发现问题并进行处理。

3.设置合适的延迟时间:在使用延迟队列时,需要根据实际需求设置合适的延迟时间。如果延迟时间太短,可能会导致消息延迟效果不明显;如果延迟时间太长,可能会导致系统累积大量的消息,导致负载过高。

Part 05、 总结 

RabbitMQ的延迟队列是一项极具实用性的功能,能够协助我们有效实现定时任务、流量控制以及峰值平滑等关键功能。然而,在利用延迟队列时,必须以谨慎态度对待。必须根据具体需求来设定延迟时间,并且要时刻监测队列内的消息,以避免可能的消息丢失情况。希望今天的技术分享能为大家带来启发。

最后,推荐一款应用开发神器

关于目前低代码在技术领域很活跃!

低代码是什么?一组数字技术工具平台,能基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。它能缓解甚至解决庞大的市场需求与传统的开发生产力引发的供需关系矛盾问题,是数字化转型过程中降本增效趋势下的产物。

这边介绍一款好用的低代码平台——JNPF快速开发平台。近年在市场表现和产品竞争力方面表现较为突出,采的是最新主流前后分离框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3)。代码生成器依赖性低,灵活的扩展能力,可灵活实现二次开发。

以JNPF为代表的企业级低代码平台为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动,还没有了解过低代码的伙伴可以尝试了解一下。

应用:https://www.jnpfsoft.com/?csdn

有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助。

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

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

相关文章

无人值守变电站运维技术模式及应用-安科瑞黄安南

近年来&#xff0c;市场电子资源需求量的逐步上升&#xff0c;使变电系统建设逐步向复杂环境拓展。为保障变电系统运行稳定性及人员管理安全性&#xff0c;无人值班变电站技术运用势在必行&#xff0c;是解决复杂条件下变电设备运行不稳定及人员设备管理效益低下问题的重要核心…

熟练使用 Redis 的五大数据结构:Java 实战教程

入门 入门阶段主要记住 Redis 的命令&#xff0c;熟练使用 Redis 的 5 大数据结构就可以了。 如果没有 Redis 环境&#xff0c;可以直接通过这个网址https://try.redis.io/&#xff0c;很赞&#xff0c;它会给你模拟一个在线的环境可供你尽情使用&#xff01; 熟练使用Redis的…

AIGCA综述: Survey on Video Diffusion Models

论文作者&#xff1a;Zhen Xing,Qijun Feng,Haoran Chen,Qi Dai,Han Hu,Hang Xu,Zuxuan Wu,Yu-Gang Jiang 作者单位&#xff1a;Fudan University;Microsoft Research Asia;Huawei Noahs Ark Lab 论文链接&#xff1a;http://arxiv.org/abs/2310.10647v1 项目链接&#xff1…

1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

&#x1f339;欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 1024程序员狂欢节有好礼 &#x1f6a9;&#x1f6a9;&#x1f6a9;点击直达福利前言一、IT技术 IT Technology《速学Linux&#xff1a;系统应用从入门到精通》《Pytho…

物证管理系统|智物证DW-S404是一套成熟系统

系统背景 我司物证智能管理系统&#xff08;智物证DW-S404&#xff09;是一套成熟系统&#xff0c;依托互3D技术、RFID技术、数据库技术、AI、视频分析技术对物证进行统一管理、分析的信息化、智能化、规范化的系统。 物证是公安或者监狱处理案件的关键凭证&#xff0c;针对过…

cmake工程出现“CMAKE_CUDA_ARCHITECTURES must be non-empty if set.“的解决方法

解决方法1: cmake工程出现“CMAKE_CUDA_ARCHITECTURES must be non-empty if set.“的解决方法 – The CUDA compiler identification is unknown CMake Error at /usr/share/cmake-3.24/Modules/CMakeDetermineCUDACompiler.cmake:602 (message): Failed to detect a defaul…

前端数据可视化之【series、series饼图配置】配置项

目录 &#x1f31f;Echarts配置项&#x1f31f;series&#x1f31f;饼图 type:pie&#x1f31f;写在最后 &#x1f31f;Echarts配置项 ECharts开源来自百度商业前端数据可视化团队&#xff0c;基于html5 Canvas&#xff0c;是一个纯Javascript图表库&#xff0c;提供直观&…

读取不同格式文件中的内容(xlsx,csv,txt,npz,yaml)

1.读取.xlsx中的内容 import pandas as pd# 读取Excel文件 data pd.read_excel(your_file.xlsx) # 替换 your_file.xlsx 为你的文件路径# 现在&#xff0c;data 包含了Excel文件中的数据&#xff0c;可以像访问数据框一样访问和操作它 # 例如&#xff0c;你可以使用 data.he…

计算机网络-计算机网络体系结构-传输层

目录 一、UDP 二、TCP 特点 首部格式 连接管理 可靠传输 流量控制(点对点) 拥塞控制(全局) 三、拥塞控制算法 慢开始&拥塞避免 快重传&快恢复 功能一&#xff1a;提供进程与进程之间的逻辑通信 功能二&#xff1a;复用和分用 功能三&#xff1a;对收到的报…

【MySQL】数据库数据类型

文章目录 1. 整体概要2. 数值类型(有符号) tinyint 创建表(无符号) tinyint 创建表bit类型float 类型(无符号)floatdecimal 3. 二进制类型char类型varchar类型 4. 日期时间日期时间类型 5. string 类型enum类型和set类型enum类型和set类型的查找在枚举中的查找在set中的查找 1.…

openEuler 服务器安装 JumpServer (all-in-one 模式)

openEuler 服务器安装 JumpServer JumpServer 简介什么是 JumpServer &#xff1f;JumpServer 的各种类型资产JumpServer 产品特色或优势JumpServer 符合 4A 规范 JumpServer 系统架构应用架构组件说明 JumpServer 安装部署环境要求网络端口网络端口列表防火墙常用命令 在线脚本…

图论04-【无权无向】-图的广度优先遍历BFS

文章目录 1. 代码仓库2. 广度优先遍历图解3.主要代码4. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 广度优先遍历图解 3.主要代码 原点入队列原点出队列的同时&#xff0c;将与其相邻的顶点全部入队列下一个顶点出队列出队列的同时&#xff0c;将…

Ubuntu18中的连接网络图标恢复

上图的图标不存在&#xff0c;也连不上网。 输入命令停止网络管理 service NetworkManager stop删除网络管理缓存文件 sudo rm /var/lib/NetworkManager/NetworkManager.state重启网络管理 service NetworkManager start修改网络管理文件 gedit /etc/NetworkManager/Ne…

Plonky2:最好的SNARKs和STARKs

1. 引言 Plonky2为Polygon团队2022年1月发起的项目。其定位为ZKP证明系统。 开源代码实现见&#xff1a; https://github.com/0xPolygonZero/plonky2&#xff08;Rust 汇编&#xff09; Plonky2可解锁当今2大主流ZKP类型——SNARKs和STARKs的扩容优势。 每个ZKP证明系统都有…

(一)docker:建立oracle数据库

前言&#xff0c;整个安装过程主要根据docker-images/OracleDatabase/SingleInstance /README.md &#xff0c;里边对如何制作容器讲的比较清楚&#xff0c;唯一问题就是都是英文&#xff0c;可以使用谷歌浏览器自动翻译成中文&#xff0c;自己再对照英文相互参照来制作提前准备…

云HIS系统,Cloud HIS system,云HIS医院信息管理系统源码

通过云HIS平台,可以减少医院投资,无需自建机房和系统,快速实现信息化服务。系统升级及日常维护服务有云平台提供,无需配备专业IT维护人员进行系统维护。 一、his系统和云his系统的区别 His系统和云his系统是两种不同的计算平台&#xff0c;它们在技术架构上存在很大的差异。下…

【产品运营】产品需求应该如何管理

产品项目在进行时经常会有一些需求需要实现&#xff0c;需求是产品更新迭代的动力&#xff0c;需求也是从用户诉求转化而来&#xff1b;在做需求管理时&#xff0c;我们需要判断一个需求的优先级等方面&#xff0c;对产品进行优化&#xff1b; 目录&#xff1a; 一、 为什么要…

图像信号处理板设计原理图:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板

综合图像处理硬件平台包括图像信号处理板2块&#xff0c;视频处理板1块&#xff0c;主控板1块&#xff0c;电源板1块&#xff0c;VPX背板1块。 一、板卡概述 图像信号处理板包括2片TI 多核DSP处理器-TMS320C6678&#xff0c;1片Xilinx FPGA XC7K420T-1FFG1156&#xff0c;1片X…

如何处理前端多语言支持?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Windows环境如何使用Zblog+cpoalr搭建个人网站并远程访问?

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…