RabbitMQ/AMQP交换路由策略

RabbitMQ/AMQP交换路由策略,rabbitmq,amqp,rabbitmq-exchange,Rabbitmq,Amqp,Rabbitmq Exchange,我有一个场景,发布者需要将消息发送到已知的exchange(他们不会直接知道下游队列)。大多数消息应该传递到每个绑定队列(如扇出),但有些消息只需要传递到特定的绑定队列。我希望避免多次交换和多次排队 我当前的解决方案使用报头路由,其中消息有两个报头中的一个,将其标识为“全局”或“特定于特定子节点”,其中下游队列绑定在与这两个报头匹配的任意位置。我认为这会奏效,但我觉得应该有一个更简单的解决方案 我试图找到一个可以“扇出除特定消息以外的所有消息”的exchange插件,但我找不到这样的插件。除此之

我有一个场景,发布者需要将消息发送到已知的exchange(他们不会直接知道下游队列)。大多数消息应该传递到每个绑定队列(如扇出),但有些消息只需要传递到特定的绑定队列。我希望避免多次交换和多次排队

我当前的解决方案使用报头路由,其中消息有两个报头中的一个,将其标识为“全局”或“特定于特定子节点”,其中下游队列绑定在与这两个报头匹配的任意位置。我认为这会奏效,但我觉得应该有一个更简单的解决方案


我试图找到一个可以“扇出除特定消息以外的所有消息”的exchange插件,但我找不到这样的插件。除此之外,关于如何实现这样的路由策略,还有什么想法吗?

值得一提的是,除了编写新的exchange插件之外,我唯一能找到的解决方案是使用“headers”交换和使用“match any”绑定的队列。它确实有效,而且到目前为止似乎相当快(至少不比典型的“主题”交换慢多少——我找不到在这个场景中应用的方法)

根据我对这个主题的研究,理想的解决方案是一个“主题”交换,能够使用正则表达式或至少某种形式的“或逻辑”。我确实发现了一些信息,暗示考虑使用正则表达式,但决定不使用(支持“点符号”主题格式),因为后者速度更快,特别是因为使用正则表达式需要在每个新消息上计算每个绑定(即,无法构造“搜索快捷方式”)


目前,我的“匹配任何头交换”解决方案可以满足我的目的,但在将来,一个允许“或逻辑”的“主题”交换可能值得探索。它允许使用单个绑定实现多个主题模式,而不需要正则表达式的开销。但是我没有使用Erlang的经验,也没有足够的时间学习它来编写必要的插件。如果有人对此感兴趣,请与我联系。

您所描述的内容听起来像是exchange到exchange绑定,因为丰富的路由实际上是RMQ的优势之一

您可以创建指向扇出(对于一般情况)或主题/直接(对于特殊情况)的条目交换,并将所有路由留给RMQ。
条目交换
可以是标题交换,也可以是直接交换,具体取决于您希望在标题中放置的内容:

entry-exchange -----> fanout-exchange ---*---> multiple-fanout queues
               \
                \---> the special exchange --> queue-for-special-usecase

不知道为什么你会被否决,但我认为主题交流是最好的选择。@mshindal-也不知道为什么;对于一个合法的用例来说,这似乎是一个合理的问题(我已经做了大量的研究)。关于您的建议,我不知道如何在主题交换中实现这一点,除非我为每个客户机绑定两个队列(一个用于“所有消息”,一个用于“特定消息”)。您想的是两个队列吗?是的,我仔细研究了使用绑定交换,但我发现的所有解决方案(包括我相信您的建议)都要求客户绑定到两个不同的队列(一个用于扇出,一个用于直接)。这是我特别想要避免的,因为将会有大量的客户机,所以我不想将其乘以2倍。