扇出交换基本上是负载平衡器吗?

时间:2016-12-22 06:27:50

标签: rabbitmq amqp

我一直在使用rabbitMQ学习AMQP,我遇到了这个名为扇出交换的概念。从插图中,我只能看到它是某种负载均衡器。谁能解释一下它的实际目的是什么? enter image description here

1 个答案:

答案 0 :(得分:2)

我认为你的意思是只有一个队列在到达扇出交换时才会收到消息。所以从这个角度来看:

不,我不认为它是负载均衡器(我承认术语可能令人困惑)。

在Rabbit MQ中有不同类型的交换,它的真实和扇出交换只是它们中的一种。 Rabbit MQ的基本模型假设您可以将任意数量的队列连接到同一个交换机。现在,连接到交换机的所有队列都将获得消息(Rabbit MQ只是复制消息) - 因此交换不能充当负载均衡器。

交换类型之间的唯一区别是匹配路由密钥的算法。它就像一个" to"常规信封中的字段。当消息到达交换时,它检查路由密钥(a.k.a. binding)并根据交换类型"查找"应该将消息路由到哪个队列。 当队列被注册以进行交换时,它总是使用此绑定。就像队列对绑定所说的那样,所有应该到达John Smith的消息(它的路由密钥),请将它们传递给我"。然后当消息到达时,它总是有一个" to"信封中的字段 - 所以交换检查消息是否打算发送给John Smith,如果是 - 只是将其路由到队列。

有可能会有很多队列有兴趣从John Smith那里收到消息,在这种情况下,消息将被复制。对于扇出交换 - 它只是不关注路由密钥而只是将消息发送到所有连接的队列。

现在,还有另一种叫做消费者的抽象。消费者可以连接到单个队列(同样,许多消费者可以连接到队列)。 诀窍是,一次只有一个消费者可以获取消息进行处理。

因此,如果你想要一个负载均衡器 - 你可以使用一个连接到你的交换机的队列(当然可以是扇出),但是然后将许多消费者连接到那个队列,而兔子会将消息发送给第一个消费者(它在内部使用循环来挑选第一个消费者) - 如果消费者无法处理它,消息将被重新排队,兔子将尝试将其发送给另一个消费者。