美文网首页
RabbitMQ消息过期时间设置多值最佳实践

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

作者: 越陌先生 | 来源:发表于2020-05-06 23:37 被阅读0次

前言

电商平台里订单支付超时逻辑使用了 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消费者收到消息

相关文章

网友评论

      本文标题:RabbitMQ消息过期时间设置多值最佳实践

      本文链接:https://www.haomeiwen.com/subject/ybhnghtx.html