当前位置: 首页 > 知识库问答 >
问题:

在Rabbitmq中从同一队列发布和订阅

尤钱明
2023-03-14

我正在尝试设置到系统中所有节点的广播消息。当一个新节点加入系统时,它会向其他所有节点发布一条html" target="_blank">消息来宣布它的加入。我设计的方式是,存在一个交换,所有节点都将绑定到它自己的队列。每当一个新节点加入系统时,它就会将其队列绑定到exchange并将消息发布到exchange。所有节点都会收到这个消息(包括自身),所有其他节点(除了这个消息)都会发送一个“ACK”消息,这样新节点就会了解系统中可用的节点。但不知怎的,我没办法把它弄好。我的广播消息不会传播到系统中的每个节点。一个简单的节点发布和rest消耗正在工作。但同一节点的发布和消费在某个地方却搞砸了。

除了上面提到的逻辑,有没有其他有效的方法?或者从rabbitmq的角度来看,实现上述目标是否有任何限制,或者是我的代码有缺陷,我是否必须仔细查看它。

共有1个答案

甄佐
2023-03-14

按照你所描述的方式,你的解决方案应该能奏效。但是,如果没有更详细的代码示例(“Announcer”中的消费/发布逻辑和其他对等体中的消费/确认-发布逻辑),就很难调试。

不过,有几个常见的问题可能会使您陷入困境:

  • 如果您将“Did I get response back from all the other nodes get my annound message”作为“Did the other nodes get my annound message”的权限,则可能需要确认(在AMQP中为basic.ack)播音器接收到的消息。否则,可能由于使用者预取而看不到后续消息,尽管在大多数客户端库中,您必须先在某个地方显式地打开它。
    • 确保您的其他对等方(接收“公告”并返回消息的对等方)也在确认该消息,或者在“no-ack”模式下进行消费。否则,如果它们被阻塞(通过流、速率限制或预取),它们可能会收到一段时间的通知,然后停止。
    • 确保您使用的是“扇出”类型的交换。听起来你想要无条件扇出的行为,所以你不需要在主题路由上胡闹。如果您使用的是主题交换或直接交换,您的路由逻辑中可能有一个bug,在这种情况下,切换到扇出将起作用。不过我怀疑你已经在这么做了。
    • 这可能不是问题所在,而是:您提到您的同伴(而不是播音员)正在“承认”宣布。确保他们通过直接将新消息发布回公告者的队列(没有交换,只有路由密钥)来确认公告,而不是通过将basic.ack发送到RabbitMQ(不会通知发送者任何内容),也不是通过将已接收的公告发布到扇出交换。

 类似资料:
  • 一种方法是声明队列并将消息发布到该队列,并让所有使用者从该队列中消费。这将在不同的消费者之间分发消息。 我不清楚,如果上面的操作是正确的,或者最佳实践是将消息传递到Exchange而不是直接发布到队列。使用Exchange时,我必须确保在生产者创建Exchange之后声明队列,然后才开始发布消息。否则,没有队列接收到消息,并且消息将丢失。

  • 我已经安装了以下版本的芹菜和拉比MQ- 芹菜3.1。6 rabbitmq 3.1。1. 我可以从PHP向默认队列发布任务- 我的worker模块是用python编写的- 我像这样管理芹菜工人和客户- 这很有效。我在终端窗口1中看到以下输出: 但是我想要不同的队列。为了演示,假设我只需要一个名为demo的队列。所以我像这样管理我的芹菜工人- 但它不起作用。任务未得到执行。我猜这可能是因为PHP代码将

  • 我有两个独立实例(p1、p2)的生产者应用程序和两个独立实例(c1、c2)的消费者应用程序。 生产者p1连接到exchange,主题为t1,队列名称为name1。 使用者c1连接到exchange,主题为t1,队列名称为name1。 生产者p2连接到exchange,主题为t2,队列名称为name1。 使用者c2连接到exchange,主题为t2,队列名称为name1。 我在RabbitMQ GU

  • 我很难理解RabbitMQ的基本概念。我发现在线文档并不十分清楚。 到目前为止,我理解了什么是通道、队列、绑定等。 但如何实现以下用例: 用例:发件人以不同的主题发布到一个交易所。在接收者方面,根据主题,应该通知不同的接收者。 因此,通过主题交换,以下内容应该是可行的: 创建频道 我的困难在于回调与通道相关,而与队列或队列绑定无关。我不能百分之百确定我是否在这里。 这就是我的问题:为了有多个回调,

  • 这只是为了澄清发布/订阅线程。 我的疑问是在正常的发布者/订阅者模式中,订阅者和发布者是在同一个线程上运行还是在不同的线程中运行? 还是取决于实现? 到目前为止,我所想的是不同的订阅会有自己的线程,而publisher在其上运行的是自己的线程?

  • 发布和订阅 Meteor 服务端可以通过Meteor.publish发布文档集,同时客户端可以通过Meteor.subscribe订阅这些发布。 任何客户端订阅的文档都可以通过find方法进行查询使用。 默认情况下,每个新创建的 Meteor 应用包含有 autopublish 包,它会自动为每个客户端发布所有可用的文档。 为了可以更细化的控制不同客户端所接收的数据文档,首先应该在终端移除 aut