RabbitMQ是AMQP(高级消息队列协议)协议的一种实现,RabbitMQ的基本讲解也就是围绕着AMQP协议的讲解。
一、角色讲解
1.1 消息代理(message brokers):大家可以理解为RabbitMQ 服务器,起到了消息接收,持久化和转发等作用。
1.2 发布者(publishers)或生产者(producers):消息的产生来源,具有生产消息的角色。
1.3 消费者(consumers):消息的接收者,消费消息的角色。
1.4 交换机(exchange):用于接收生产者生产的消息,并按照一定的路由规则将消息转发到匹配的队列。
1.5 消息队列(queue):根据指定的绑定规则来接受交换机内自身感兴趣的的消息。
1.6 绑定(binding):将消息队列和交换机绑定在一起,绑定时指明队列匹配消息的匹配规则(可以理解为队列的兴趣爱好)。
1.7 路由键(routingKey):生产者发送到交换机内的消息需要带上自己的路由键,交换机根据消息的路由键去和队列绑定时声明的binding匹配。
二、各个角色之间如何配合
2.1 生产者生产完消息后会将消息发送给指定的交换机(exchange),并声明该条消息的 routingKey(路由键)。
2.2 因为同一个交换机可以被多个队列绑定,并且每个队列绑定到交换机上时都声明了自己的匹配规则(兴趣爱好),所以交换机(exchange)收到生产者发来的消息后会解析该条消息的 routingKey(路由键),看该条消息的 routingKey 是哪个队列感兴趣的,匹配成果后就将该条消息发送到相应队列内。
2.3 消费者声明自己监听的队列,一个消费者可以监听多个不同队列(一个队列也可以被多个消费者监听),当监听的队列内有消息时,队列会将该条消息推送给监听该队列的所有消费者。
三、图文示例
假设现在有一名生产者A和两名消费者A 和B ,它们都需要到消息代理(RabbitMQ server)上进行注册。
3.1 注册生产者:生产者A注册时声明说我生产的消息会发布到名为exchangeA的交换机上。
3.2 创建队列:创建队列queueA和queueB,并指定queueA在exchangeA上的绑定规则(binding)是A_routingKey,queueB在exchangeA上的绑定规则(binding)是B_routingKey。
3.3 注册消费者:消费者A注册时声明我对queueA和queueB内的消息感兴趣,消费者B注册时声明我只对queueB内的消息感兴趣。
例1:生产者A生产一条消息后将该条消息发送到exchangeA的交换机上,并声明该条消息的路由键为B_routingKey,然后交换机exchangeA会解析该消息的路由键B_routingKey,解析完发现该routingKey和queueB绑定时声明的binding匹配成功,就将该消息发送到queueB的队列内。对queueA的队列的binding并不匹配A_routingKey != B_routingKey,所以queueA并不会收到该消息,但是对于两个消费者而言,它们都监听了queueB队列,所以都会收到queueB给它们推送的该条消息。
例2:生产者A又生产了一条消息,并将该条消息发送到exchangeA的交换机上,且声明该条消息的路由键为A_routingKey,这时exchangeA解析路由键A_routingKey后会将该消息发送给queueA队列,因为和queueB队列的binding规则并不匹配,所以该消息不是queueB感兴趣的消息。queueA收到exchangeA给它发送的消息后会将该消息推送给监听它的消费者A,消费者B并不会收到该条消息,因为消费者B没有监听queueA的消息。