是否可以在RabbitMQ中使用交换?

时间:2011-12-02 00:00:33

标签: .net rabbitmq message-queue amqp rabbitmq-exchange

也许我在这里问错了。

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

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

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

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

  2. 能够平等地服务所有类别,而不是fifo,让我想出有趣的QoS(默认情况下,我知道Rabbit会循环播放消息)。

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

2 个答案:

答案 0 :(得分:5)

如果有动态订阅者可供选择,我想建议两种可能的解决方案:

解决方案1:

  • 使用主题交换。
  • 向您的交易所发布消息时,请使用强制投放标记。
  • 如果邮件被拒绝:创建一个队列,将其绑定到特定的路由密钥并在队列上启动订阅者,重新发布被拒绝的邮件。
  • 使用自动删除队列,以便当用户停止时,他们的队列将消失,并且整个自动创建过程可以重新启动。

解决方案2:

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

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

  • 定义一个策略,用于隐藏 n 路由键中的动态类别
  • 使用直接交换,
  • n 路由键绑定 n 队列,
  • 每个队列都有一个订阅者。

答案 1 :(得分:0)

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

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

声明队列

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

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

主题交换是首先尝试的最佳解决方案,因为可以轻松模拟直接和扇出交换的语义。