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

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

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

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

我不知道谁在监听(可能有一个,可能有几百万),所以我不能通过一些白名单的路由规则将它路由到一些特定的节点。 它必须是某种排除通配符路由规则(一些黑名单),例如,发送这个消息给每个人听谁不对应我自己的唯一ID …

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

我不太了解那只兔子,所以要对我温柔:)

顺便说一句,如果你知道如何使用rabbit.js,甚至更好…

编辑::

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

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

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

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

希望我的需要现在更清楚。

我已经想到了解决我的问题,但它需要额外的发展在我身边,我想通过使用兔子的当前能力(如果可能的话),以避免它我可以只添加一个唯一的ID的内容的消息。 那么发送节点可以认识到这个消息来自他并忽略这个消息。 但正如你可以明白,这可能会变得棘手,因为我需要考虑更多的陷阱和其他边缘情况下可能会失败…

如果有人能告诉我如何使用一些兔子现有的configuration,我会很高兴听到如何:)

这应该是可能的…但它可能有点棘手,或需要一个不同于你目前正在做的设置。

有一件事要考虑:使用扇出交换意味着所有被绑定的队列将收到消息。 如果你需要阻止一些队列得到消息,那么一个扇出可能是一个坏主意。

尽pipe这在很大程度上取决于发送的消息。 如果存在需要以不同方式处理的特定types的消息,那么您可能只需要该types消息的不同交换/队列绑定。

至于黑名单…我不知道这是可能的。 话题交换允许路由关键组件的白名单。

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

就我所知,无法将路由密钥段列入黑名单。

这似乎是你最好的select是重新考虑你如何configuration你的系统。

如果你发布了一个你需要做的事情的例子,你可能会遇到什么样的消息,为什么你有这么多的消费者,包括消费者使用相同的消息。

ps我用了一段时间rabbit.js,发现我不喜欢它的限制。 我切换到wascally库,并build立我自己的rabbus库的节点上面。 你可能会检查出来…他们有点更灵活,Rabbus提供了很多相同的模式。

不知道为什么我回答这个问题(因为我是第一个提问的人),我认为我的解决scheme将帮助其他人。

无论如何,我从来没有真正在整个amqp架构中find解决scheme。 所以我发明了我自己的解决scheme:)

我所做的就是在每个节点上创build一个内部服务,将这些“无线电广播风格”的消息发送给所有关心听的人,而不是他自己。

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

在这个交换机上接收消息的每个节点首先testing以确定他是否是发送它的人(通过validation消息散列是否在他的“发送消息”队列中可用)。

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

有一个无用的消息被发送,每个在这个队列上发送的消息都有一点代码开销

但buttom线,它的作品像一个魅力

希望它可以帮助别人

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

任何人都认为我应该联系deviseamqp架构的人,所以他们会添加它? 🙂