在Rabbitmq中发布和订阅相同的队列

时间:2013-09-07 16:23:07

标签: rabbitmq

我正在尝试为系统中的所有节点设置广播消息。当新节点加入系统时,它会向其他人发布消息以宣布其输入。我设计的方式是,存在一个交换,所有节点都将绑定自己的队列。每当新节点加入系统时,它都会将其队列绑定到交换机并向交换机发布消息。所有节点都将接收此msg(包括其自身),并且所有其他节点(此消息除外)将发送“ack”消息,以便新节点将了解系统中的可用节点。但不知怎的,我无法让这个工作。我的广播消息不会传播到系统中的每个节点。一个简单的单节点发布和休息正在工作。但同样的节点发布和消费在某种程度上被搞砸了。

除了上面提到的逻辑之外,还有其他有效的方法吗?或者从rabbitmq的角度来看是否有任何限制来实现上述目标,或者我的代码是否有问题,我是否需要仔细研究它。

2 个答案:

答案 0 :(得分:1)

您描述的方式,您的解决方案应该有效。但是,如果没有更详细的代码示例(“播放器”中的消耗/发布逻辑和其他对等体中的消耗/确认发布逻辑),则很难进行调试。

但是,有几个常见的问题可能会让你失望:

  • 如果您正在考虑“我是否从所有其他节点获得响应”作为“其他节点是否收到我的通知消息?”的权限,您可能需要确认(AMQP中的basic.ack)你的播音员收到的消息。否则,你可能没有看到由于consumer prefetch而导致的后续消息,尽管在大多数客户端库中你必须先在某个地方明确地转换它。
    • 确保您的其他对等方(接收“通知”并发回消息的对方)也正在确认该消息,或者正在以“no-ack”模式消费。否则,如果它们被阻止(通过流量,速率限制或预取),它们可能会在一段时间内收到通知然后停止。
    • 确保您使用的是"fanout" type exchange。听起来你想要无条件扇出行为,所以你不需要考虑主题路由。如果您正在使用主题或直接交换,您的路由逻辑可能存在错误,在这种情况下,切换到扇出将起作用。我怀疑你已经这样做了。
    • 这可能不是问题,但是:你提到你的同伴(不是播音员)正在“承认”宣布。确保他们通过将直接发送回播音员队列的新消息(没有交换,只是路由密钥)来确认通知,而不是通过向RabbitMQ发送basic.ack(不是不要通知发件人任何事情,而不是通过向粉丝交易所发布收到的公告。

顺便说一句,我不知道你为什么要进行declare-queue / bind / publish而不是发布/ declare-queue / bind;是否有充分的理由需要一个通知节点来接收自己的通告消息?如果您正在进行“自我测试”行为,我认为最好只实施定期“可以成功宣布的事情吗?”相反,在某处进行健康检查,尽管那是完全主观的。

答案 1 :(得分:0)

您是否尝试过使用您在广播消息中确定的回调队列的RPC样式消息?就像the rabbitmq tutorial一样。