4

也许我在这里问错了问题。

我正在尝试做的事情:多个生产者将动态类别中的数据推送到命名交换中。多个消费者需要从这些动态命名的队列中获取这些数据并对其进行操作。

问题是我看到的所有消费示例都要求消费者/订阅具有特定的队列名称,而我的消费者不知道队列的名称,他们也不需要知道这一点。

我为什么要这样做?两个原因:

  1. 我一次可以拥有 N 个这些动态类别。我希望队列能够平等地为这些类别服务。目前我们有一个队列(msmq),它接受所有这些类别并在 FIFO 中为它们提供服务(这意味着某些类别在一段时间内处于饥饿状态)。

  2. 能够平等地为所有类别提供服务,而不是先进先出,让我想出了有趣的 QoS(默认情况下,我知道 Rabbit 将循环提供消息)。

所以,回到我的问题(如果它有效的话):是否可以使用队列中的消息?

4

2 回答 2

6

如果拥有动态订阅者是一种选择,我想提出两种可能的解决方案:

解决方案1:

  • 使用主题交换。
  • 将消息发布到您的交易所时使用强制传递标志。
  • 如果消息被拒绝:创建一个队列,为特定的路由键绑定它并在队列上启动一个订阅者,重新发布被拒绝的消息。
  • 使用自动删除队列,当订阅者停止时,他们的队列将消失,整个自动创建过程可以重新开始。

解决方案2:

  • 使用主题交换。
  • 将消息发布到您的交易所时使用立即交付标志。
  • 如果消息被拒绝:创建一个队列,为特定的路由键绑定它并在队列上启动一个订阅者,重新发布被拒绝的消息。
  • 使用持久队列。由于队列创建是幂等的,因此可以通过重新创建过程,这里的重要部分是确保实时订阅者正在侦听队列。

如果动态订阅者不是一个选项,那么这就是我的建议。假设您仅限于n 个订阅者:

  • 定义一个策略,对n 个路由键中的动态类别进行哈希处理,
  • 使用直接交换,
  • 为n 个路由键绑定n 个队列,
  • 每个队列有一个订阅者。
于 2011-12-02T17:39:48.147 回答
0

使用 AMQP,您可以将消息发布到 Exchange,并使用队列中的消息。不要担心“队列”在其他消息传递技术中的含义。

在我看来,您的场景可以通过主题交换轻松处理。使用 cat.silly、cat.older、cat.interesting 等路由键发布消息。然后让每个消费者使用绑定键 cat.* 声明一个队列

这样,由于绑定键中的通配符,所有以任何前缀发布到交换器的消息都将被复制到队列中。如果您的消费者实际上是在进行循环共享,即不应将消息复制到多个队列,那么只需让所有消费者使用相同的队列名称。如果每个消费者都使用相同的队列名称,那么您可以将其编译到您的代码中,而不必担心名称是什么。但是,当您要调试消息流时,只需创建一个使用相同绑定键 cat.* 订阅名为 catdebug 的队列的消费者

但是,如果每个消费者都是专门的并且想要挑选和选择要处理的消息,那么让每个消费者使用唯一的队列名称。这样每个消费者都会看到每条消息的副本。

Topic exchanges are the best solution to try first, because the semantics of direct and fanout exchanges can easily be emulated.

于 2012-01-17T07:38:07.717 回答