rabbitmq 死信队列,消息过期不转发问题

261 天前
 dunhanson

1 、通过 RabbitMQ 的 DLX 和 TTL 来实现延迟队列

2 、消息,00:00:00 和 00:30:00 ,到点了都没有转发

3 、奇怪的是我访问 web 界面,get message 后就自动会转发了

961 次点击
所在节点    问与答
14 条回复
brader
261 天前
同个队列的所有消息,延迟时间都是一样的吗?
dunhanson
261 天前
@brader 不一样,一个 00:00:00 ,一个 00:30:00
dunhanson
261 天前
但我那些 9 点,12 点,15 点,18 点 消息 挺正常的
linauror
261 天前
死信队列有个限制是,队列里的延迟时间要一致,否则前面的消息没到过期时间,那么后面的其他消息也不会被处理。
有两个处理方式,一个是根据过期时间分别建立死信队列,另外一个是使用 Delayed Message 插件
brader
261 天前
@dunhanson 我应该就是这个问题了,我记得我之前看过 rabbitmq 延迟队列相关的文章,其中提到一个弊端就是,同一个队列前面入队的长延时消息会阻塞住后面短延时的消息,比如:
先进去了一条需要延时 1 小时的消息,再进去一条需要延时半小时的小时,实际上半小时后,后一条消息不会出去,因为队列先进先出的特性,被前面的消息堵住了。

简易解决方案就是把不同延时时间的消息分开来,分到不同队列去
jworg
261 天前
前面有消息没处理吧,用不严谨的话来说是阻塞的,必须等上一个消息消费了,过期的消息才会被处理,然后转发
linauror
261 天前
不过你这个访问一下就转发了,确实挺奇怪的
brader
261 天前
@linauror 不奇怪,他把前面哪条长延时还未到时间的消息消耗掉了,后面一条短延时已经到时间的消息,自然就出队了
dunhanson
261 天前
@linauror
@brader
@jworg 原来如此,这么坑
linauror
261 天前
@brader 看到了,截图显示的消息已经是 redelivered 状态,表示前面那条消息重新入队了
silentsky
261 天前
延迟队列很多坑 建议别用 rabbitmq
starck
261 天前
Rabbitmq 会有队头阻塞问题,可以看看他的插件有没有解决这个问题
VeryZero
260 天前
还是用插件做定时吧,用死信队列遇到队头阻塞要出事故的
dunhanson
260 天前
@silentsky
@starck
@VeryZero 目前场景用着还行,后续看看插件这块

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX