网易首页 > 网易号 > 正文 申请入驻

0插件!用2个原生参数实现RabbitMQ任意延迟消息

0
分享至

消息架构中,延迟投递几乎是绕不开的需求:用户注册后等两小时自动发送欢迎邮件,支付接口临时挂掉需要十分钟后再重试。面对这类场景,很多团队立刻会想到官方的延迟消息插件(rabbitmq-delayed-message-exchange),开箱即用。可一旦跑到 AWS Amazon MQ 这类托管云服务上,第三方插件被严格禁止,这条路就断了。不用插件,一套纯原生的延迟投递方案能不能做得同样优雅?

实际上,在长期维护消息中间件的实践中,已经有人找到了一种完全内建的解法。onkai-unified-bus 项目给出的拓扑设计,把 RabbitMQ 内建的两个机制串了起来:消息生存时间(Time-To-Live,TTL)和死信交换(Dead-Letter Exchange,DLX)。这两件工具原本分别处理超时和失败消息,但稍加配置,就能配合演出一场“先暂存、再路由”的延迟好戏。

整条延迟链路可以拆成四步。第一步,应用先把事件投递到一个特殊的临时队列,它不绑定任何消费者,唯一的使命就是当消息的“临时停车场”。第二步,声明这个队列时,设置参数 x-message-ttl,值恰好等于想要的延迟毫秒数——这相当于告诉代理:每条消息在此最多停留这么久。第三步,再给这个队列挂上死信交换属性 x-dead-letter-exchange,把目标指向主业务交换器,比如 main-event-exchange。第四步,顺手配上 x-dead-letter-routing-key,精确指向最终的路由键,如 notifications.send。一旦 TTL 倒计时归零,消息代理的内核就会把消息从临时队列中“驱逐”出去,自动送进配置好的死信交换器;死信交换器接管后,再按照自己的路由绑定规则,原封不动地转交到真正的目标队列,等待消费者处理。

在这条管道里,生产者完全不必感知底层的弯弯绕,它只照常向那个临时队列发消息;消费者也依旧订阅原始的目标队列,无需任何额外适配。一个隐式的延迟引擎就这么悄悄搭好了——没装任何插件,没侵入业务逻辑,只是把已有队列参数用出了新高度。

用代码说话的话,下面这段 Go(amqp091-go 客户端)函数就是对上面步骤的直译。函数名 SetupDelayedTopology,接收 AMQP 通道和以毫秒为单位的延迟时长。它第一件事是动态拼出延迟队列的名字,形如 delay-queue-{毫秒数}ms,方便同一套拓扑同时支撑多种延迟粒度。接着调用 ch.QueueDeclare,声明成持久化、非自动删除、非排他、非不可等待的队列,并把三个关键参数放进 amqp091.Table:x-message-ttl、x-dead-letter-exchange 和 x-dead-letter-routing-key。队列一旦建好,函数就把队列名返回给调用方,生产者拿到具体投递地址后即可正常发送。

这一小段逻辑没有依赖任何特权接口,用到的 QueueDeclare 参数和 Arguments 全部属于 AMQP 0-9-1 协议的标准公开部分。直接好处就是彻底消除了对 broker 端插件的依赖:本地 Docker 里的单节点 RabbitMQ、最保守的托管云实例,这套拓扑都原样跑通。同时,消息代理内核本身对持久化消息和队列元数据的强保证机制,让节点重启或网络抖动之后,待投递的消息也不会丢失,整个延迟调度依然牢靠、可预期。

另一个不能忽视的便利是延迟时长的多粒度支持。既然每条延迟队列的 TTL 在创建时一次性确定,不同延迟需求自然对应不同的队列名:比如 delay-queue-60000ms 管 1 分钟,delay-queue-1800000ms 管 30 分钟。业务消息只需按自身需要,由生产者直接选路到相应的延迟队列,互不干扰。相比依赖特定插件,这种以队列粒度为延迟刻度的原生设计,更简洁,也更普适。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
绿源电动车旗舰店被指擦边营销:多条视频已删除 客服致歉

绿源电动车旗舰店被指擦边营销:多条视频已删除 客服致歉

中国能源网
2026-06-30 18:35:06
晋级了!哈兰德破门绝杀!率队闯进世界杯16强

晋级了!哈兰德破门绝杀!率队闯进世界杯16强

乌龙球OwnGoal
2026-07-01 03:21:10
梅洛:日本教练表现得像个懦夫,安切洛蒂展现了他不同的执教风格

梅洛:日本教练表现得像个懦夫,安切洛蒂展现了他不同的执教风格

画夕
2026-06-30 08:15:03
疯狂2-1!哈兰德绝杀,挪威队史淘汰赛首胜,1/8决赛战五星巴西

疯狂2-1!哈兰德绝杀,挪威队史淘汰赛首胜,1/8决赛战五星巴西

