【问题标题】:Order-keeping queues that can be paused可以暂停的订单保持队列
【发布时间】:2015-02-15 17:26:42
【问题描述】:

我目前正在开发一个使用 RabbitMQ 向工作人员传递消息的软件。基本上,这是一项非常容易的任务,因为您可以使用单个队列的单个直接交换,并且所有工作人员都使用该队列。任务完成。

但现在,事情开始变得复杂起来。如果有两个额外的要求,那让我想到:

  • 消息并不完全相同,即消息有一个“标志”,用于对消息进行分组。现在第一个要求是所有具有相同“标志”的消息都按顺序处理。
  • 希望“暂停”处理具有特定标志的所有消息。

第一个很容易解决:您只需确保具有相同标志的消息始终由同一个工作人员处理,并将其预取设置为 1。为确保您可以使用 x-consistent-hash交换。

第二个也很容易解决:您必须为每个标志使用单独的队列,然后您可以停止处理队列。

现在,虽然这基本上可行,但它引入了一些问题,我不太确定如何解决它们:

  • 如果我将prefetch 选项设置为1,事情会变得更慢,因为我无法并行处理消息。这会大大降低性能。
  • 如果我为每个标志使用单独的队列,我最终会得到大量队列 (> 10k)。虽然这似乎不是 RabbitMQ 可以处理的问题,但我想知道这是否是个好主意。
  • 此外,我现在有多个工作“步骤”,即,一旦工作人员处理了一条消息,它就会将它放到另一个 RabbitMQ 中,然后同样的事情重新开始。这意味着,如果我不为每个步骤使用单独的 RabbitMQ 实例,我最终会得到 lots 个队列(n 个交换n 次 10k 队列)。

有没有更好的方法来解决这个问题?如果是这样,怎么做?有什么想法、提示……?

【问题讨论】:

    标签: architecture routing rabbitmq message-queue dht


    【解决方案1】:

    为了处理具有相同“标志”的所有消息,我建议设置具有多个队列的交换,并且交换根据路由键将消息路由到不同的队列(这就是路由键的设计目的)。这样,您无需将 prefetch 设置为 1,您有一个专用于该路由键的队列。

    如果您有 10k+ 个“标志”,那么您会遇到不同的问题。有这么多队列是可能的,但不是很容易维护。您是否可以有一个“高优先级队列”,其中重要的标志被路由到少数队列,而所有其余的“非重要标志”都被路由到一个“低优先级队列”?

    【讨论】:

    • 似乎如果有办法将“标志”映射到路由键(许多“标志”到少数路由键),那么这两个问题都解决了吗?如果这还不存在,就会想到散列。这样,同一个“标志”总是被路由到同一个队列,所以它们是按顺序处理的。同一个“标志”总是被路由到同一个队列,所以应该能够根据标志暂停(我猜是一些队列消费者逻辑)
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2020-06-21
    • 2018-07-07
    相关资源
    最近更新 更多