【概述】
rabbitmq采用了镜像队列的方式实现队列的高可用,镜像队列的使用、配置、内部实现原理网上有很多文章都有介绍,自己很久之前也曾总结过相关内容。但回过头再来看镜像队列,仍然有新的发现,本文分析总结了镜像队列生产消费的数据流以及节点流量,以便更好的使用镜像队列。
【生产消费的数据流】
分析镜像队列之前,我们还是先一步步从单机情况下,集群情况下看看生产消费的数据流走向是怎样的,最后再分析镜像队列的场景。
-
单机场景:
如上图所示,生产者,消费者连接到rabbitmq后,在rabbitmq内部会创建对应的connection,channel进程。connection进程从socket上接收生产者发送消息后投递到channel进程;在channel进程中,根据消息发送的exchange与消息的routing-key,在内部数据库的路由表中,查找所有匹配的队列的进程PID,然后将消息投递到这些队列的进程中。
同样,队列进程收到消息后,找到消费者对应的channel进程PID,然后将消息投递给该进程,channel进程再发送给对应的connection进程,然后通过socket发送给消费者。
从上面可以看出,一条消息从生产到消费,rabbitmq的节点上会有1进1出的流量。
补充说明下:在rabbitmq内部会为每个tcp链接创建多个进程,其中包括专门用于数据接收的rabbit_reader进程,专门用于数据发送的rabbit_writer进程,本文为了方便表达,统一使用connection进程进行socket数据的收发