RabbitMQ/AMQP交换路由策略

问题描述:

我有一个场景,发布者需要向已知交换机发送消息(他们不会直接知道下游队列)。大部分消息应该传递给每个绑定队列(如扇出),但有些消息只需要传递给特定的绑定队列。我想避免多次交换以及多个队列债券。RabbitMQ/AMQP交换路由策略

我当前的解决方案使用头部路由,其中​​消息具有两个头中的一个,将其标识为“全局”或“特定于某个特定子”,其中下游队列绑定在匹配上 - 头。我认为这会起作用,但我觉得应该有一个更简单的解决方案。

我试图找到一个交换插件,将“扇出所有消息,除了特定的消息”,但我找不到这样的插件。除此之外,还有关于如何实施这种路由策略的想法?

+0

不知道为什么你要downvoted,但我认为一个话题交换将是最好的选择这个。 – mshindal

+0

@mshindal - 不知道为什么;对于合法的用例来说这似乎是一个合理的问题(我已经完成了大量的研究)。关于你的建议,除非我为每个客户绑定两个队列(一个用于“所有消息”,另一个用于“特定消息”),否则我不确定如何使用主题交换进行此项工作。你有两个队列吗? – eric

对于什么是值得的,我唯一可以找到的就是使用“标题”交换与队列绑定使用“匹配任何”的原始解决方案,而不用编写新的交换插件。它确实有效,迄今似乎相当快速(至少不会比典型的“主题”交换慢得多 - 我在这种情况下无法应用)。

从我对这个主题的研究中,理想的解决方案是使用RegEx或至少某种形式的“or-logic”的“主题”交换。我确实发现了一些信息,意味着RegEx被考虑但决定反对(赞成“点缀符号”主题格式),因为后者更快,特别是因为使用RegEx会要求每个新消息都要评估每个绑定(即没有办法构建“搜索捷径”)。现在,我的“匹配任何头文件交换”解决方案将服务于我的目的,但在未来,允许“或逻辑”的“主题”交换可能值得探索。它将允许使用单一绑定实现多个主题模式,而不会产生RegEx的开销。但是我对Erlang没有经验,也没有足够的时间学习编写必要的插件。如果有人有兴趣合作,请联系我。

您所描述的内容确实听起来像交换交换绑定,尽管富路由实际上是RMQ的优势之一。

您可以创建指向扇出(对于一般情况)或主题/直接(对于特殊情况)的条目交换,并将所有路由保留为RMQ。该entry-exchange可能是一个头交换或直接之一,这取决于你想放什么标题:

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

是的,我仔细研究过使用绑定交换,但是我发现的所有解决方案(包括我相信您建议的)都需要客户绑定到两个不同的队列(一个用于扇出,一个用于直接)。这是我特意试图避免的,因为会有大量的客户,所以我不想把它乘以2倍。 – eric