RabbitMQ/AMQP 交换路由策略
RabbitMQ/AMQP Exchange Routing Strategy
我有一个场景,发布者需要将消息发送到已知的交换(他们不会直接知道下游 queue)。大多数消息应该传递到每个边界 queue(如扇出),但有些消息只需要传递到特定边界 queue。我想避免多次交换以及多次 queue 债券。
我当前的解决方案使用 header 路由,其中消息具有两个 header 之一,将其标识为 "global" 或 "specific to a particular sub",其中下游 queues 在 match-any 上绑定到这两个 headers。我认为这会奏效,但我觉得应该有一个更简单的解决方案。
我试图找到一个可以 "fanout all messages except specific ones" 的交换插件,但找不到这样的插件。除此之外,关于如何实施这种路由策略有什么想法吗?
就其价值而言,我使用 "headers" 交换与使用 "match any" 绑定的队列的原始解决方案是我唯一能找到的解决方案,除了编写新的交换插件。它确实有效,而且到目前为止看起来相当快(至少没有比典型的 "topic" 交换慢得多——我找不到在这种情况下应用的方法)。
根据我对这个主题的研究,理想的解决方案是 "topic" 能够使用 RegEx 或至少某种形式的 "or-logic" 的交换。我确实找到了一些信息,暗示考虑了 RegEx 但决定反对(支持 "dotted notation" 主题格式),因为后者更快,特别是因为使用 RegEx 需要对每个新绑定进行评估消息(即无法构造 "search shortcut")。
目前,我的 "match-any headers exchange" 解决方案将满足我的目的,但在未来,允许 "or-logic" 的 "topic" 交换可能值得探索。它将允许通过单一绑定实现多个主题模式,而无需 RegEx 的开销。但是我没有使用 Erlang 的经验,也没有足够的时间来学习它来编写必要的插件。如果有人有兴趣就此进行合作,请与我联系。
不过,您所描述的确实听起来像 exchange-to-exchange 绑定,因为丰富的路由实际上是 RMQ 的优势之一。
您可以创建指向扇出(对于一般情况)或 topic/direct 一个(对于特殊情况)的入口交换,并将所有路由留给 RMQ。 entry-exchange
可以是 header 交换或直接交换,具体取决于您要放入 header 的内容:
entry-exchange -----> fanout-exchange ---*---> multiple-fanout queues
\
\---> the special exchange --> queue-for-special-usecase
我有一个场景,发布者需要将消息发送到已知的交换(他们不会直接知道下游 queue)。大多数消息应该传递到每个边界 queue(如扇出),但有些消息只需要传递到特定边界 queue。我想避免多次交换以及多次 queue 债券。
我当前的解决方案使用 header 路由,其中消息具有两个 header 之一,将其标识为 "global" 或 "specific to a particular sub",其中下游 queues 在 match-any 上绑定到这两个 headers。我认为这会奏效,但我觉得应该有一个更简单的解决方案。
我试图找到一个可以 "fanout all messages except specific ones" 的交换插件,但找不到这样的插件。除此之外,关于如何实施这种路由策略有什么想法吗?
就其价值而言,我使用 "headers" 交换与使用 "match any" 绑定的队列的原始解决方案是我唯一能找到的解决方案,除了编写新的交换插件。它确实有效,而且到目前为止看起来相当快(至少没有比典型的 "topic" 交换慢得多——我找不到在这种情况下应用的方法)。
根据我对这个主题的研究,理想的解决方案是 "topic" 能够使用 RegEx 或至少某种形式的 "or-logic" 的交换。我确实找到了一些信息,暗示考虑了 RegEx 但决定反对(支持 "dotted notation" 主题格式),因为后者更快,特别是因为使用 RegEx 需要对每个新绑定进行评估消息(即无法构造 "search shortcut")。
目前,我的 "match-any headers exchange" 解决方案将满足我的目的,但在未来,允许 "or-logic" 的 "topic" 交换可能值得探索。它将允许通过单一绑定实现多个主题模式,而无需 RegEx 的开销。但是我没有使用 Erlang 的经验,也没有足够的时间来学习它来编写必要的插件。如果有人有兴趣就此进行合作,请与我联系。
不过,您所描述的确实听起来像 exchange-to-exchange 绑定,因为丰富的路由实际上是 RMQ 的优势之一。
您可以创建指向扇出(对于一般情况)或 topic/direct 一个(对于特殊情况)的入口交换,并将所有路由留给 RMQ。 entry-exchange
可以是 header 交换或直接交换,具体取决于您要放入 header 的内容:
entry-exchange -----> fanout-exchange ---*---> multiple-fanout queues
\
\---> the special exchange --> queue-for-special-usecase