V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dunhanson
V2EX  ›  问与答

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

  •  
  •   dunhanson · 2023-08-21 18:07:11 +08:00 · 1200 次点击
    这是一个创建于 489 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    简易解决方案就是把不同延时时间的消息分开来,分到不同队列去
    jworg
        6
    jworg  
       2023-08-21 18:21:31 +08:00
    前面有消息没处理吧,用不严谨的话来说是阻塞的,必须等上一个消息消费了,过期的消息才会被处理,然后转发
    linauror
        7
    linauror  
       2023-08-21 18:23:12 +08:00
    不过你这个访问一下就转发了,确实挺奇怪的
    brader
        8
    brader  
       2023-08-21 18:27:39 +08:00
    @linauror 不奇怪,他把前面哪条长延时还未到时间的消息消耗掉了,后面一条短延时已经到时间的消息,自然就出队了
    dunhanson
        9
    dunhanson  
    OP
       2023-08-21 18:29:25 +08:00
    @linauror
    @brader
    @jworg 原来如此,这么坑
    linauror
        10
    linauror  
       2023-08-21 18:33:13 +08:00
    @brader 看到了,截图显示的消息已经是 redelivered 状态,表示前面那条消息重新入队了
    silentsky
        11
    silentsky  
       2023-08-21 19:45:04 +08:00 via Android
    延迟队列很多坑 建议别用 rabbitmq
    starck
        12
    starck  
       2023-08-21 23:58:46 +08:00 via iPhone
    Rabbitmq 会有队头阻塞问题,可以看看他的插件有没有解决这个问题
    VeryZero
        13
    VeryZero  
       2023-08-22 09:00:50 +08:00
    还是用插件做定时吧,用死信队列遇到队头阻塞要出事故的
    dunhanson
        14
    dunhanson  
    OP
       2023-08-22 10:50:53 +08:00
    @silentsky
    @starck
    @VeryZero 目前场景用着还行,后续看看插件这块
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:14 · PVG 20:14 · LAX 04:14 · JFK 07:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.