RabbitMQ报头交换路由:匹配所有列出的报头



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

在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设置为所有将其队列附加(创建绑定)到头交换。然后我发布消息,我需要country"US"f2true。我不知道其他可能的消费者功能。消息不会被路由,因为不是所有的头都完全匹配。
  • 场景2:另一个用例是,如果我绑定队列与x-match参数设置为any。如果我再次指定country"US"f2true -消息将被路由,但如果f2设置为false并且只有country匹配,它也将(不正确地)路由。

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

事实上,只有自己的交换可能有助于我的目的。如果我成功使用了erlang,我会在这里报告。

更新

我设法写自己的插件,适合我的目的。也许它不是完美的,但现在对我来说很好。

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

最新更新