RabbitMQ实现定时/延迟任务

方案选择实现方式(两种)

  1. 基于死信队列实现
  2. 基于插件实现

实现缺陷:不一定准时投送,当某一个时间堆积大量消息,那包会有延迟的

基于死信队列有这样一个场景,当我是基于消息设置过期时间,第一个投送到空队列的过期时间设置为1h,第二个设置为2m,由于是顺序队列,会导致第二个消息被阻塞,所以基于死信队列还是适合固定时间的延迟

那建议还是用插件实现,插件可以实现自定义消息过期时间,利用了一种类似于优先队列的数据结构(具体不了解),虽然依然是监控队首,但是内部消息是根据过期时间长短来决定队首消息的

实现原理

RabbitMQ 插件

rabbitmq_delayed_message_exchange 插件为每个消息维护独立的延迟计时器。当消息发送到使用该插件的交换器时,插件根据消息 headers 中设置的 x - delay 值启动计时任务,延迟时间到达后将消息路由到目标队列。它类似于利用一个优先队列来管理消息,按照延迟时间对消息排序,延迟时间短的消息优先处理。

对比RocketMQ

RocketMQ 采用延迟队列和定时任务调度实现定时消息。生产者发送的定时消息先被存储到特殊的延迟队列,这些延迟队列按预设的延迟级别划分,每个级别对应固定延迟时间。RocketMQ 的定时任务周期性检查延迟队列,当消息延迟时间到达,将其从延迟队列取出并发送到目标主题的正常队列。

相关推荐
LCG元28 分钟前
RAG工程指南:从基础检索到生产部署全解析
java·运维·数据库
石榴树下的七彩鱼41 分钟前
医疗票据 OCR 识别 API 多场景落地指南:医保结算 + 商保理赔 + 医疗信息化(附 Python/Java 完整示例)
java·python·ocr·石榴智能·医疗票据ocr·医保结算·ocrapi
C137的本贾尼1 小时前
Spring AI Alibaba 开箱:国产百炼大模型初体验
java·人工智能·spring
金銀銅鐵1 小时前
[Java] 如何理解 class 文件中字段的 access flags?
java·后端
小短腿的代码世界1 小时前
Qt国际化深度解析:从源码到企业级多语言实践
java·数据库·qt
凌冰_2 小时前
IDEA 集成Claude Code
java·ide
SXJR2 小时前
Java中的Cross-Encoder模型解决方案
java·开发语言
彦为君2 小时前
JavaSE-11-BIO/NIO/AIO(多人聊天室)
java·开发语言·python·ai·nio
计算机安禾2 小时前
【c++面向对象编程】第43篇:可变参数模板(C++11):优雅处理不定长参数
java·开发语言·c++
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第69题】【JVM篇】第29题:GC Roots 有哪些?
java·开发语言·jvm·面试