RabbitMQ 延时队列的问题

OLESHI 发布于 2018/05/18 17:30
阅读 2K+
收藏 2

精选30+云产品,助力企业轻松上云!>>>

想要实现类似以下的需要,

在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将取消。

将消息设置过期时间,发送到死信队列,过期后转发到监听的队列。

参考 https://blog.csdn.net/i_vic/article/details/72742277

以上代码实现了,当单个消息大的时候,没有问题。

问题是多个消息,而且每个消息过期时间不一样,这时候问题就来了,如果第一个过期时间太久,那么第二消息要等第一个过期后,才能过期。

请问各位大神,这是正常现象,还是配置有问题呢?

如何才能实现不同过期时间消息,都能正常呢?

加载中
0
O
OLESHI

这是正常现象

0
F
FREEFER

这个跟消息队列有什么关系 消费者完成订单后 创建一个调度器任务 30分钟后执行不就行了 用调度器就可以搞定

0
chinotan
chinotan

求解答

zhaobohao
zhaobohao
回复 @OLESHI : 您这不是延迟消息吧。。。。建议找篇关于延迟消息队列 的文章看一下吧。
chinotan
chinotan
回复 @OLESHI : 什么时候把消息取出来(什么频率),判断时间没到后又是如何放回队列的(还是放延时吗),生产环境运用了吗,效果如何(这种方式应该实时性不怎么好)。如果每个延时用不同的延时队列(队列名不同)可以实现楼主的效果吗?(可能会造成队列过多的问题)
O
OLESHI
我现在是吧消息从队列取出后,判断这条消息是否到时间了,没到时间的话再放回队列
0
小象鸭
小象鸭

我也看过这个问题,能懂你的意思,首先它就是个队列,队列就是先进先出的,如果第二个比第一个的时间靠前,是会等第一个的时间到了才行的,具体的解决办法我没有使用过MQ,不太理解怎么解决,不过感觉MQ应该是可以解决这种问题的

0
开源划水
开源划水

对于不同业务种类的延迟消息 ,放入不同队列可以不 

O
OLESHI
不同业务,肯定是不同队列,但是同一个业务,不同消息的过期时间不一样,就会产生问题。
0
page_zxy
page_zxy

订单未超时支付成功,支付回调改订单状态,

死信队列到有效期后会发送到正常的消息队列上,这时我们再根据消息内容查询当前订单是否支付成功,如果未支付成功就关闭订单 因为已经超时, 无论支付成功与否 - 最终消息被消费

0
chinotan
chinotan

RabbitMQ加个插件,完美解决,已上线

chinotan
chinotan
回复 @OLESHI : https://www.rabbitmq.com/community-plugins.html rabbitmq_delayed_message_exchange
O
OLESHI
给个插件名啊,后面谁搜到这个问题,还能有答案!
返回顶部
顶部