RabbitMQ headers 交换路由:匹配所有列出的 headers
RabbitMQ headers exchange routing: match all listed headers
我有很多具有不同功能集的消费者,所以我希望路由消息进行处理以更正一个。我决定使用 headers 交换并在消息 headers 中指定必要的功能,但这里遇到了障碍。
在 rabbitMQ 中有绑定参数 x-match
,它只能取值 any 和 all (https://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-July/028575.html ).相反,绑定时每个消费者都有可用功能的大列表(其中大多数是 true/false,但也有字符串),我将其指定为绑定参数以及 x-match
参数。但是,当我发布消息时,我只想指定必要的 headers,例如,具有特定值的 feature-1 和 feature-7 .发布消息时,我什至不知道所有可用的消费者功能。问题来了:如果我在 x-match==all
时错过了一些绑定参数,消息将不会被路由,如果我将 x-match
设置为 any
,唯一匹配的 header足以路由消息 - 尽管另一个 header 的值可能不匹配。
举个例子,让我们考虑具有特征的消费者:country=US, f1=true, f2=true, f3=false
。
- 场景 1:所以我将其 queue 附加(创建绑定)到 headers 交换这些参数并将
x-match
设置为 all.然后我发布消息,我需要 country
为 "US" 和 f2
为 true。我对其他可能的消费者功能一无所知。邮件不会被路由,因为并非所有 header 都完全匹配。
- 场景 2:另一个用例是如果我将 queue 与
x-match
参数设置为 any
绑定。如果我再次指定 country
为 "US" 并且 f2
为 true - 消息将被路由, 但如果 f2
设置为 false 并且只有 country
匹配,它也会被(错误地)路由。
所以我可能误解了一些东西,但我正在寻找对我来说最简单的解决方案:如何根据必要功能列表将消息路由到正确的消费者。我想为 x-match
参数使用类似 all-specified
的值,它不会要求列出所有可用的功能,但需要所有给定的 header 完全匹配。
的确,只有自己的交流可能对我的目的有帮助。如果我在 erlang 上成功了,我会在这里报告。
更新
我设法编写了适合我目的的插件。可能它并不完美,但目前对我来说很好用。
https://github.com/senseysensor/rabbitmq-x-features-exchange
我有很多具有不同功能集的消费者,所以我希望路由消息进行处理以更正一个。我决定使用 headers 交换并在消息 headers 中指定必要的功能,但这里遇到了障碍。
在 rabbitMQ 中有绑定参数 x-match
,它只能取值 any 和 all (https://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-July/028575.html ).相反,绑定时每个消费者都有可用功能的大列表(其中大多数是 true/false,但也有字符串),我将其指定为绑定参数以及 x-match
参数。但是,当我发布消息时,我只想指定必要的 headers,例如,具有特定值的 feature-1 和 feature-7 .发布消息时,我什至不知道所有可用的消费者功能。问题来了:如果我在 x-match==all
时错过了一些绑定参数,消息将不会被路由,如果我将 x-match
设置为 any
,唯一匹配的 header足以路由消息 - 尽管另一个 header 的值可能不匹配。
举个例子,让我们考虑具有特征的消费者:country=US, f1=true, f2=true, f3=false
。
- 场景 1:所以我将其 queue 附加(创建绑定)到 headers 交换这些参数并将
x-match
设置为 all.然后我发布消息,我需要country
为 "US" 和f2
为 true。我对其他可能的消费者功能一无所知。邮件不会被路由,因为并非所有 header 都完全匹配。 - 场景 2:另一个用例是如果我将 queue 与
x-match
参数设置为any
绑定。如果我再次指定country
为 "US" 并且f2
为 true - 消息将被路由, 但如果f2
设置为 false 并且只有country
匹配,它也会被(错误地)路由。
所以我可能误解了一些东西,但我正在寻找对我来说最简单的解决方案:如何根据必要功能列表将消息路由到正确的消费者。我想为 x-match
参数使用类似 all-specified
的值,它不会要求列出所有可用的功能,但需要所有给定的 header 完全匹配。
的确,只有自己的交流可能对我的目的有帮助。如果我在 erlang 上成功了,我会在这里报告。
更新
我设法编写了适合我目的的插件。可能它并不完美,但目前对我来说很好用。
https://github.com/senseysensor/rabbitmq-x-features-exchange