我是rabbitMQ的新手,需要根据消息类型发布一个或多个队列的消息。
让我们说,我收到M1,M2,M3类型的消息,并有两个队列Q1,Q2。 如果消息类型是M1或M2,则只需将其发布到队列Q1。 如果消息类型是M3,则需要将其发布到Q1和Q2。
请建议我怎样才能做到这一点? 感谢。
答案 0 :(得分:1)
生产者将生成所有消息到一个交换(类型:主题),消息类型为路由密钥。并且交换应该使用路由密钥绑定到不同的队列。在你的情况下,“Q1”应绑定与2个绑定交换:一个“#.M2。#”和另一个“#.M2。#”。这意味着任何带有路由密钥M1或M2的交换机的消息都应该转到Q1。
答案 1 :(得分:1)
这是交换,绑定和路由键允许您执行的操作。
在您的情况下,交换类型应该是“直接”或“主题”。在这个简单的场景中,我认为这对你没什么影响。鉴于此,我现在将“直接”。
首先,您需要创建交换
接下来,创建队列。
重要的部分是在此之后发生的事情:交换和队列之间的绑定。
根据您的描述,我看到了消息流的以下要求:
这些基本上是您需要从交换机创建到队列的绑定,其中消息类型是路由键。
如果你想更完整地记录它,它看起来会像这样。
| 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使用基于现实世界经验的故事来解释何时使用哪一个,如果你有兴趣的话。