【发布时间】:2016-11-30 22:57:06
【问题描述】:
我有很多具有不同特性的消费者,所以我希望路由消息能够处理以更正一个。我决定使用标头交换并在消息标头中指定必要的功能,但在这里遇到了障碍。
在 rabbitMQ 中有一个绑定参数 x-match,它可能只取 any 和 all (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设置为 all。然后我发布消息,我需要country是 "US" 和f2是 true。我对其他可能的消费者功能一无所知。消息不会被路由,因为并非所有标头都完全匹配。 - 场景 2:另一个用例是如果我绑定队列并将
x-match参数设置为any。如果我再次指定country为 "US" 和f2为 true - 消息将被路由,但如果@ 987654335@ 设置为 false 并且只有country匹配。
所以我可能误解了一些东西,但我为我寻找最简单的解决方案:如何根据必要功能列表将消息路由到正确的消费者。我想为x-match 参数使用类似all-specified 的值,它不会要求列出所有可用的功能,但会要求所有给定的标头完全匹配。
【问题讨论】:
-
如果唯一的方法是写自己的交换有点难过。 Erlang 对我来说似乎是一种魔法。