简介:
MQ全称为Message Queue,消息队列是一种应用程序间的通信方法。
其是消费者-生产者模型的一个典型代表,一端往消息队列中不断写入消息,另一端不断读取/订阅消息。
简单使用场景举例:
将项目中无需即时返回且耗时的操作提取出来,进行异步处理,大大降低了服务器的请求响应时间。
如:打印日志模块无需即时返回,且写磁盘是一种比较慢的行为,可以将其写到MQ中,生产者不需要关心是否立马写到磁盘。
典型应用场景:
异步处理请求:读写分离
应用解耦:生产者消费者读写分离
流量削峰:把流量控制到MQ这一层,不会实际的走到server侧
负载均衡:同一个Queue上的多个消费者被负载均衡(一条消息只上报给一个人)
消息订阅:根据订阅信息自动上报消息,类型NIO的处理逻辑
几个重要概念:
Queue
消息队列,其作用是先进先出,存储来自Producer的消息,上报消息给Consumer,多个Producer可以订阅同一个Queue,但是Queue中的数据之后上报给其中一个人(可以用来做负载均衡),上报完之后数据被丢弃,如果未能上报或者说无Consumer,则该消息一直存在;
下图是简化版(中间有一层Exchange),C和P一比一,实际有Exchange的存在
下图时一个生产者对应多个消费者,两个消费者C1,C2平均每人处理一条P生产的消息A,B
Exchange
The core idea in the messaging model in RabbitMQ is that the producer never sends any messages directly to a queue.Actually, quite often the producer doesn't even know if a message will be delivered to any queue at all.
Instead, the producer can only send messages to an exchange. An exchange is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues. The exchange must know exactly what to do with a message it receives. Should it be appended to a particular queue? Should it be appended to many queues? Or should it get discarded. The rules for that are defined by the exchange type.
交换机,决定了消息路由规则,但是它不会存储,生产者塞进来数据时,如果没有Queue bind到Exchange的话,它会直接丢弃Producer发送过来的消息;
上面展示了Queue的大致工作原理,但是实际上P生产的消息不会直接放到Queue中,而是要经过Exchange,Exchange再将消息路由到一个或者多个Queue中,不符合路由规则的直接丢弃。(Exchange怎样确定将消息路由到哪个队列或者丢弃的呢?请看下面讨论Binding key和exchange type)。
Exchange有四种类型,不同类型有着不同的策略。Exchange Type如下:
fanout(广播):将发送到该Exchange的消息路由到所有它直接绑定的Queue中(不关心binding key)
direct:把消息路由到那些binging key和routing key完全匹配的Queue中。
如下图:C1订阅的Queue1使用binging key booking绑定Exchange,那么P发送的所有以booking为routing key的消息都会发送到Queue1中,也会上报给C1.(C2也是如此,因为其也绑定了booking)
topic:topic基本同direct,其区别时direct是完全匹配,topic支持模糊匹配。*用于匹配一个单词,#用于匹配多个或0个单词(这里的单词指的是以点号分割的,如my.name对应 my name 两个单词)
Binding
Binding是Exchange和Queue之间连接的桥梁。在绑定(Binding)Exchange和Queue的同时,一般指定一个Binging Key。Producer将消息发送到Exchange的时候,一般会产生一个Routing Key,当RoutingKey和Binding Key对应上的时候,消息就会发送到对应的Queue中。
Connection
一个实际的tcp连接,生产者和消费者都是通过tcp连接到MQ中的。
Channel
虚拟连接,建立在Connection连接的基础上,数据流动都是通过Channel来进行的。
Bind: