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

与RabbitMQ的主题交换歧义

易招
2023-03-14

我有点迷茫,正在尝试实施话题交流,不确定需要什么。

我想有几个路由键和一个主题交换(默认的amq.topic)。我的钥匙是:

  • 创建customer.app 创建customer.app
  • 客户。*.创建

我希望我的队列是持久的,但是我需要1个“客户”队列还是2个appA和appB队列?我已经弄清楚了我的发布者;连接、交换声明、基本发布。

但我正在与消费者斗争。假设我想打开3个控制台,上面提到的每个路由键对应一个控制台
我当前的消费者有:连接、exchange声明、队列绑定、基本消费。这些连接到持久的“客户”队列。然而,我的消息被循环发送到每个控制台/消费者,而不是使用路由键。

所以我的问题;

  1. 对于典型的主题交换设置;您需要多少队列?
  2. 我的消费者可以只使用交换绑定,还是必须包含队列交互?
  3. 是否可以通过主题交换在2个消费者中出现一条消息(或者您需要扇出)?

共有2个答案

满增
2023-03-14

针对典型的话题交流设置;您需要多少队列?

这取决于您的应用程序需求。您可以从一个队列开始实现简单的FIFO堆栈,然后添加更多队列以消耗更多粒度的消息。

我的消费者能仅仅通过交易所绑定逃脱惩罚吗,还是必须包括队列交互?

AMQP交换的思想是获取已发布的消息,并将其放入一个或多个队列(甚至其他交换或在特定条件下丢弃)。Consumer只能处理队列,而publisher只能处理Exchange。

Default Exchange可能存在一些误解,因为它将消息路由到与路由键相同的队列名称,并且有时解释为发布到队列,这不是真的。

通过主题交换,单个消息是否可能出现在2个消费者中(或者您需要扇出)?

我猜您所说的是将一条消息复制到多个队列(当您确实可能有多个消费者处理单个消息时,会出现一些错误的情况)。

如果是-当然。您可以为队列创建多个绑定以获取不同的消息。下面是一个小例子:

使用三个不同的路由键将三条消息发布到topic exchange。阿帕。已创建客户。附录B。已创建和“客户”。附录C。创建。

您可以创建单独的队列来收集特定的消息,方法是将队列与确切的路由密钥绑定-<代码>客户。阿帕。已创建客户。附录B。创建等等,或者如您所述,使用通配符路由键绑定队列。customer。*。已创建

若要仅收集appA和appB的消息,可以使用两个绑定创建队列customer。阿帕。创建了客户。附录B。已创建,因此您将在一个队列中获得两条消息类型。

桂坚
2023-03-14

第一件事:Exchange不会向消费者交付。它将消息传递到队列以匹配路由kyes。

      1. For a typical topic exchange set up; how many queues do you need?

如果您有多个消费者,则每个消费者都需要一个队列。

      2. Can my consumers get away with just exchange binding, or does it have to include queue interaction?

您需要将使用者与队列绑定,如果队列不存在,则创建并绑定。

      3. Is it possible for a single message to appear in 2 consumers with topic exchange (or do you need fanout for that)?

是的,只有当消费者有自己的(单独的队列绑定相同的路由键)。否则将是循环往复的方式。

所以,最好的方法是让消费者自己的队列具有所需的路由密钥。。。!!!

 类似资料:
  • 我们正在重建消息队列系统。在讨论RabbitMQ交换类型时,我注意到有两种可能的解决方案可以实现路由消息的多播特性。 > < li> 话题交流。通过设置主题交换和特定模式的路由关键字,消息将被路由到指定的队列。即产品。*.根据AMQP规范,这通常是实现发布/订阅模式的交换类型。 报头交换。所谓的“类固醇直接交换”。对于多播消息,它甚至更灵活,因为忽略了路由键,而是每个消息都有“x-match”头,

  • 我正在寻求一些关于如何最好地配置我的rabbitMQ交换的建议。 我试着用循环系统的方法来交换话题。每个使用者都有自己的(唯一的)命名队列连接到主题交换。我希望交换为“相同”主题循环消息到每个使用者队列-比如。 我尝试了多个组合,但似乎只能同时将消息传递到使用者队列,这实际上意味着我要处理两次消息,每个使用者一次。 为了清楚起见,我还有一个扇出交换,我用它来“控制”消费者(启动、停止等)。这应该在

  • 我有一个场景,我需要执行一系列流程,每个步骤都在独立的应用程序中完成和扩展。我正在为所有交换使用主题交换。当前拓扑如下所示: P- 我们正在“版本化”队列,以处理可能影响消息结构的需求更改。绑定可能如下所示: 步骤1。exchange绑定到步骤1。v1。使用绑定键step1排队。v1 步骤1。exchange绑定到步骤1。v2。使用绑定键step1排队。v2级 还有其他与版本无关的绑定模式也使局部

  • 我成功地建立了一个话题交换,并且能够同时向几个消费者传递消息。 我还想向竞争对手传递信息,并继续使用主题交换。我了解到,使用相同的队列名称可以让消费者竞争消息。然而,我可能弄错了,因为我无法使它工作。 为同一主题的多个侦听器设置: < li >申报话题交流 < li >对于每个侦听器,用自动生成的名称声明一个新队列 < li >用给定的主题路由关键字将此队列绑定到上面的交换 如何将相互竞争的消费者

  • 在我的应用程序中,我有3个类:< br> - Company,它为3项工作中的任何一项雇用工人< br> - Workers,每个人可以做2项工作< br> - Administrator,它接收程序中所有消息的副本,并可以向所有公司、所有工人或每个人发送消息 我使用< code > work . companies . company name 作为公司密钥,使用< code > work .

  • 我是AMQP的新手,正在尝试为RabbitMQ系统制定一个通知架构。 我想要一个主题交换(通知交换,比方说),特别是因为我想灵活地使用主题交换附带的路由密钥和队列,以及将来扩展该主题的更多选项。不过,我可能是错的,因为... 我还想让两个或更多的消费者使用每个通知。作为基线,我希望发布的每个通知都在数据库中结束。此外,我希望每个通知都可以由客户端应用程序使用(例如,web应用程序使用并进一步通过套