在扇出交换机上等待所有rabbitmq响应?

时间:2014-05-07 10:31:07

标签: rabbitmq amqp

我已经配置了一个名为" ex_foo"的#rabbit;对于RPC工作负载。当客户端连接到服务器时,它们会创建自己的非持久RPC接收队列,并使用BasicConsumer连接到它。应用程序侦听消息/命令并响应请求的reply_to部分中定义的队列。

我发送扇出交换的一个简单消息/命令(因此,每个连接到它的应用程序/客户端)都是一种 ping请求消息,而我的问题是我不知道我会得到多少ping响应(或者应该期待),因为我不知道有多少客户端连接到任何一个扇出交换机时间。连接到扇出交换的所有客户都应该回复。

如果在扇出交换机上传送到10个队列(即:连接了10个客户端),我怎么知道有多少响应?为了知道这一点,我是否必须知道交付了多少次?有没有更复杂的睡眠计时器?简单地说,我的管理工具无法无限期等待,并且在收到所有ping (或超时已过)后需要退出。

1 个答案:

答案 0 :(得分:6)

你正在寻找的是像Scatter-Gather(http://www.eaipatterns.com/BroadcastAggregate.html)模式,不是吗?

你不知道消费者会受到扇出的影响,所以你可以:

  1. 使用例如生成器绑定的队列来实现来自消费者的保持活动。 每个消费者每隔一秒发送一次保活,如果你没有收到消息,你可以让消费者离线。
  2. 使用已注册消费者的内存数据库(始终使用保持活动状态)。
  3. 使用HTTP API以这种方式了解绑定到扇出的消费者列表:
  4. http://rabbitmqip/vhost/yourfanout/bindings/source,结果如下:

     [{"source":"yourfanout","vhost":"/","destination":"amq.gen-xOpYc8m10Qy1s4KCNFCgFw","destination_type":"queue","routing_key":"","arguments":{},"properties_key":"~"},{"source":" yourfanout","vhost":"/","destination":"myqueue","destination_type":"queue","routing_key":"","arguments":{},"properties_key":"~"}]
    

    一旦计算了消费者,就会知道回复的数量。

    在发送请求之前调用API。

    注意只有在使用绑定到消费者的临时队列时,最后一个才能正常工作。

    我发现这个资源可以帮助你(http://geekswithblogs.net/michaelstephenson/archive/2012/08/06/150373.aspx

    我不确切地知道你的最终范围,但是在保持活着的情况下,你可以等待最多一秒钟,然后再决定消费者是否还活着。