等待 fanout 交换上的所有 rabbitmq 响应?

Posted

技术标签:

【中文标题】等待 fanout 交换上的所有 rabbitmq 响应?【英文标题】:Waiting for all rabbitmq responses on a fanout exchange? 【发布时间】:2014-05-07 10:31:07 【问题描述】:

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

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

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

【问题讨论】:

你能把那些没有回应的人视为“down”吗? 当然,如果一个节点没有响应,它就会关闭。但是一个 ping 请求会产生许多 ping 回复,如果我只是 sleep() 10 秒并查看我得到了多少响应,这似乎很糟糕,例如,如果每个节点都在 1 秒内响应。 我觉得没那么糟糕;你等待一段时间,如果它在这段时间内没有响应,它就停止了 我想我今天问了同样的问题。 (我尽可能将我的标记为重复):***.com/questions/37117670/… 【参考方案1】:

您正在寻找类似于 Scatter-Gather (http://www.eaipatterns.com/BroadcastAggregate.html) 模式的东西,不是吗?

您不知道绑定到扇出的消费者,因此您可以:

    使用例如绑定生产者的队列来实现消费者的保持活动状态。 每个消费者每秒钟发送一次keep-alive,如果您没有收到消息,您可以考虑消费者离线。 使用注册消费者的内存数据库(始终保持活动状态)。 使用HTTP API了解扇出绑定的消费者列表,方式如下:

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)

我不确切知道您的最终范围,但是通过保持活动,您最多可以等待一秒钟,然后再决定消费者是否还活着。

【讨论】:

http-api 的回答很顺利。

以上是关于等待 fanout 交换上的所有 rabbitmq 响应?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ学习笔记4-使用fanout交换器

rabbitMQ的第三种模型(fanout)

rabbitMQ的第三种模型(fanout)

RabbitMQ——使用Exchange中的fanout交换机实现消息发送和接收

RabbitMQ——使用Exchange中的fanout交换机实现消息发送和接收

spring boot整合RabbitMQ(Fanout模式)