如何用 RabbitMQ 延迟队列轻松解决定时任务与流量瓶颈?

news/2025/2/28 14:22:41/文章来源:https://www.cnblogs.com/pengrq/p/18743160

延迟队列(Delayed Queue)是消息队列中一种常见的机制,它允许你在指定的时间延迟后再消费消息。这种机制非常适用于需要在某个时间点之后才执行某些操作的场景,例如定时任务、过期任务、限流控制等。

在 RabbitMQ 中,延迟队列并不是一个原生的功能,直到 3.8.0 版本之后,RabbitMQ 引入了一个插件(rabbitmq_delayed_message_exchange)来支持延迟消息。通过这个插件,可以模拟延迟队列的效果。其他消息队列系统如 Kafka 和 ActiveMQ 也提供了类似的延迟队列功能。

延迟队列的核心概念

  1. 消息延迟时间: 延迟队列的核心就是消息的延迟时间。消息被发送到队列后,消费者不能立刻获取该消息,而是必须等待一段时间(根据配置的 TTL)才能消费该消息。
  2. 死信队列: 延迟队列通常与死信队列(DLQ)配合使用。当消息过期(TTL 到期)时,它会被转发到死信队列。这样,我们就能模拟消息的定时投递或延期消费的行为。
  3. 交换机(Exchange): 延迟队列通常需要与一个特殊的交换机类型配合工作。例如,rabbitmq_delayed_message_exchange 插件实现了一个 x-delayed-message 类型的交换机,允许你通过指定延迟时间来推迟消息的消费。

延迟队列的使用场景

  1. 定时任务: 例如,你想在两小时后执行某个操作,可以将消息发送到一个延迟队列中,指定消息的延迟时间。消费者在消息过期后才会处理该消息。
  2. 订单过期处理: 比如,在电商系统中,你可以设置订单未支付的消息在 10 分钟后进入一个延迟队列,等待后续的过期处理。
  3. 流量控制和限流: 在分布式系统中,为了防止瞬时流量过大,可以使用延迟队列将消息的消费时间延迟,控制流量的处理速度,避免系统过载。
  4. 延时通知: 例如,系统需要在用户执行某些操作后延迟发送通知,可以通过延迟队列控制通知的发送时间。

如何在 RabbitMQ 中实现延迟队列

  1. 使用 rabbitmq_delayed_message_exchange 插件

    RabbitMQ 默认不支持延迟队列,因此需要启用 rabbitmq_delayed_message_exchange 插件。这个插件允许你创建一个延迟交换机,并通过消息的 x-delay 属性来指定延迟时间。

  2. 安装插件: 在 RabbitMQ 中启用延迟消息交换机插件:

    rabbitmq-plugins enable rabbitmq_delayed_message_exchange
    
  3. 创建延迟交换机: 创建一个类型为 x-delayed-message 的交换机,通常你会选择 direct 类型的延迟交换机。

    Map<String, Object> arguments = new HashMap<>();
    arguments.put("x-delayed-type", "direct");  // 设置延迟消息交换机的类型
    channel.exchangeDeclare("delayed_exchange", "x-delayed-message", true, false, arguments);
    
  4. 发布带有延迟时间的消息: 在发送消息时,通过设置消息的 x-delay 属性来指定延迟时间。x-delay 的值是消息延迟的毫秒数。

    AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder();
    props.deliveryMode(2);  // 设置消息持久化
    props.expiration("30000"); // 设置消息过期时间(例如 30 秒)
    props.headers(Map.of("x-delay", 5000)); // 设置延迟时间 5 秒
    channel.basicPublish("delayed_exchange", "routing_key", props.build(), messageBody);
    
  5. 消费者消费延迟消息: 消费者只需连接到普通的队列,RabbitMQ 会根据消息的延迟时间将其传递给消费者。

延迟队列的优缺点

优点:

  1. 简单易用:延迟队列可以轻松地在现有的消息队列系统中实现,减少了额外的复杂性。
  2. 灵活性高:通过设置不同的延迟时间,延迟队列适用于多种场景,如定时任务、限流、订单过期等。
  3. 性能较好:与传统的轮询机制相比,延迟队列能够按需调度,避免了不必要的计算和资源消耗。

缺点:

  1. 插件依赖:RabbitMQ 默认不支持延迟队列,需要依赖插件。虽然这个插件比较常见,但并不是所有环境下都可以直接使用。
  2. 性能开销:延迟消息机制会引入一定的性能开销,尤其是在消息队列中有大量延迟消息时,可能会对 RabbitMQ 的性能造成一定影响。
  3. 消息顺序问题:如果你在多个延迟队列之间分发消息,可能会遇到消息消费顺序不一致的问题,特别是当消息之间有依赖关系时。

总结

