1. RabbitMQ 架构
从RabbitMQ架构图(粉色部分)中可以看出,RabbitMQ整体可以分成两个部分,Exchange(交换机)和Queue(队列)。但是在Exchange与Queue之间还有一些细节的部分,可以在下面的概念介绍中了解。
2. 基本概念
Message Broker:(消息代理服务器)是一个虚拟的概念,而RabbitMQ是Message Broker的一个实例。
Producer:(生产者)产生数据并将数据发送到消息代理服务器(Message Broker)的程序被称作消息的生产者。
Connection:(连接)生产者与消费者通过TCP协议与消息代理服务器(Message Broker)创建的连接。
Channel:(信道)创建在Connection中的虚拟连接,类似于连接数据库时的连接池的概念,生产者和消费者并不是直接与MQ通过Connection进行通讯的,而是通过Channel进行连接通讯的,数据的流动是在Channel中进行的。
VirtualHost:(虚拟消息服务器)就像mysql数据库中有数据库实例的概念,并且可以指定用户对库和表等操作的设置权限。也可以类别成LINUX系统中的不同用户,不同用户之间是相互独立的。每个VirtualHost相当于一个相对独立mini的RabbitMQ服务器。每个VirtutalHost之间是相互隔离的,exchange,queue,message等不能互通。
Exchange:(交换机)交换机直接与Channel(信道)连接,接收来自于消息生产者产生的数据,在由Exchange将消息路由到一个或多个Queue中(或者丢弃)。Exchange并不存储消息。RabbitMQ的交换机有fanout(扇出),direct(直接),topic(主题),headers(标题)四种类型,每种交换机类型都对应着不同的路由规则,根据不同的路由规则,交换机会将消息路由到不同的队列中。
Binding: (绑定)交换机与队列之间的虚拟连接,在这个绑定中可以设置Binding Key,一个绑定就是用一个Binding Key将交换器和队列连接起来,设置的Binding Key存在着一定的规则,Exchange会将消息中携带的Routing Key与Binding Key 中设置的规则进行匹配,将消息发送到相应的队列中。Binding信息被保存到Exchange中的查询表中,用于Exchange将消息分发到队列的依据。
Routing Key:(路由键)用于匹配路由规则的依据,生产者在将消息发送到Exchange时,一般会指定一个Routing Key,交换机会根据Routing Key 来匹配Binding中设置的路由规则,将符合规则的消息发送到指定的队列中。
Queue:(消息队列)RabbitMQ中的内部对象用于存放消息的容器,RabbitMQ会将消息按照RabbitMQ的六大模式中的一种将队列中的消息发送给消费者,RabbitMQ会根据选择模式的不同将队列中的消息发送给一个或多个消费者,在连接到消费者之前,消息一直在等待消费者到队列中将消息取走。
Consumer:(消费者)消息的消费者,表示一个从队列中取消息的应用程序。
3. 番外篇
最开始学习的时候,对于交换机的四种类型与RabbitMQ的六种模式都是干啥的有点混淆,后来在发现不同之处:
交换机的四种类型是交换机将消息路由到队列中使用的不同的方式。exchange➡queue
RabbitMQ六种模式是RabbitMQ将消息发送给消费者使用的不同方式。rabbitmq➡consumer
4. 交换机类型
Fanout:(扇出,扇形)
扇出型交换机路由规则非常简单,它不处理路由键,该交换机会把消息路由到所有与本交换机绑定的队列上。
如下图:交换机会把接收到的消息发送到所有的队列中。
Direct:(直接)
直接型交换机需要和Routing Key 打交道了,在交换机接收到带有Routing Key 的消息后,会与交换机和队列之间设置的Binding路由规则进行匹配,当Routing Key与Binding Key完全匹配后,会将消息路由到可以匹配上的队列中。
如下图:带有Routing Key="weixin"的消息被发送到交换机后,交换机与第二个队列中设置的路由规则为"weixin"的队列匹配上了,所以交换机将消息路由到了第二个的队列中。
Topic:(主题)
主题型交换机是对Direct(直接)型交换机的升级,当直接型交换机的严格匹配不能满足需求的时候,就可以使用Topic(主题)型交换机,主题型交换机是可以在Routing Key 与Binding Key 匹配时进行模糊匹配的。符号“#”匹配一个或多个词,符号“*”只能匹配一个词。
如下图:Routing Key 的值为"love.ced.nb"的消息发送到交换机,交换机会根据Binding Key中的规则进行模糊匹配,所以第一个和第三个是满足匹配条件的,所以交换机将消息路由到了这两个队列中。
Headers:(标题)
标题型交换机不对路由键进行匹配,而是根据消息内容中的headers属性进行匹配,在对Exchange与Queue进行绑定时设置一组键值对,当消息发送到交换机后,RabbitMQ会取出该消息的headers属性信息,对其中的属性键值对与绑定的键值对进行匹配,交换机会将消息路由到匹配成功的队列中。标题型交换机设置的键值对可以是任意类型。而其它类型交换机的路由键则是字符串类型。
如下图:带有"ced":"nb" headers属性的消息发送到交换机后,交换机根据与每个队列设置的键值对进行匹配,第一个和第三个可以匹配成功,所以交换机将消息路由到这两个队列中。
5. 六种模式
RabbitMQ提供了六种模式,这六种模式就是RabbitMQ将消息发送到消费者的六种方式,方式的不同,RabbitMQ会将消息发送到不同的消费者程序。
Simple(简单模式)
一个队列,一个消费者。一个队列中的消息只能被一个消费者消费。
Work(工作模式)
一个队列,多个消费者。一个队列将队列中的消息发送给多个消费者,每个消费者接收到的消息是不重复的。
工作模式的消息分发还分两种方式,公平分发,不公平分发。
- 公平分发
公平分发就是轮询分发的概念,就是你一条,我一条,你一条,我一条,消费者收到的消息数量基本上一样的,公平分发是不管你处理速度快慢的。
- 不公平分发
不公平分发,是按照消费者的能力强弱来发送的,处理速度快的就多处理,处理速度慢的就少处理。这样的处理更加合理,因为不会出现一个堆积消息很忙,而另一个则是在闲着。
Publish/Subscribe(订阅模式)
订阅模式队列将消息分发给多个消费者,每个消费者都对应有自己的队列,当消息发送到交换机,交换机会将消息发送给所有的队列中,RabbitMQ将队列中的消息分发给指定的消费者。
交换机类型设置为Fanout类型
Routing(路由模式)
路由模式是发布订阅模式的升级,每个消费者也是有自己指定的队列,只是在交换机将消息发送到队列中时需要进行规则匹配,只有完全匹配之后,RabbitMQ才会将消息分发给队列对应的消费者。
交换机类型设置为Direct类型
Topic(主题模式)
主题模式是Routing(路由模式)的一个升级,在路由规则中加入了模糊匹配规则,根据模糊匹配的结果将消息分发到相应的消费者。模糊匹配的规则是符号“#”匹配一个或多个词,符号“*”只能匹配一个词。
交换机类型设置为Topic类型
RPC(模式)
RPC(远程过程调用)因基本上用不到,所以略。