【问题标题】:how to send a message to all subscribers except for the publisher which is also a listener on same rabbitMQ queue如何向所有订阅者发送消息,除了发布者,它也是同一个rabbitMQ队列上的侦听器
【发布时间】:2015-08-04 19:31:34
【问题描述】:

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

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

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

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

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

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

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

编辑::

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

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

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

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

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

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

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

【问题讨论】:

    标签: node.js rabbitmq amqp node-amqp rabbit.js


    【解决方案1】:

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

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

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

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

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

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

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

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

    希望对某人有所帮助

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

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

      --

      附言我用了一段时间 rabbit.js,发现我不喜欢它的局限性。我切换到wascally 库,并正在为它上面的节点构建我自己的rabbus 库。你可以看看它们……它们更灵活一些,rabbus 提供了很多开箱即用的相同模式。

      【讨论】:

      • 感谢您的回答。我会发布更详细的场景。通常我需要它来在负载平衡集群中传播缓存失效消息。我不知道在任何给定时刻有多少个集群。它根据给定的负载而变化。
      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多