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

RabbitMQ头交换路由:匹配所有列出的头,rabbitmq,amqp,Rabbitmq,Amqp,我有许多具有不同功能集的消费者,所以我希望将消息路由到处理,以更正其中一个。我决定使用头交换并在消息头中指定必要的特性,但这里遇到了障碍 在rabbitMQ中,有一个绑定参数x-match,它只能取any和all()的值。每个消费者在绑定时都有一个可用特性的大列表(大多数是真/假,但也有字符串),我将这些特性与x-match参数一起指定为绑定参数。但当我发布消息时,我只想指定必要的标题,例如,带有特定值的feature-1和feature-7。发布消息时,我甚至不知道所有可用的消费者功能。这里有

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

在rabbitMQ中,有一个绑定参数
x-match
,它只能取anyall()的值。每个消费者在绑定时都有一个可用特性的大列表(大多数是真/假,但也有字符串),我将这些特性与
x-match
参数一起指定为绑定参数。但当我发布消息时,我只想指定必要的标题,例如,带有特定值的feature-1和feature-7。发布消息时,我甚至不知道所有可用的消费者功能。这里有一个问题:如果我在
x-match==all
时遗漏了一些绑定参数,消息将不会被路由,并且如果我将
x-match
设置为
any
,唯一匹配的头就足以路由消息-尽管另一个头的值可能不匹配

给你一个例子,让我们考虑消费者的特性:<代码>国家=美国,f1= true,f2= true,f3= false 。p>

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

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

事实上,只有自己的exchange可能对我有所帮助。如果我在二郎成功,我将在这里报告

更新 我设法写了自己的插件,适合我的目的。也许它并不完美,但目前对我来说效果不错


如果唯一的办法是编写自己的exchange,那就有点遗憾了。Erlang对我来说似乎是一种魔力。太好了,我会试试这个插件。这个功能非常有用,我不明白RabbitMQ为什么没有它@Serge你能分享一下你使用这个插件的经验吗。你在生产中用过吗?嗨。是的,我们用过。我们没有额外的高负荷,但我们从未遇到过任何问题。实际上这是一个稍微修改过的headers插件,我只修改了尽可能少的代码。不幸的是,这个项目现在被放弃了,所以我没有关于它的最新统计数据@斯米莫夫