浅谈RabbitMQ的延迟队列

news2024/9/17 7:26:20

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.coloradmin.cn/o/1126284.html

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

相关文章

【LeetCode:637. 二叉树的层平均值 | bfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

用nodejs爬虫台湾痞客邦相册

情景:是这样的,我想保存一些喜欢的小伙伴的照片,一张张保存太慢了, 所以我写了个js,放在国外服务器爬,国内的自己解决~ 使用方法 1.点相册随便一张, 复制url, 这张开始接下来的图片都会保存 /*** 2023年10月23日 22:58:44* 支持解析痞客邦相册* 只需要复制相册第一张图片的ur…

uni-app:多种方法写入图片路径

一、文件在前端文件夹中 1、相对路径引用 从当前文件所在位置开始寻找图片文件的路径。../../ 表示返回两级目录&#xff0c;即从当前文件所在的 wind.vue 所在的位置开始向上回退两级。接着&#xff0c;进入 static 目录&#xff0c;再进入 look 目录&#xff0c;最后定位到 …

如何提高决策能力?目标导向是关键

决策能力是一项综合性较强的素质&#xff0c;有信息收集&#xff0c;信息加工处理到信息输出&#xff0c;形成判断和选择的能力。决策能力不仅仅是指职场领导者的决策能力&#xff0c;其实在日常生活中同样需要决策能力&#xff0c;简单的理解就是信息分析&#xff0c;判断和选…

计算机毕设 大数据二手房数据爬取与分析可视化 -python 数据分析 可视化

# 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通…

强化学习代码实战(1)

机器人领域&#xff1a;控制&#xff0c;规划&#xff0c;感知等都可以用&#xff0c;可以把它作为一个优化过程&#xff0c;那么任何需要优化的问题都可以用它解决。 1.应用 深度学习&#xff1a;智能感知&#xff0c;解决智能如何理解这个世界的问题。 强化学习&#xff1a…

RK3588平台开发系列讲解(显示篇)MIPI DSI协议介绍之分层

🚀返回专栏总目录 文章目录 一、MIPI DSI 分层1.1、应用层1.2、协议层1.3、链路层1.4、物理层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 DSI 全称是 Display Serial Interface,是主控和显示模组之间的串行连接接口。 MIPI DSI 接口分为数据线和时钟线,均为…

螺旋矩阵的探索

输出n阶螺旋矩阵中指定位置的元素值 问题描述&#xff1a; 问题分析&#xff1a; 经观察&#xff0c;易知螺旋矩阵由内层至外层依次递减&#xff0c;为以 n 2 n^2 n2为首项&#xff0c;以-1为公差的等差数列 。分奇数阶和偶数阶矩阵分类讨论&#xff0c;分别归纳得 n 2 n^2 n…

大数据Flink(一百零一):SQL 表值函数(Table Function)

文章目录 SQL 表值函数(Table Function) SQL 表值函数(Table Function) Python UDTF,即 Python TableFunction,针对每一条输入数据,Python UDTF 可以产生 0 条、1 条或者多条输出数据,此外,一条输出数据可以包含多个列。比如以下示例,定义了一个名字为 split 的Pyt…

Docker命令手册

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 记录平时用的比较多的Docker命令。 docker学习地址 1、docker停止并删除运行的容器 首先查看…

Postgres 和 MySQL 应该怎么选?

PostgreSQL和MySQL是两个流行的关系型数据库管理系统&#xff08;DBMS&#xff09;。它们都具有一些相似的功能&#xff0c;但也有一些区别。 在选择使用哪个DBMS时&#xff0c;需要考虑多个因素&#xff0c;包括性能、可扩展性、安全性、功能丰富度、生态系统支持等。下面是对…

软件工程第七周

内聚 耦合 (Coupling): 描述的是两个模块之间的相互依赖程度。控制耦合是耦合度的一种&#xff0c;表示一个模块控制另一个模块的流程。高度的耦合会导致软件维护困难&#xff0c;因为改变一个模块可能会对其他模块产生意外的影响。 内聚 (Cohesion): 描述的是模块内部各个元素…

x-ui部署(与宝塔共存)

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 x-ui是一个搭建节点的工具&#xff0c;有一键安装脚本&#xff0c;可以快速的部署。但是如果我…

企业如何保护机密文件安全

企业如何保护机密文件安全&#xff0c;数据加密技术有哪些 随着公司业务的不断发展&#xff0c;公司机密文件的保护是一家公司不可忽视的问题。机密文件包含了企业的核心信息&#xff0c;如客户资料、产品方案、财务数据等。 安企神数据防泄密系统下载试用 企业数据一旦泄露…

Springboot中开启多线程,实现异步非阻塞、异步阻塞、有无返回值的场景

需求背景 近期项目已上线&#xff0c;闲着没事就对功能进行性能测试&#xff0c;测着测着感觉部分功能效果不是很理想&#xff0c;于是就想着使用多线程的方式对部分接口进行优化&#xff0c;顺便在这里记录下如何选择使用多线程。 实现多线程有两种开启方式&#xff1a;分别…

学习笔记-MongoDB(命令增删改查,聚合,权限管理,索引,java使用)

基础概念 1 什么是mogodb&#xff1f; MongoDB 是一个基于分布式文件/文档存储的数据库&#xff0c;由 C 编写&#xff0c;可以为 Web 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库中功…

Linux备份Docker的mysql数据并传输到其他服务器保证数据级容灾

目录 简介什么是容灾 &#xff1f;容灾的分类容灾和备份有什么连系 &#xff1f; 数据级容灾备份步骤1、scp命令&#xff1a;用于Linux之间复制文件和目录2、编写备份数据库脚本3、crontab定时任务执行脚本4、测试 应用级容灾业务级容灾 简介 为了防止客户系统的数据丢失&…

2023Etsy入驻攻略——防封安全

2023了&#xff0c;跨境电商现在上车还来得及吗&#xff1f;当然&#xff01;Etsy是一个低成本低竞争高回报的平台&#xff0c;相较于其他电商平台&#xff0c;他的佣金非常低&#xff0c;利润率更高&#xff0c;非常合适跨境小白入局。 但由于目前Etsy关闭了中国大陆卖家的注…

论文解读:Large Language Models as Analogical Reasoners

一、动机 大模型在各种类型的NLP任务上均展现出惊艳的表现。基于CoT propmt能够更好地激发大模型解决复杂推理问题的能力&#xff0c;例如解决数学解题&#xff0c;可以让模型生成reasoning path。现有的经典的CoT方法有few-shot cot、zero-shot cot等。然后现有的cot面临两个…

C++进阶篇2---多态

1.多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是当不同的对象&#xff0c;去完成某个行为&#xff0c;会产生不同的状态 举个例子&#xff1a;同样是吃饭&#xff0c;狗吃狗粮&#xff0c;猫吃猫粮&#xff0c;不同的对象&#…