向除我之外的每个 AMQP 客户端发送消息
Send a message to every AMQP client, except me
我使用 RabbitMQ 如下:
- 创建直接交换"FooExchange"
- 使用名为 "client_A_queue"
的 queue 将客户端 "A" 连接到 "FooExchange"
- 使用名为 "client_B_queue"
的 queue 将客户端 "B" 连接到 "FooExchange"
- 使用名为 "client_C_queue"
的 queue 将客户端 "C" 连接到 "FooExchange"
现在,当客户端 "A" 向交易所发布消息时,每个人都会收到。
有什么方法可以避免客户端 "A" 收到自己的消息吗?
(每个客户端都一样:客户端不应该接收自己的消息)
目前我添加了 "sender" header 和发件人 UniqueID,我在客户端源代码中过滤了这些消息,但我认为应该存在更好的解决方案。
(在现实世界的情况下,我可以有很多客户,并不是所有客户都知道所有其他客户的存在)
谢谢。
编辑:
也许直接交换不是好的解决方案。有什么方法可以仅通过 exchange/queue/routing 配置来满足我的需求,还是我应该在客户端应用程序中使用代码来过滤这些消息?
当然,如果我连接了 1000 个客户端,我真的不能为每个客户端使用一个路由键,并向 999 个路由键发送消息,只是为了排除一个。
来自您的评论
Every client publish messages the same way : to "FooExchange"
exchange, with routing key "FooKey". Every client bind it's queue to
"FooKey" on "FooExchange
您发布的方式不正确。您必须使用不同的路由密钥定义每个订阅者到哪个交换机和哪个路由key.So,因为这是您想要的。检查 the first tutorial on rabbitmq website。还请记住,当使用直接交换时,订阅方 queue 的名称与发布方的路由密钥相同。
取自 here.
EDIT 回答问题中的编辑
这部分我没看懂
I can't really use one routing key for each client and send message to
999 routing keys jsut to exclude one.
您需要更准确地指定您需要的内容。
总之,我建议你检查一下exchanges:direct、fanout、topic和headers的所有类型。更多信息已经在我提供的 link 图片下方。
编辑2:
我想我终于明白什么是用例了。
如果没有其他标准可用于标记消息或客户端,那么您将不得不使用扇出交换,并且如果它是 "self-sent",则不要对消息做出反应。可能您可以使用 headers 交换并使用某种映射,但它似乎最终会相同。 AFAIK,没有包含 NOT something.
的主题交换模式
简短的回答是这不能直接在 RabbitMQ 中完成。
路由键匹配没有否定,所以你不能用路由键或绑定说 "all, but not this one"。
For the moment I have added a "sender" header with a sender UniqueID and I filter these messages in the client source code, but I think that a better solution should exist.
这几乎就是您需要做的
我使用 RabbitMQ 如下:
- 创建直接交换"FooExchange"
- 使用名为 "client_A_queue" 的 queue 将客户端 "A" 连接到 "FooExchange"
- 使用名为 "client_B_queue" 的 queue 将客户端 "B" 连接到 "FooExchange"
- 使用名为 "client_C_queue" 的 queue 将客户端 "C" 连接到 "FooExchange"
现在,当客户端 "A" 向交易所发布消息时,每个人都会收到。
有什么方法可以避免客户端 "A" 收到自己的消息吗? (每个客户端都一样:客户端不应该接收自己的消息)
目前我添加了 "sender" header 和发件人 UniqueID,我在客户端源代码中过滤了这些消息,但我认为应该存在更好的解决方案。
(在现实世界的情况下,我可以有很多客户,并不是所有客户都知道所有其他客户的存在)
谢谢。
编辑:
也许直接交换不是好的解决方案。有什么方法可以仅通过 exchange/queue/routing 配置来满足我的需求,还是我应该在客户端应用程序中使用代码来过滤这些消息?
当然,如果我连接了 1000 个客户端,我真的不能为每个客户端使用一个路由键,并向 999 个路由键发送消息,只是为了排除一个。
来自您的评论
Every client publish messages the same way : to "FooExchange" exchange, with routing key "FooKey". Every client bind it's queue to "FooKey" on "FooExchange
您发布的方式不正确。您必须使用不同的路由密钥定义每个订阅者到哪个交换机和哪个路由key.So,因为这是您想要的。检查 the first tutorial on rabbitmq website。还请记住,当使用直接交换时,订阅方 queue 的名称与发布方的路由密钥相同。
取自 here.
EDIT 回答问题中的编辑
这部分我没看懂
I can't really use one routing key for each client and send message to 999 routing keys jsut to exclude one.
您需要更准确地指定您需要的内容。
总之,我建议你检查一下exchanges:direct、fanout、topic和headers的所有类型。更多信息已经在我提供的 link 图片下方。
编辑2: 我想我终于明白什么是用例了。 如果没有其他标准可用于标记消息或客户端,那么您将不得不使用扇出交换,并且如果它是 "self-sent",则不要对消息做出反应。可能您可以使用 headers 交换并使用某种映射,但它似乎最终会相同。 AFAIK,没有包含 NOT something.
的主题交换模式简短的回答是这不能直接在 RabbitMQ 中完成。
路由键匹配没有否定,所以你不能用路由键或绑定说 "all, but not this one"。
For the moment I have added a "sender" header with a sender UniqueID and I filter these messages in the client source code, but I think that a better solution should exist.
这几乎就是您需要做的