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

时间:2016-11-15 10:02:38

标签: rabbitmq amqp

我有很多消费者具有不同的功能集,所以我希望路由消息能够处理以纠正其中一个。我决定使用标题交换并在邮件标题中指定必要的功能,但这里陷入了障碍。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

事实上,只有自己的交流才有助于我的目的。如果我在erlang中取得成功,我会在这里报告。

更新

我设法编写了适合我目的的插件。可能它并不完美,但现在对我有用。

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

相关问题