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

标签 node.js rabbitmq amqp node-amqp

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

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

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

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

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

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

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

编辑::

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

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

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

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

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

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

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

最佳答案

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

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

我所做的是在每个 Node 上创建一个内部服务,将那些“业余 radio 风格”的消息发送给除他自己之外所有关心收听的人。

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

在这个交换器上接收消息的每个 Node ,首先测试看他是否是发送消息的人(通过验证消息哈希是否在他的“已发送消息”队列中可用)。

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

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

但最重要的是,它就像一个魅力

希望对大家有帮助

我真的相信这种只有发送者不接收消息的“HAM radio 风格”交换是有用的

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

关于node.js - 如何向除发布者之外的所有订阅者发送消息,发布者也是同一 rabbitMQ 队列上的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31817696/

相关文章:

javascript - eslint 应该列在项目的依赖项中,而不是 devDependencies

python - Rabbitmq 鼠兔自动重连

rabbitmq - 生产者/消费者的不同语言

php - 运行 Symfony 命令时无法加载 PHP 类

javascript - 带有 javascript/cylonjs 的云盾

html - 如何使用 node.js 在 cheerio 中获取元素名称

node.js - 如何从本地应用程序服务器捕获电子邮件。 Nodejs

amazon-ec2 - 如何在运行 RabbitMQ 实例的情况下正确快照 EBS 卷?

python - 为什么我们需要使用rabbitmq

python - RabbitMQ 不断关闭连接