延迟队列是一个非常有用的功能,尤其适用于需要在某个特定时间之后进行处理的场景。RabbitMQ 提供了通过插件实现延迟队列的功能,通过 rabbitmq_delayed_message_exchange 插件,你可以很方便地使用延迟交换机,设置消息的延迟时间,实现定时任务、过期处理、限流等功能。

但也需要注意,延迟队列的实现可能会引入额外的性能开销,特别是在高并发、高流量的系统中,因此需要谨慎评估使用场景并进行优化。

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

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

相关文章

国家能源集团某煤矿办公网与工业网整合运维

北京智和信通智和网管平台通过跨网络的整合监控运维能力,对某煤矿中的办公网和工业网进行管理。在一个平台内根据网络类型进行区分管理,统一监控。 国家能源集团某煤矿是国家能源集团在晋陕蒙区域的典型现代化井工煤矿,具有丰富的煤炭资源和先进的生产管理模式。 项目…

最长公共子序列LCS 笔记

最长公共子序列LCS 笔记 假设存在两个相同长度平凡的序列,我们希望找到它们最长的公共子序列,在没有其他特殊条件的情况下,利用动态规划计算的时间复杂度为 \(O(n^2)\) ,并且可以记录这个子序列 考虑两个指针作用于两个序列上,记 \(dp_{i,j}\) 表示为连续子序列 \([a_1,a_…

Windows 系统调用学习笔记

依然是 x86 的,照着 lzyddf 师傅的 blog 和 OneTrainee师傅的blog 学的 Windows API Application Programming Interface,简称 API 函数。Windows API 是微软为 Windows 操作系统提供的一组函数、数据结构、常量和协议,允许开发者与操作系统进行交互。通过 Windows API,开发…

作业一:自我介绍+软工五问

作业一这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 学习使用github和博客园自我介绍、兴趣爱好 我叫梁鑫…

deepseek---官方API接入

最近deepseek又开放充值了,而且还大降价,果断接入: 1、首先就是去充值,然后获取key 2、打开接口文档-找到合适自己的语言接口 3、直接复制代码就能运行<?php$curl = curl_init();curl_setopt_array($curl, array(CURLOPT_URL => https://api.deepseek.com/chat/comp…

香港服务器选择指南:高防 vs 站群 vs GPU场景解析

一、引言 背景:香港作为亚太地区数据中心枢纽,凭借国际带宽、网络自由、法律完善等优势,成为企业全球化布局的首选节点。 目标:解析香港服务器在不同业务场景下的选择逻辑,帮助企业根据需求匹配高防、站群或GPU服务器。 二、香港服务器的核心优势 | 网络自由性:| 国际带…

大模型常见文件格式safetensors vs. gguf

safetensorsHeader: 文件的元数据(大小、版本) Meta data: 列表,每个元素表示文件里存的张量的类型、形状、偏移量 Tensor data: 列表元素对应的张量数据ggufgguf不依赖外部的配置文件,它可以把配置文件、词表、tokenizer、template等存入gguf中(如果一个模型有多个gguf文…

2025年最值得入手的CRM系统!这5款真的好用不踩坑

挑CRM真让人头大!有的太复杂,上手难 有的功能太少,啥都干不了 有的收费离谱,小团队根本用不起别担心!今天就给大家盘点5款2025年最值得入手的CRM系统,每一款都是真实用户口碑不错的,不管你是创业小团队,还是大公司,这里面肯定有一款适合你。 ​​ 一、简道云CRM 如果你…

web开发 辅助学习管理系统开发日记 day4

/**法法法!!!忘记保存发布了,写了一天的草稿直接没了,我晕死,今天补档昨天的吧。 */今天开始开发员工管理模块了,也得知了3月14有校招的消息,看来要加快进度了(╯▔皿▔)╯ Q1:今天调了一个时间最长的bug,在写分页查询的时候我将三层架构全部写完之后,运行程序下面报…

Web前端入门第3问:前端需要学习哪些技术?

Web前端开发技术学习路径基础知识必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了。进阶知识必须会一门主流的前端框架,比如:React/Vue/Angular/Svelte,就国内的从业环境来看,Vue占有绝对优势,后续也会写一些 vue 相关的文章…

Web前端入门第1问:英语是否很重要?有哪些前置条件?

HELLO,这里是大熊学习前端开发的入门笔记。 本系列笔记基于 windows 系统。 在入门之前,是否有这样的疑问: 程序员的英语是否很牛?毕竟程序员的代码像天书一样,比如这样:答案是否定的。 英语并不是编程的前置条件,不要被看似天书的代码吓到,程序代码都存在一定的语法结…

红外成像工具 非接触式热成像仪 高精度温度测量与多功能应用

红外成像工具 非接触式热成像仪 高精度温度测量与多功能应用IFD-x是一款非接触式热成像仪器,采用红外阵列高精度温度传感器和先进的软件算法。该设备能够对视场范围内的物体进行红外成像,成像分辨率达到512*384像素,温度灵敏度为0.1℃,绝对精度为1.5℃,刷新频率最高可达64…