RabbitMQ集群中的交换器

交换器不像队列那样有真实的进程, 它只是一张名称与队列进程PID的关系表

当你将消息发布到交换器时,实际上是由你所连接到的信道将消息上的路由键同交换器的绑定列表进行比较,然后路由消息。正是信道(channel)按照绑定匹配的结果,将消息路由到队列。 信道才是真正的路由器

由于交换器只是一张表,因此将交换器在整个集群中进行复制,更加简单

举例来说,当创建一个新的交换器时,RabbitMQ所要做的是将查询表添加到集群中的所有节点上。这时,每个节点上的每条信道都可以访问到新的交换器了。因此,相对于默认情况下队列的完整信息存在于集群中的单一节点来说,集群中的每个节点拥有每个交换器的所有信息。就可用性来讲,这非常棒,因为这意味着你不用担心在节点故障时重新声明交换器。只需让故障节点上的生产者重新连接到集群上,它们立即就能开始往交换器上发布消息了

消息丢失

那么当消息已经发布到信道上,但在路由完成之前节点发生故障的话,这些消息会怎样呢?

AMQP的basic.publish命令不会返回消息的状态。这意味着当信道节点崩溃时信道可能仍然在路由消息,而生产者已经继续创建下一条消息了。在这种情况下,你将承受丢失消息的风险