如何向除发布者之外的所有订阅者发送消息,发布者也是同一 rabbitMQ 队列上的侦听器

how to send a message to all subscribers except for the publisher which is also a listener on same rabbitMQ queue

我安装了一个由 nodeJS 服务器使用的 rabbitMQ。 我使用 rabbit.js 库与 rabbit 交互,到目前为止我很满意。

我在扇出模式下在同一个队列上有多个订阅者, 每个节点都是订阅者,同时也是发布者 这对我来说很好并且工作正常,因为在很多情况下我想通知所有服务器关于其中一个节点(也是发布者...)上发生的一些更新

我偶然发现了一个案例,在这种情况下,我需要向队列中的所有侦听器发送一条消息,但发送它的人(也是同一队列中的侦听器)除外。

我事先不知道谁在听(可能只有一个,也可能有数百万),所以我无法通过某些白名单路由规则将其路由到某些特定节点。 它必须是某种排除通配符路由规则(某些黑名单) 例如,将此消息发送给与我自己的唯一 ID 不对应的所有收听的人...

可以使用rabbit.js来完成吗? 它甚至可以在 rabbitmq 中以某种方式完成吗?

我不太了解兔子... 所以对我温柔点:)

顺便说一句,如果你知道如何使用 rabbit.js,那就更好了...

编辑::

根据 Derick Bailey 的要求 这就是我需要这个的原因

我有一个系统,其中有许多负载平衡的 nodeJS 服务器作为 web 服务运行。 他们对彼此是完全透明的。 none 其中知道存在哪些其他节点。我想保持这种方式,因为这种分离让我更容易通过添加和删除其他 "parallel" 个节点来更好地扩展。

这些节点中的每一个都有自己的内存本地缓存服务。我偶然发现了单个节点更新某个实体的情况。现在我需要让这个节点能够通知所有其他并行节点(缓存中可能有相同的实体)使其无效。

问题是我发送消息的节点(更新节点)也会收到消息,因为他也是一个监听器。所以我希望他以某种方式将自己排除在该特定消息的接收者列表之外……因此需要一些路由黑名单。 (他知道自己,所以我可以让他路由到除了他自己的 id 之外的所有人......但他不知道即使有人确实在另一端监听......所以它肯定不能成为白名单)

希望我的需求现在更清楚了。

我已经想到了解决我的问题的方法,但它需要我这边的额外开发,我想通过使用 rabbit 当前的能力来避免它(以防万一) 我可以在消息的内容中添加一个唯一的 ID。那么发送节点可以识别出这条消息来自他并忽略该消息。 但是正如您显然可以理解的那样,这可能会变得棘手,因为我需要考虑额外的陷阱和其他边缘情况它可能会失败...

如果有人能告诉我如何使用一些现有的 rabbit 配置来做到这一点,我将非常高兴听到如何:)

这应该是可行的...但它可能有点棘手,或者需要与您当前正在做的设置不同的设置。

需要考虑的一件事:使用扇出交换意味着绑定的所有队列都将接收消息。如果您需要阻止某些队列获取消息,则扇出可能不是一个好主意。

但这在很大程度上取决于发送的消息。如果有特定类型的消息需要以不同方式处理,那么您可能只需要为该类型的消息使用不同的交换/队列绑定。

至于黑名单...我不知道这是否可能。主题交换允许将路由关键组件列入白名单。

例如,foo.*.bar 的绑定将允许任何以 "foo." 开头、中间有任何单词并以“.bar”结尾的路由键。

据我所知,无法将路由关键段列入黑名单。

您最好的选择似乎是重新考虑如何配置您的系统。

如果您发布了一个您需要做什么的示例,它可能会有所帮助...您处理的是什么类型的消息,以及为什么您有这么多消费者,包括消费相同消息的生产者。

--

p.s。我使用 rabbit.js 一段时间后发现我不喜欢它的限制。我切换到 wascally 库,并在其上为节点构建自己的 rabbus 库。您可能会检查它们...它们更加灵活,并且 rabbus 提供了许多开箱即用的相同模式。

不知道我为什么要回答这个问题(因为我是第一个问这个问题的人)我认为我的解决方案会对其他人有所帮助。

无论如何,我从未真正在整个 amqp 架构中找到解决方案。 所以我发明了自己的解决方案:)

我所做的是在每个节点上创建一个内部服务,将这些类型的 "ham radio style" 消息发送给除他自己以外所有关心倾听的人。

此服务在将消息传递到 rabbitMQ 之前,为在此交换上发送的每条消息添加一个唯一的哈希值。并将散列保存在本地 collection.

每个在此交换上接收消息的节点,首先测试他是否是发送消息的节点(通过验证消息哈希是否在他的 "sent message" 队列中可用)。

如果他在他的 collection 中检测到它,本地服务将忽略该消息 如果他没有检测到它,他不会忽略该消息并将其传递给应该处理它的代码段

发送了一条无用的消息 在此队列上发送的每条消息都有一些代码开销

但最重要的是,它很有魅力

希望对某人有所帮助

我真的相信这个 "HAM radio style" 只有发件人没有收到消息的交换可能是有用的

有人认为我应该联系设计 amqp 架构的人,以便他们添加它吗? :)