对RabbitMQ DLX队列使用优先级

对RabbitMQ DLX队列使用优先级,rabbitmq,queue,priority-queue,Rabbitmq,Queue,Priority Queue,我有2个RabbitMQ队列: 传入的\u消息=>在这里,我推送我以后要处理的所有消息 传入消息\u dlx=>其中我推送处理失败的消息 正如您对其名称所设想的那样,incoming_message_dlx队列使用该功能,这意味着当消息过期时,它将被重新调用到我的incoming_message 我试图实现的是在每次处理失败并将消息推送到DLX队列时增加消息的过期时间 问题是,即使消息过期,当它不在队列的底部(头部)时,它也不会被重新请求到我的传入的\u消息。因此,如果DLX队列中有一条过期

我有2个RabbitMQ队列:

  • 传入的\u消息
    =>在这里,我推送我以后要处理的所有消息
  • 传入消息\u dlx
    =>其中我推送处理失败的消息
正如您对其名称所设想的那样,
incoming_message_dlx
队列使用该功能,这意味着当消息过期时,它将被重新调用到我的
incoming_message

我试图实现的是在每次处理失败并将消息推送到DLX队列时增加消息的过期时间

问题是,即使消息过期,当它不在队列的底部(头部)时,它也不会被重新请求到我的
传入的\u消息
。因此,如果DLX队列中有一条过期时间为7天的消息,并且我们将一条过期时间为5秒的新消息加入队列,则此消息将仅在7天+5秒后重新被请求到
传入的\u消息中

我在文档中发现,我可以使用我的DLX队列作为一个队列,并根据过期时间为消息设置优先级,但它没有按预期工作,优先级似乎被忽略了

但是,当我使用RabbitMQ admin(管理插件)并获得队列的第一条消息时,它总是具有较高优先级的消息,但DLX队列的“内部使用者”似乎忽略了此优先级

你知道有什么问题吗

先谢谢你

PS:我正在使用RabbitMQ服务器版本3.6.10

  • 作为一种队列结构(fifo),rabbitmq确实会从队列头过期
  • 队列ttl包含3种类型:
    • 每队列消息TTL
      :x-Message-TTL
    • 每封邮件TTL:过期
    • 队列TTL:x-expires
  • 当您希望消息仅以ttl值传递时,请尝试使用多级ttl队列

    您可以根据需要预定义一些dlx队列

    例如:您希望错误消息在(5秒、15秒、60秒)内重试,您可以通过设置不同的
    x-message-ttl
    值来定义3个dlx队列,并将dlx路由器绑定到
    传入消息

    但是,如果您有一条消息ttl=30s,您只需使用ttl(5s、15s、60s)预先定义3个队列,那么到哪里去传递呢?尝试
    优先级队列

    官方文件

    应该过期的消息仍然只会从队列的
    头过期。这意味着与正常队列不同,
    即使是每个队列的
    TTL
    也会导致
    过期的低优先级消息
    落后
    未过期的更高优先级
    。 这些消息将永远不会被传递,但它们将出现在队列统计信息中

    过期的较低优先级邮件
    未过期的较高优先级邮件
    后获得
    卡滞

    像[60秒(p=1),30秒(p=0)]这样的队列不会发生

    我们定义了3个队列ttl(5s、15s、60s),为了防止较低的ttl消息被阻塞,我们使用flor ttl而不是ceil ttl将消息推送到队列中

    所以ttl=30s将传递给ttl=60s的队列,并将优先级设置为1

    • ttl=30s在预定义队列之间(15s,60s)
    • 设置ttl=60s队列的最大优先级=1,默认为0
    • 发送优先级为1的ttl=30s报文
    因此,队列中的消息就像[30,60,60,60,60]一样。
    ttl=30s不会被ttl=60s阻塞