全景体育V
2026-07-01 04:58:13
郑丽文遭“黑色星期一”:民调崩了不算完,40年闺蜜直播“补刀”

郑丽文遭“黑色星期一”:民调崩了不算完,40年闺蜜直播“补刀”

可爱小菜
2026-06-30 17:44:30
烧好7道菜,婆婆打包5份送大姑姐,我倒掉剩菜买返程票,老公急了

烧好7道菜,婆婆打包5份送大姑姐,我倒掉剩菜买返程票,老公急了

麦子情感故事
2026-06-30 22:29:06
Shams:詹姆斯加盟勇士只有一个条件,就是勇士交易引进浓眉

Shams:詹姆斯加盟勇士只有一个条件,就是勇士交易引进浓眉

懂球帝
2026-06-30 09:24:29
受权发布|中华人民共和国国务院令  第840号

受权发布|中华人民共和国国务院令  第840号

新华社
2026-06-30 17:02:09
里子面子都丢了!管不住下半身的任素汐,一场演唱会撕下她的体面

里子面子都丢了!管不住下半身的任素汐,一场演唱会撕下她的体面

阿伧说事
2026-07-01 02:14:18
日本又倒在淘汰赛,由不得你不信,中国足球才是亚洲未来

日本又倒在淘汰赛,由不得你不信,中国足球才是亚洲未来

兵哥篮球故事
2026-06-30 17:32:12
董卿父亲发文悼念亡妻,句句不提女婿,却句句都是对密春雷的寒心

董卿父亲发文悼念亡妻,句句不提女婿,却句句都是对密春雷的寒心

可爱小菜
2026-07-01 01:42:50
2分钟内就相撞!东沙爆发对峙,海巡署舰开足马力冲向大陆海警船

2分钟内就相撞!东沙爆发对峙,海巡署舰开足马力冲向大陆海警船

阿龙聊军事
2026-06-28 08:23:30
重磅签约!谢谢你,维金斯!1.1亿降至6400万

重磅签约!谢谢你,维金斯!1.1亿降至6400万

篮球实战宝典
2026-06-30 19:04:23
美军攻击伊朗革命卫队后,霍尔木兹海峡的航运交通顺畅很多

美军攻击伊朗革命卫队后,霍尔木兹海峡的航运交通顺畅很多

一种观点
2026-06-29 15:21:59
“认清自己位置!”巴西前锋赛后回击日本:绝不容有人骑我们头上

“认清自己位置!”巴西前锋赛后回击日本:绝不容有人骑我们头上

风雨与阳光
2026-06-30 15:32:51
2026出梅时间已定,7月上旬正式告别梅雨,今年盛夏是烤还是蒸

2026出梅时间已定,7月上旬正式告别梅雨,今年盛夏是烤还是蒸

三农雷哥
2026-06-30 15:51:27
世界杯头号水货!德国 1 亿巨星彻底翻车,离谱失误葬送全队

世界杯头号水货!德国 1 亿巨星彻底翻车,离谱失误葬送全队

澜归序
2026-06-30 08:55:27
特朗普急了,台积电也慌了,美国工厂芯片成本,是中国的241%

特朗普急了,台积电也慌了,美国工厂芯片成本,是中国的241%

可爱的巴比龙
2026-06-30 19:53:05
俄罗斯预警的事果然发生了,美国以切断天然气供应为由,威胁欧盟

俄罗斯预警的事果然发生了,美国以切断天然气供应为由,威胁欧盟

起喜电影
2026-06-30 01:40:33
毕业即失业!这10个理工类烂专业,分数再高也别乱报

毕业即失业!这10个理工类烂专业,分数再高也别乱报

户外阿毽
2026-06-30 00:25:16
2026-07-01 05:12:49
固件更新中
固件更新中
有态度网友ytd
268文章数 51关注度
往期回顾 全部

科技要闻

iPhone18 Pro遭泄密!印度代工商惹祸

头条要闻

坎贝尔承认:中国是最成功渡过难关的国家

头条要闻

坎贝尔承认:中国是最成功渡过难关的国家

体育要闻

德国足球,脸都不要了

娱乐要闻

黄晓明沦陷!羡慕周杰伦能降住昆凌

财经要闻

万亿“寒王”,历史时刻

汽车要闻

奇瑞风云A9探店 五个理由一定来看看

态度原创

旅游
健康
游戏
房产
军事航空

旅游要闻

别只知道曲靖爨碑,城北这条老街,才是藏在身边的文化宝藏!

狂吃“糯叽叽”小心肠梗阻!

线下宣发落地!知名连锁品牌曝光《GTA6》专属活动

房产要闻

TOP10单盘狂卖210亿!海南楼市,上半年热销榜单出炉

军事要闻

以色列防长:穆杰塔巴已被列入死亡名单

无障碍浏览 进入关怀版