【发布时间】:2015-10-21 11:11:27
【问题描述】:
我是rabbitMQ的新手,需要根据消息类型发布一个或多个队列。
比方说,我收到 M1、M2、M3 类型的消息,并且有两个队列 Q1、Q2。 如果消息类型是 M1 或 M2,那么它只需要发布到队列 Q1 。 如果消息类型为 M3,则需要同时发布到 Q1 和 Q2。
请建议我怎样才能做到这一点? 谢谢。
【问题讨论】:
标签: rabbitmq
我是rabbitMQ的新手,需要根据消息类型发布一个或多个队列。
比方说,我收到 M1、M2、M3 类型的消息,并且有两个队列 Q1、Q2。 如果消息类型是 M1 或 M2,那么它只需要发布到队列 Q1 。 如果消息类型为 M3,则需要同时发布到 Q1 和 Q2。
请建议我怎样才能做到这一点? 谢谢。
【问题讨论】:
标签: rabbitmq
Producer 会将所有消息生成到一个交换器(类型:主题),消息类型为路由键。并且交换应该使用路由键绑定到不同的队列。在您的情况下,“Q1”应该与 2 个绑定进行交换:一个“#.M2.#”和另一个“#.M2.#”。这意味着任何带有路由密钥 M1 或 M2 的交换消息都应该发送到 Q1。
【讨论】:
这就是交换、绑定和路由键允许您做的事情。
在您的情况下,交流的类型应该是“直接”或“主题”。我认为在这个简单的场景中它对你没有太大的影响。鉴于此,我现在将使用“直接”。
首先你需要创建你的交易所
接下来,创建您的队列。
重要的部分是在此之后发生的事情:交换器和队列之间的绑定。
根据您的描述,我看到消息流的以下要求:
这些基本上是您需要创建的从交换到队列的绑定,其中消息类型是路由键。
如果您想更完整地记录它,它看起来像这样。
|交流 |路由键 |队列 | | -------- | ------------ | ----- | |例1 | M1 |第一季度 | |例1 | M2 |第一季度 | |例1 | M3 |第一季度 | |例1 | M3 | Q2 |现在,当向此交换器发布消息时,您可以将消息类型设置为路由键。这将确保消息流向正确的队列。
直接交换和主题交换之间的主要区别 - 这是您在此处拥有的两个实际选项 - 是直接交换对路由键进行文字字符串匹配,而主题交换允许模式匹配。
如果您有复杂的路由要求和高度结构化的路由键(高度结构化,如“this.that.whatever.something”类型的格式),那么主题交换是更好的选择。主题允许您将部分路由键匹配到特定的路由和队列。
使用哪种类型的交换的问题并不总是显而易见的。我倾向于默认直接交换......但我没有很好的理由。很多人会告诉你,你应该默认主题交换。我认为这不重要。更重要的问题是了解何时需要主题和模式匹配。我写了a short ebook on rabbitmq layout,它使用基于现实世界经验的故事来解释何时使用哪一个的一些差异,如果你有兴趣的话。
【讨论】: