RabbitMQ消息过期时间设置多值最佳实践

前言

电商平台里订单支付超时逻辑使用了 RabbitMQ的消息生存时间特性(Time to Live),如果订单设置的超时时间相同时候没有问题 ,当业务变化 当需要支持不同过期时间时候 就会出现较短的过期时间 订单不消费情况,后来发现因为时间较长的处于消息队列头部 没有到过期时间 导致后进入消息队列的短的过期时间订单也没办法起作用。此问题可以通过消息过期时间不同发到不同的 消息队列来实现。

名词解释

消息生存时间(Time to Live): 指消息在消息队列的存活时间,超过指定时间 则消息会被消息队列 丢弃或者郊游其他队列处理

死信队列: 死信 是指 消息的生存时间已经过了 的消息,死信队列 是指死信的队列载体 通过设置参数 可以对过期消息再次发布到另一个队列进行处理

实现逻辑


如上图所示 不同的过期时间 发到不同的队列 ,时间过期后通过交换机B再此发到队列M 最后到达消费者

其中 交换机A与交换机B可以是同一个

根据业务动态生成队列信息

因为不同的死信队列 绑定到交换机时 要指定不同的路由key 所以 死信队列和对应的路由key是在发布时根据业务信息动态生成的

如上图 num是参数传进来的 过期时间 根据此过期时间 动态生成队列 并设置消息过期后 发送到的 交换机 testExchange 和 路由key receiveTTlQueueRoutKey

此时生成的队列为 dynamicQueue+num

动态绑定

将队列 dynamicQueue+num 绑定到testExchange 并设置 路由key dynamicQueueRoutkey_+num

消息发送

消息发送时候 记得指定队列 dynamicQueue+num绑定的 交换机 testExchange 和路由key dynamicQueueRoutkey_+num

接收过期消息队列声明及绑定

当消息过期后 会由另一个消息队列接收 这个队列是不变的 可在配置类里创建

在第二张图里 我们设置了 x-dead-letter-routing-key 为receiveTTLQueueRoutKey 所以过期消息会发到 receiveTTLQueue

动态生成队列代码概览

如下图

运行效果

我们输入

http://127.0.0.1:8021/sendMessage/dynamicMessage/6000

看下rabbitmq管理后台

看下发送 和接收消息打印 刚好是发送消息 6s消费者收到消息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容