我安装了一个由nodeJS服务器使用的rabbitMQ。 我使用rabbit.js库与兔子互动,到目前为止我很高兴。
我在扇出模式下在同一队列中有多个订阅者, 作为订户的每个节点也是发布者 这对我有好处并且运行正常,因为在很多情况下我想要通知所有服务器关于在其中一个节点上发生的更新(也是发布者......)
我偶然发现了一个案例,我需要向队列中的所有侦听器发送一条消息,除了发送它的人(也是同一队列上的侦听器)。
我事先并不知道谁在听(可能有单一的,可能有数百万),所以我无法通过一些白名单路由规则将其路由到某些特定节点。 它必须是某种排除通配符路由规则(一些黑名单) 例如,将此消息发送给所有听取与我自己的唯一ID无关的人...
可以用rabbit.js完成吗? 甚至可以用兔子做某事吗?
我不太了解兔子...... 所以对我温柔:)
不过,如果你知道如何使用rabbit.js,那就更好了......EDIT ::
根据Derick Bailey的要求 这就是我需要这个的原因
我有一个系统,其中有许多负载均衡的nodeJS服务器作为webServices运行。 它们彼此完全透明。 他们都不知道存在哪些其他节点。我想保持这种方式,因为这种分离使我更容易通过添加和删除其他“并行”节点来更好地扩展。
这些节点中的每一个都有自己的内存本地缓存服务。我偶然发现了一个节点更新某个实体的情况。现在我需要让这个节点通知所有其他并行节点(可能在缓存中有相同的实体)来使它无效。
问题是发送消息的节点(更新节点)也会收到消息,因为他也是一个监听器。所以我希望他以某种方式将自己排除在该特定消息的接收者列表之外......因此需要一些路由黑名单。 (他知道自己,所以除了他自己的身份之外,我可以让他走向所有人...但他不知道即使有人确实正在听另一端......所以它肯定不能成为白名单)
希望我的需要现在更加清晰。
我已经想到了解决我的问题的方法,但它需要我的额外开发,我想通过使用兔子的当前能力来避免它(如果可能的话) 我只能在邮件内容中添加一个唯一的ID。然后发送节点可以识别出该消息来自他并忽略该消息。 但是你可以明白地理解,这可能会变得棘手,因为我需要考虑其他陷阱和其他可能失败的边缘情况......
如果有人可以告诉我如何使用现有的兔子配置,我会非常高兴听到如何:)
答案 0 :(得分:1)
这应该是可能的......但它可能有点棘手,或者需要与您当前正在进行的设置不同的设置。
要考虑的一件事:使用扇出交换意味着绑定的所有队列都将收到消息。如果你需要阻止某些队列获取消息,那么扇出可能是一个坏主意。
这在很大程度上取决于发送的消息。如果存在需要以不同方式处理的特定类型的消息,那么您可能只需要针对该类型的消息使用不同的交换/队列绑定。
黑名单......我不知道这是否可行。主题交换允许路由关键组件的白名单。
例如,foo.*.bar
的绑定将允许任何以" foo开头的路由键。",中间有任何单词,以" .bar&#结尾34 ;.
据我所知,没有办法将路由密钥段列入黑名单。
似乎您最好的选择是重新考虑如何配置系统。
如果你发布了一个你需要做什么的例子......你要处理什么类型的消息,以及为什么你有这么多消费者,包括生产者消费相同的消息,这可能会有所帮助。
-
P.S。我使用了rabbit.js一段时间后发现我并不喜欢它的局限性。我切换到wascally
库,并在其上构建我自己的rabbus
库节点。你可能会把它们检查出来......它们有点灵活,而且rabbus提供了很多开箱即用的相同模式。
答案 1 :(得分:1)
不知道为什么我回答这个问题(因为我是第一个问这个问题的人)我认为我的解决方案会帮助别人。
无论如何,我从未在整个amqp架构中找到解决方案。 所以我发明了自己的解决方案:)
我所做的是在每个节点上创建一个内部服务,发送那种" ham无线电样式"向所有关心的人发出的信息,但他自己。
此服务为传递给rabbitMQ之前在此交换机上发送的每条消息添加一个唯一的哈希值。并将哈希保存在本地集合中。
在此交换机上接收消息的每个节点,首先测试是否是发送它的人(通过验证消息散列是否在他的"发送消息"队列中)。
如果他在他的集合中检测到它,本地服务会忽略该消息 如果他没有检测到它,他不会忽略该消息并将其传递给应该处理它的代码
发送了一条无用的消息 每个在此队列上发送的消息都会有一些代码开销
但是按钮线,它就像一个魅力
希望它可以帮助某人
我真的相信这个" HAM广播风格"只有发送者没有收到消息的交换可能是有用的
有人认为我应该联系设计amqp架构的人,以便他们添加它吗? :)