向除我之外的每个AMQP客户端发送消息

时间:2016-05-20 08:28:44

标签: rabbitmq amqp

我使用RabbitMQ如下:

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

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

无论如何都要避免客户“A”收到自己的消息? (对于每个客户端都是一样的:客户端不应该收到自己的消息)

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

(在现实世界的情况下,我可以有很多客户,并非所有客户都知道所有其他客户的存在)

感谢。

编辑:

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

当然,如果我连接了1000个客户端,我实际上不能为每个客户端使用一个路由密钥,并将消息发送到999路由密钥jsut以排除一个。

2 个答案:

答案 0 :(得分:1)

来自您的评论

  

每个客户端都以相同的方式发布消息:to" FooExchange"   交换,路由密钥" FooKey"。每个客户端将其队列绑定到   " FooKey" on" FooExchange

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

以下是直接交换的工作原理 enter image description here

取自here

编辑以回答问题中的修改
我真的不明白这部分

  

我无法为每个客户端使用一个路由密钥并向其发送消息   999路由密钥jsut排除一个。

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

<强> EDIT2: 我想我终于明白了用例是什么。 如果您没有其他标准可用于标记邮件或客户端,那么您必须使用扇出交换,并且如果它是&#34;并且根本不对该消息做出反应。自发送&#34 ;.可能你可以使用头交换并使用某种映射,但它似乎最终会相同。 AFAIK,没有主题交换模式,包括 NOT 某些

答案 1 :(得分:1)

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

路由密钥匹配没有任何否定,所以你不能用路由密钥或绑定来说“全部,而不是这个”。

  

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

这几乎是你需要做的事情