RabbitMQ - 根据消息类型将消息发布到队列

时间:2015-07-30 07:44:12

标签: rabbitmq

我是rabbitMQ的新手,需要根据消息类型发布一个或多个队列的消息。

让我们说,我收到M1,M2,M3类型的消息,并有两个队列Q1,Q2。  如果消息类型是M1或M2,则只需将其发布到队列Q1。  如果消息类型是M3,则需要将其发布到Q1和Q2。

请建议我怎样才能做到这一点? 感谢。

2 个答案:

答案 0 :(得分:1)

生产者将生成所有消息到一个交换(类型:主题),消息类型为路由密钥。并且交换应该使用路由密钥绑定到不同的队列。在你的情况下,“Q1”应绑定与2个绑定交换:一个“#.M2。#”和另一个“#.M2。#”。这意味着任何带有路由密钥M1或M2的交换机的消息都应该转到Q1。

答案 1 :(得分:1)

这是交换,绑定和路由键允许您执行的操作。

在您的情况下,交换类型应该是“直接”或“主题”。在这个简单的场景中,我认为这对你没什么影响。鉴于此,我现在将“直接”。

首先,您需要创建交换

  • 交换名称: ex1
  • 交易所类型:直接

接下来,创建队列。

  • Q1
  • Q2
  • Q3

重要的部分是在此之后发生的事情:交换和队列之间的绑定。

根据您的描述,我看到了消息流的以下要求:

  • M1 - > Q1
  • M2 - > Q1
  • M3 - > Q1
  • M3 - > Q2

这些基本上是您需要从交换机创建到队列的绑定,其中消息类型是路由键。

如果你想更完整地记录它,它看起来会像这样。

| Exchange | Routing Key | Queue |
| -------- | ----------- | ----- |
| ex1      | M1          | Q1    |
| ex1      | M2          | Q1    |
| ex1      | M3          | Q1    |
| ex1      | M3          | Q2    |

现在,在向此交换发布消息时,您可以将消息类型设置为路由密钥。这将确保消息流向正确的队列。

直接与主题交换

直接交换和主题交换(这里有两个真正的选项)的主要区别在于,直接交换在路由键上进行文字字符串匹配,而主题交换允许模式匹配。

如果您具有高度结构化路由密钥的复杂路由要求(高度结构化,如“this.that.whatever.something”类型的格式化),则主题交换是更好的选择。主题允许您将部分路由密钥与特定路由和队列进行匹配。

使用哪种交换方式并不总是显而易见的问题。我倾向于默认直接交换...但我没有充分理由这样做。很多人会告诉你,你应该默认主题交换。我认为这不重要。更重要的问题是何时需要主题和模式匹配。我写了a short ebook on rabbitmq layout使用基于现实世界经验的故事来解释何时使用哪一个,如果你有兴趣的话。