当前位置: 首页 > 知识库问答 >
问题:

使用RabbitMQ DLX队列的优先级

柳浩大
2023-03-14

我有2个RabbitMQ队列:

  • incoming_message=

正如您对其名称所设想的那样,incoming_message\u dlx队列使用死信交换功能,这意味着当消息过期时,它将被重新调用到我的incoming_message

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

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

我在留档上发现,我可以使用我的DLX队列作为优先级队列,并根据过期时间对我的消息设置优先级,但它不像预期的那样工作,优先级似乎被忽略。

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

你知道有什么问题吗?

先谢谢你。

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

共有1个答案

梁福
2023-03-14
  • 作为一种队列结构(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=30,你只需要用ttl(5s,15s,60)找到3个队列,那么去哪里呢?尝试优先级队列

    官方文件

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

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

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

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

    因此ttl=30将传递到ttl=60的队列,并设置优先级=1

    • ttl=30s在预定义队列之间(15s,60s)
    • 设置ttl=60s队列的最大优先级=1,默认为0
    • 发送优先级为1的ttl=30s报文

    因此,队列中的消息就像[30,60,60,60]一样
    ttl=30s不会被ttl=60s阻塞。

 类似资料:
  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 使用优先队列实现 Stride Scheduling 在上述的实现描述中,对于每一次pick_next函数,我们都需要完整地扫描来获得当前最小的stride及其进程。这在进程非常多的时候是非常耗时和低效的,有兴趣的同学可以在实现了基于列表扫描的Stride调度器之后比较一下priority程序在Round-Robin及Stride调度器下各自的运行时间。考虑到其调度选择于优先队列的抽象逻辑一致,我

  • 问题内容: 我正在尝试根据文档中提供的示例实现优先级队列。文件:priorityQueue 简而言之,它看起来像这样(不包括所有内容): 该文件中: 如您所见,在与示例进行比较时,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列未正确实现接口。 这会给我带来以下问题: 该项目未附加到队列中。 我试图写出队列指针地址,它显示了不同的地址。这就解释了为什么它不起作用,但是切片不是地图长

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。