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

RabbitMQ和pika:同一通道上不同队列的不同回调?

丁宏盛
2023-03-14

我很难理解RabbitMQ的基本概念。我发现在线文档并不十分清楚。

到目前为止,我理解了什么是通道、队列、绑定等。

但如何实现以下用例:

用例:发件人以不同的主题发布到一个交易所。在接收者方面,根据主题,应该通知不同的接收者。

因此,通过主题交换,以下内容应该是可行的:

  • 创建频道

我的困难在于回调与通道相关,而与队列或队列绑定无关。我不能百分之百确定我是否在这里。

这就是我的问题:为了有多个回调,IOW:不同的消息处理程序,取决于订阅的主题-您是否必须创建多个通道,每个“不同的消息处理”一个?所有这些通道都应该获取相同的交换并为该特定主题定义自己的队列队列绑定?

请确认这是否正确,或者我是否偏离了AMPQ的规范路径。。。“queue”听起来很轻,所以我直觉地认为队列或队列绑定是连接消费事件处理程序的正确点,但似乎channel是我在这方面的朋友。正当

我问题的另一个方面:

如果我真的必须为此使用多个渠道,我是否必须为每个渠道声明相同的交换(交换名称和交换类型的“主题”)?我希望有这样的东西:

  • 使用此名称和“主题”类型定义一次交换
  • 对于每个通道,“抓取”此预定义的exchange,并通过向此exchange添加队列和队列绑定来使用它

共有1个答案

齐驰
2023-03-14

我发现单独考虑代理(RabbitMQ)和客户机(您的应用程序)的角色很有帮助。

代理RabbitMQ将从您的发布者接收消息,将它们路由到队列,并最终将它们发送给消费者。消息路由可以简单也可以复杂。在您的情况下,路由是基于主题的,有几个不同的队列。

您没有过多谈论发布者,可能是因为他们的工作很简单。他们将带有路由密钥的消息发送到RabbitMQ。

消费者方面是事情变得有趣的地方。在最简单的级别上,使用者订阅队列,从RabbitMQ接收消息,并对其进行处理。使用者打开到RabbitMQ的连接,并将通道用于特定用途(例如,订阅队列)。消息代理的威力在于,如果需要,它们允许设计者将流程分解为单独的应用程序。

除了显示不同的消息主题外,您对应用程序没有太多的了解。一个重要的设计选择是如何定义应用程序。不同的主题是否适用于不同的应用程序,或者单个应用程序是否可以处理所有类型的消息。

对于前一种情况,每个队列将有一个应用程序。订阅队列的单个通道可能是最明智的决定,除非您的应用程序需要线程化。对于线程化应用程序,每个线程都有自己的通道,所有线程都可以订阅到同一队列。每个应用程序都有自己的回调函数来处理该类型的消息。

对于后一种情况(具有多个队列的单个应用程序),最好的方法是每个队列至少有一个通道。听起来每个队列都需要自己的回调函数,您可以根据其订阅将函数分配给通道。如果应用程序可以同时处理(每个主题的)多条消息,则每个队列可能有多个通道。

关于您关于声明交换、队列和绑定的问题,这些项目只需要创建一次。但是让您的客户端在连接时声明它们是合理的做法。声明它们的好处是,如果它们被删除,它们将被再次创建,并且您的声明与代理上的内容之间的任何差异都将触发错误。

 类似资料:
  • 问题内容: 我是Oracle的新手。我有一个Oracle表有三列:,和。在第三列中的行具有值,或 。 我想使用count运行查询,以显示可维修的数量,正在维修的数量,针对每个项目类别的谴责数量。 我想运行类似的东西: 我无法在计数内运行内部查询。 这是我希望结果集看起来像的样子: 问题答案: 您可以在COUNT函数中使用CASE或DECODE语句。 输出:

  • 我正在尝试设置到系统中所有节点的广播消息。当一个新节点加入系统时,它会向其他所有节点发布一条消息来宣布它的加入。我设计的方式是,存在一个交换,所有节点都将绑定到它自己的队列。每当一个新节点加入系统时,它就会将其队列绑定到exchange并将消息发布到exchange。所有节点都会收到这个消息(包括自身),所有其他节点(除了这个消息)都会发送一个“ACK”消息,这样新节点就会了解系统中可用的节点。但

  • rabbitMQ教程部分中的hello world示例只要求使用不同机器的ip更改主机名。但这对我不起作用。我已尝试将外部IP地址绑定到Rabbit MQ服务器​ 但这不起作用。我还需要对配置文件或代码执行其他操作吗? 这是发送代码 还有我在另一台机器上运行的接收代码 我得到的错误是 我感谢你们花时间帮助我。

  • 和在我的机器上不在同一路径上,因此当(基本上一直)我需要运行这两个命令时,如下所示: 我得到: 下载包,但由于在安装结束时拒绝访问,因此最终失败。 通过执行,(哪个pip不返回任何内容)我知道pip在哪里: 通过执行sudobash-c'echo$PATH', 我得到: 我尝试将pip符号链接到sudo的目录中,就像这样: ,无效。 如何将放在相同的

  • 问题内容: 我对sklearn中的管道还很陌生,并且遇到了这个问题:我有一个包含文本和数字混合的数据集,即某些列仅包含文本,其余的列具有整数(或浮点数)。 我想知道是否有可能建立一个管道,例如我可以调用文本功能和数字列。我在网上看到的示例大多指向在整个数据集而不是在选择列上使用。这可能吗?如果是这样,任何指针将不胜感激。 问题答案: 我通常的做法是使用,使用a拉出相关的列。 重要笔记: 您必须使用

  • 类别表 元表 meta和cats表公共是c_id meta表cats c_id(1)meta表有2(Abhijit1,Abhijit2)行和m_id(1,2) 事务表 交易和元表通用的是m_id交易m_id 1有两行t_id(1,2)。此表主要用于支付金额和日期 我想为每个类别求和()所有成本(从元表)和金额(从事件表)。 表与 这是错的。猫的成本ID 1是300,但这里我有400 这里的总和(m