3

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

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

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

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

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

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

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

编辑::

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

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

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

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

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

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

如果有人可以告诉我如何使用一些现有的兔子配置来做到这一点,我会很高兴听到如何:)

4

2 回答 2

2

不知道我为什么要回答这个问题(因为我是首先提出这个问题的人)我认为我的解决方案会帮助其他人。

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

我所做的是在每个节点上创建一个内部服务,将那些“业余无线电风格”的消息发送给除了他自己以外的所有愿意听的人。

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

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

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

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

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

希望它可以帮助某人

我真的相信这种只有发件人没有收到消息的“HAM 无线电风格”交换可能是有用的

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

于 2015-08-29T17:00:13.910 回答
1

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

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

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

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

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

据我所知,没有办法将路由密钥段列入黑名单。

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

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

--

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

于 2015-08-05T03:02:45.923 回答