前言
电商平台里订单支付超时逻辑使用了 RabbitMQ的消息生存时间特性(Time to Live),如果订单设置的超时时间相同时候没有问题 ,当业务变化 当需要支持不同过期时间时候 就会出现较短的过期时间 订单不消费情况,后来发现因为时间较长的处于消息队列头部 没有到过期时间 导致后进入消息队列的短的过期时间订单也没办法起作用。此问题可以通过消息过期时间不同发到不同的 消息队列来实现。
名词解释
消息生存时间(Time to Live): 指消息在消息队列的存活时间,超过指定时间 则消息会被消息队列 丢弃或者郊游其他队列处理
死信队列: 死信 是指 消息的生存时间已经过了 的消息,死信队列 是指死信的队列载体 通过设置参数 可以对过期消息再次发布到另一个队列进行处理
实现逻辑
![](https://img.haomeiwen.com/i13922678/3d430b40ba65ac2e.png)
如上图所示 不同的过期时间 发到不同的队列 ,时间过期后通过交换机B再此发到队列M 最后到达消费者
其中 交换机A与交换机B可以是同一个
根据业务动态生成队列信息
因为不同的死信队列 绑定到交换机时 要指定不同的路由key 所以 死信队列和对应的路由key是在发布时根据业务信息动态生成的
![](https://img.haomeiwen.com/i13922678/db4e983d33314224.png)
如上图 num是参数传进来的 过期时间 根据此过期时间 动态生成队列 并设置消息过期后 发送到的 交换机 testExchange 和 路由key receiveTTlQueueRoutKey
此时生成的队列为 dynamicQueue+num
动态绑定
![](https://img.haomeiwen.com/i13922678/a90faef1310ab1cd.png)
将队列 dynamicQueue+num 绑定到testExchange 并设置 路由key dynamicQueueRoutkey_+num
消息发送
![](https://img.haomeiwen.com/i13922678/66795284543119cc.png)
消息发送时候 记得指定队列 dynamicQueue+num绑定的 交换机 testExchange 和路由key dynamicQueueRoutkey_+num
接收过期消息队列声明及绑定
当消息过期后 会由另一个消息队列接收 这个队列是不变的 可在配置类里创建
![](https://img.haomeiwen.com/i13922678/f73a106c72690a76.png)
在第二张图里 我们设置了 x-dead-letter-routing-key 为receiveTTLQueueRoutKey 所以过期消息会发到 receiveTTLQueue
动态生成队列代码概览
如下图
![](https://img.haomeiwen.com/i13922678/f450f6459ebc5298.png)
运行效果
我们输入
http://127.0.0.1:8021/sendMessage/dynamicMessage/6000
![](https://img.haomeiwen.com/i13922678/eb63c990cd877437.png)
看下rabbitmq管理后台
![](https://img.haomeiwen.com/i13922678/6f31398649af701f.png)
看下发送 和接收消息打印 刚好是发送消息 6s消费者收到消息
![](https://img.haomeiwen.com/i13922678/7b03c734b9b344a9.png)
网友评论