【问题标题】:RabbitMQ headers exchange routing: match all listed headersRabbitMQ 标头交换路由:匹配所有列出的标头
【发布时间】:2016-11-30 22:57:06
【问题描述】:

我有很多具有不同特性的消费者,所以我希望路由消息能够处理以更正一个。我决定使用标头交换并在消息标头中指定必要的功能,但在这里遇到了障碍。

在 rabbitMQ 中有一个绑定参数 x-match,它可能只取 anyall (https://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-July/028575.html) 的值。每个消费者在绑定时都有大量可用功能(其中大多数是真/假,但也有字符串),我将其指定为绑定参数以及x-match 参数。但是当我发布消息时,我只想指定必要的标头,例如,具有特定值的 feature-1feature-7。发布消息时,我什至不知道所有可用的消费者功能。这里有一个问题:如果我在x-match==all 时错过了一些绑定参数,则消息将不会被路由,并且如果我将x-match 设置为any,则唯一匹配的标头足以路由消息-尽管另一个标头的值可能不匹配。

举个例子,让我们考虑具有特征的消费者:country=US, f1=true, f2=true, f3=false

  • 场景 1:所以我使用这些参数将其队列附加(创建绑定)到标头交换,并将 x-match 设置为 all。然后我发布消息,我需要 country"US"f2true。我对其他可能的消费者功能一无所知。消息不会被路由,因为并非所有标头都完全匹配。
  • 场景 2:另一个用例是如果我绑定队列并将 x-match 参数设置为 any。如果我再次指定 country"US"f2true - 消息将被路由,但如果@ 987654335@ 设置为 false 并且只有 country 匹配。

所以我可能误解了一些东西,但我为我寻找最简单的解决方案:如何根据必要功能列表将消息路由到正确的消费者。我想为x-match 参数使用类似all-specified 的值,它不会要求列出所有可用的功能,但会要求所有给定的标头完全匹配。

【问题讨论】:

  • 如果唯一的方法是写自己的交换有点难过。 Erlang 对我来说似乎是一种魔法。

标签: rabbitmq amqp


【解决方案1】:

确实,只有自己的交流可能对我的目的有所帮助。如果我在 erlang 中取得成功,我会在这里报告。

更新

我设法编写了适合我目的的自己的插件。可能它并不完美,但目前对我来说很好。

https://github.com/senseysensor/rabbitmq-x-features-exchange

【讨论】:

  • 太好了,我会试试这个插件。这个功能很好用,不明白为什么RabbitMQ没有。 @Serge 你能分享你对这个插件的体验吗?你在生产中使用过它吗?
  • 嗨。是的,我们使用了它。我们没有额外的高负载,但我们从未遇到过任何问题。实际上它是一个有点修改的标题插件,我只更改了尽可能少的代码。不幸的是,这个项目现在被放弃了,所以我没有关于它的新统计数据。 @smimov
猜你喜欢
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
相关资源
最近更新 更多