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