【问题标题】:RabbitMQ/AMQP Exchange Routing StrategyRabbitMQ/AMQP 交换路由策略
【发布时间】:2017-10-10 12:57:06
【问题描述】:

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

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

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

【问题讨论】:

  • 不知道为什么你会被否决,但我认为主题交流会是最好的选择。
  • @mshindal - 也不知道为什么;对于合法用例来说,这似乎是一个合理的问题(我已经进行了大量研究)。关于您的建议,我不确定如何通过主题交换来实现这一点,除非我为每个客户端绑定两个队列(一个用于“所有消息”,一个用于“特定消息”)。两个队列是您的想法吗?

标签: rabbitmq amqp rabbitmq-exchange


【解决方案1】:

对于它的价值,我唯一能找到的使用“标头”交换和使用“匹配任何”绑定的队列的原始解决方案,没有编写一个新的交换插件。它确实有效,并且到目前为止看起来相当快(至少不会比典型的“主题”交换慢很多——我找不到在这种情况下应用的方法)。

根据我对该主题的研究,理想的解决方案是能够使用正则表达式或至少某种形式的“或逻辑”的“主题”交换。我确实发现了一些暗示 RegEx 被考虑但决定反对的信息(支持“点表示法”主题格式),因为后者更快,特别是因为使用 RegEx 需要在每条新消息上评估每个绑定(即没有办法构建“搜索快捷方式”)。

目前,我的“匹配任何标头交换”解决方案将服务于我的目的,但在未来,允许“或逻辑”的“主题”交换可能值得探索。它将允许通过单一绑定实现多个主题模式,而无需 RegEx 的开销。但是我没有使用 Erlang 的经验,也没有时间学习足够的知识来编写必要的插件。如果有人对此有兴趣合作,请与我联系。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,我仔细研究了使用绑定交换,但我发现的所有解决方案(包括我相信你建议的)都需要客户端绑定到两个不同的队列(一个用于扇出和一个直接)。这是我特别想避免的,因为会有大量客户,所以我不想将其乘以 2 倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2010-11-04
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多