我使用RabbitMQ如下:
现在,当客户“A”向交易所发布消息时,每个人都会收到消息。
无论如何都要避免客户“A”收到自己的消息? (对于每个客户端都是一样的:客户端不应该收到自己的消息)
目前我添加了一个带有发件人UniqueID的“sender”标头,我在客户端源代码中过滤了这些消息,但我认为应该存在更好的解决方案。
(在现实世界的情况下,我可以有很多客户,并非所有客户都知道所有其他客户的存在)
感谢。
也许直接交换不是好的解决方案。有没有办法只满足交换/队列/路由配置我的需求,还是应该在客户端应用程序中使用代码来过滤这些消息?
当然,如果我连接了1000个客户端,我实际上不能为每个客户端使用一个路由密钥,并将消息发送到999路由密钥jsut以排除一个。
答案 0 :(得分:1)
来自您的评论
每个客户端都以相同的方式发布消息:to" FooExchange" 交换,路由密钥" FooKey"。每个客户端将其队列绑定到 " FooKey" on" FooExchange
您没有以正确的方式进行发布。您必须定义哪个交换机和哪个路由密钥。因此,每个订户具有不同的路由密钥,因为这是您想要的。检查the first tutorial on rabbitmq website。还要记住,在使用直接交换时,订阅端的队列名称与发布端的路由键相同。
取自here。
编辑以回答问题中的修改
我真的不明白这部分
我无法为每个客户端使用一个路由密钥并向其发送消息 999路由密钥jsut排除一个。
您需要更准确地指定所需内容
无论如何,我建议您检查所有类型的交换:直接,扇出,主题和标题。更多信息已经在我提供的链接中,在图片下方。
<强> EDIT2:强> 我想我终于明白了用例是什么。 如果您没有其他标准可用于标记邮件或客户端,那么您必须使用扇出交换,并且如果它是&#34;并且根本不对该消息做出反应。自发送&#34 ;.可能你可以使用头交换并使用某种映射,但它似乎最终会相同。 AFAIK,没有主题交换模式,包括 NOT 某些。
答案 1 :(得分:1)
简短的回答是,这不能直接在RabbitMQ中完成。
路由密钥匹配没有任何否定,所以你不能用路由密钥或绑定来说“全部,而不是这个”。
目前我添加了一个带有发件人UniqueID的“sender”标头,我在客户端源代码中过滤了这些消息,但我认为应该存在更好的解决方案。
这几乎是你需要做的事情