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

AMQP|RabbitMQ|当可以通过由具有相同路由密钥的多个队列限定的直接交换来实现扇出交换时,为什么它们具有扇出交换?

师增
2023-03-14

AMQP/RabbitMQ新手。试图掌握概念/原则,并偶然发现了这一点。

以下两种范式之间有什么区别?

Fanout Exchange:FanoutExchange-

相对

直接交换:直接交换-

两者不是都达到相同的效果吗?如果没有,请有人可以阐明它有什么不同,以及在哪些情况下比其他情况更可取?

为什么它们有这两种类型的交换,而这两种交换都可以通过调整绑定中的路由键来实现?

谢谢

共有1个答案

高锦
2023-03-14

在我看来,你展示的两种范式可以达到同样的效果。但是这两种交换背后的想法是完全不同的。

>

  • 扇出交换。使用 Fanout Exchange 时,您需要做的就是将队列绑定到某个 Fanout Exchange,尽管您在声明绑定时使用了绑定密钥。实际上,无论您使用什么绑定键来声明与 Fanout Exchange 的绑定,RabbitMQ 都会忽略它。因此,您可以看到 Fanout Exchange 更侧重于将消息扇出到绑定到它的任何队列。

    绑定密钥的含义取决于交换类型。我们之前使用的扇出交换只是忽略了它的价值。

    消息1,消息2 (routingKey_1) --

    [bindingKey_1=routingKey_1]

    消息3(routingKey_2) --

    [bindingKey_2=routingKey_2]

  •  类似资料:
    • 我一直在尝试使用RabbitMQ,但遇到了以下问题(与此非常类似:RabbitMQ中的主题交换与直接交换)。 我需要密集地广播大约800种类型的消息(因此每种消息类型都会有很多消费者),我想知道以下哪种方法更好: > 创建一个直接交换,在该交换中,消息将使用路由密钥(消息类型名称)发送,每个消费者都将通过绑定了相应路由密钥的临时队列连接到该交换。(因为没有像“key1.key2.*”这样复杂的路由

    • 我试图使用BasicGet仅检索与通道的Exchange/Queue/RoutingKey组合匹配的消息。 我们的路由密钥的一个例子是 我遇到的问题是,路由密钥被完全忽略,所有消息无论指定的路由密钥是什么,都可以通过BasicGet获得。 我使用的是直接交换。我认为直接就足够了,我不需要通配符的能力,您可以通过主题交换获得路由键。 直接交换和路由密钥解决方案是否应该与BasicGet配合使用? 谢

    • 我能够使用Publish/SubscribeRabbitMQ Java教程创建扇出交换,任何连接的使用者都将收到一个消息的副本。我想在连接任何使用者之前创建交换和绑定,而不是动态/编程地声明交换和绑定。我已经通过RabbitMQ管理控制台完成了这一点。然而,由于某种原因,我的消费者以循环方式接收消息,而不是全部接收消息的副本。我错过了什么?下面是一些代码片段: 发布者: 消费者: ...在Rabb

    • 我在我的项目中使用RabbitMQ,我想知道是应该使用具有多个路由密钥的单个交换还是使用多个交换?哪个效率更高? 例如,如果我使用带有路由键A、B、C的单个exchange E,消费者连接到该exchange E,并使用A、B、C路由键获取数据。另一种选择是,我应该将其发送到exchange A、exchange B、exchange C,而不使用路由密钥,并且消费者可以连接到每个exchange

    • 根据我的理解,直接和扇出交换的所有功能或用例都可以使用主题交换来实现。主题交换支持功能超集。那么问题来了,为什么 RabbitMQ 有直接和扇出式交换?是否有任何用例可以使用直接/扇出交换来实现,但不能使用主题交换来实现?

    • 我正在尝试将两个队列绑定到交换。两个队列必须使用相同的消息(路由密钥)。我能够直接使用RabbitMQ创建这两个队列。但是,当我尝试使用Apache Camel时,它会引发一个异常,指出“同一endpoint不允许使用多个使用者”。我假设Camel一定可以做到这一点,因为它是RabbitMQ中的一个基本功能。 我正在使用Camel RabbitMQ插件。是否需要一些额外的配置来实现此功能?