使用 AMQP 处理分区数据的最佳方式?

Best way handle partitioned data with AMQP?

我有几个类似的系统,它们对我的数据的不同部分具有权威性,但我无法仅从我的 "keys" 判断哪个系统拥有哪些实体。

我正在努力在 AMQP (RabbitMQ) 之上构建这个系统,看来处理这个问题的最佳方法是:

  1. 创建一个名为 thingInfo 的 Fanout 交换器,并让我所有的其他系统将它们自己的匿名队列绑定到该交换器。
  2. 向交换器发送消息:{"thingId": "123abc"},并设置 reply_to 队列。
  3. 等待其中一位远程主机回复我的消息,或者等待超时。

这是解决此类问题的最佳方法吗?或者是否有更好的方法来构建我正在寻找的内容?这感觉很像 RabbitMQ 文档中的 RPC 示例,除了我觉得使用广播交换会使事情复杂化。

我想我基本上是在尝试模仿为 MCollective's Message Flow 描述的模型,但是,虽然我认为 MCollective 通常期望不止一个响应,但在这种情况下,我会 expect/require 恰好是一个或者,最好是来自 "everyone" 的明确 "nope, don't have it, go fish" 响应(如果在这种架构中真的有可能知道这一点?)。

也许另一个最适合的模型是“Scatter-Gather"? It seems there's support for this in Spring Integration

这是一个合理的架构(让不感兴趣的消费者直接忽略该消息)。

如果有某种方法可以将消费者用来决定兴趣的相关数据提取到 headers,那么您可以通过使用主题交换而不是扇出来提高效率。

在任何一种情况下,如果不止一个消费者可能回复,就会变得棘手。

正如您所说,如果零消费者回复,您可以使用超时,但如果您认为这可能很频繁,您最好使用任意 two-way 消息传递并在代码中进行回复关联而不是而不是使用 request/reply 并占用线程等待永远不会到来的回复,然后超时。

这也可以处理 multi-reply 的情况。