【问题标题】:Send a message to every AMQP client, except me向每个 AMQP 客户端发送消息,除了我
【发布时间】:2016-05-21 05:58:01
【问题描述】:

我使用 RabbitMQ 如下:

  • 创建直接交换“FooExchange”
  • 使用名为“client_A_queue”的队列将客户端“A”连接到“FooExchange”
  • 使用名为“client_B_queue”的队列将客户端“B”连接到“FooExchange”
  • 使用名为“client_C_queue”的队列将客户端“C”连接到“FooExchange”

现在,当客户端“A”向交易所发布消息时,每个人都会收到。

有没有办法避免客户端“A”接收自己的消息? (每个客户端都一样:客户端不应该收到自己的消息)

目前我已经添加了一个带有发件人 UniqueID 的“发件人”标头,并在客户端源代码中过滤了这些消息,但我认为应该存在更好的解决方案。

(在现实世界中,我可以有很多客户,并不是所有客户都知道所有其他客户的存在)

谢谢。

编辑:

也许直接交换不是好的解决方案。有什么方法可以仅通过交换/队列/路由配置来满足我的需求,还是应该在客户端应用程序中使用代码来过滤这些消息?

当然,如果我连接了 1000 个客户端,我不能真正为每个客户端使用一个路由键,然后将消息发送到 999 个路由键来排除一个。

【问题讨论】:

    标签: rabbitmq amqp


    【解决方案1】:

    简短的回答是,这不能直接在 RabbitMQ 中完成。

    路由键匹配中没有否定,因此您不能使用路由键或绑定说“全部,但不是这个”。

    目前我已经添加了一个带有发件人 UniqueID 的“发件人”标头,并在客户端源代码中过滤了这些消息,但我认为应该存在更好的解决方案。

    这几乎是你需要做的

    【讨论】:

      【解决方案2】:

      来自您的评论

      每个客户端都以相同的方式发布消息:到“FooExchange” 交换,使用路由键“FooKey”。每个客户端都绑定它的队列 “FooExchange”上的“FooKey”

      您没有以正确的方式进行发布。您必须定义到哪个交换和哪个路由键。所以每个订阅者都有不同的路由键,因为这是您想要的。检查the first tutorial on rabbitmq website。还要记住,使用直接交换时,订阅端的队列名称与发布端的路由键相同。

      以下是直接交换的工作原理

      取自here

      EDIT 回答问题中的编辑
      这部分我不是很懂

      我真的不能为每个客户端使用一个路由键并将消息发送到 999个路由键只需要排除一个。

      您需要更准确地指定您的需求。
      无论如何,我建议您检查所有类型的交换:直接、扇出、主题和标题。更多信息已经在我提供的链接中,在图片下方。

      EDIT2: 我想我终于明白了用例是什么。 如果没有其他标准可用于标记消息或客户端,那么您将不得不使用扇出交换,并且如果消息是“自发送”的,则根本不要对消息做出反应。潜在地,您可以使用标头交换并使用某种映射,但似乎最终会相同。 AFAIK,没有包含 NOT something 的主题交换模式。

      【讨论】:

      • 每个客户端都以相同的方式发布消息:到“FooExchange”交换,使用路由键“FooKey”。每个客户端都将其队列绑定到“FooExchange”上的“FooKey”
      • 所以每个客户端都会收到每条消息,因为它们都使用相同的路由密钥和相同的交换。你明白我在答案中写的直接交流的内容吗?
      • 是的,我了解本教程。我已经编辑了我的问题
      • 明确一点:我有 1000 个客户。当客户发送消息时,我希望其他 999 人接收消息。我不希望发件人收到自己的消息。我希望所有客户端发送的所有消息都具有这种行为。
      • 你读过我原来的问题吗?我已经在客户端中添加了标题和代码以避免自发消息。我正在寻找一种更好/更智能的方法来做到这一点。 (如果有的话)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 2015-04-07
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多