一、什么是MQ?
一个“转发器”。生产者先将消息投递一个叫做“队列”的容器中,然后再从这个容器中取出消息,最后再转发给消息者。
原始型模型如下:

二、为什么使用MQ?
使用MQ核心场景:异步、解藕、削峰填谷
异步
实例:比如 我们常见的短信验证码功能,当我们在界面点击“获取验证码”后,我们还可以同时进行其他的操作,如输入更新的密码等,此时我们不需要一直等到手机收到短信了才进行下一步操作,这就是异步处理,提高用户体验。

解藕
实例:比如 常见的订单系统,当有订单下单时,我们需要减去库存,但是如果订单和库的逻辑都放在一个系统中,不止处理事件需要很长,系统的耦合性比较高,此时,使用消息中间件,可以实现将订单业务和库存业务抽出来做不同的系统,每次下单的时候可以将下单信息放入消息中间间中,然后库存系统去订阅它,只有有订单数据就进行减去库存操作,这样就将应用解耦了。

削峰
实例:比如 常见的秒杀系统,如果有5万个商品可以秒杀,没有消息中间件的话,所有的请求都一次性到后台,此时系统很容易卡死,引入消息中间件如消息队列,此时可以在队列中设置好可以存储数据的数量,这样每次用户请求会先到消息列表中,消息队就减去1,当消息队列中存储长度为0时,直接返回秒杀失败,这样就避免了所有用户请求可能在同一时间到达系统后台,达到流量削峰的作用。

三、常见的消息中间件有哪些?
常见的消息队列中间件:ActiveMQ、RabbitMQ、ZeroMQ、Kafa、MetaMQ、RocketMQ等。
RabbitMQ消息队列,是AMQP规范的一个实现,可以达到跨平台、跨语言。(AMQP(Advanced Message Queuing Protocol)高级消息队列协议: 是一个消息代理的规范,兼容JMS,RabbtisMQ是AMQP的实现。)
四、RabbitMQ中核心内容?
(一)消息服务的两个概念
1、消息代理(message broker):负责接受消息生产者发送的消息
2、目换地(destination):消息最终被消费的地方
3、两者的关系:当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定的目的地。
(二)从消息代理到目的地的方式
1、队列:点对点的通信(point -to- point):消息发送者发送消息,消息代理将其放入到一个队列中,消息接收者从队列中获取消息内容,消息读取后被移除出队列。

2、主题:发布publish/订阅subscribe消息通信:发布者发送消息到主题,多个接收者(订阅者)订阅这个主题,那么 就会在消息到达时同时收到消息。

五、RabbitMQ的核心概念
1、Message(消息):不具名,由消息头和消息体租出,消息体是不透明的。消息头是由一系列的可选属性组成 如,routing-key路由器,priority-相对其他消息的优先权,delivery-mode-指出该消息是否需要永久存储等。
2、Publicsher(消息的生产者):是向交换器发布消息的客户端应用程序。
3、Exchange(交换器):用来接受消息并且消息路由给服务中的队列,有四种类型,即决定消息发布到那个队列,具体有以下的类型:
(1)、Direct:消息中的路由键(routingkey),如果和Binding中的binding key 一致,那么就将消息发到对应的队列中。
(2)、Fanout类型: 即广播模式,每个发送到fanout类型的交换器消息,交换器会将消息发送到它绑定的所有队列中,它转发消息是最快的。
(3)、Topic:主题,可以设置模糊匹配,会识别"#"和""号,#表示匹配0个或者多个单词,匹配一个单词,单词之间使用:逗号隔开。
(4)、headers:实现发布订阅模型(基本不使用了)。
4、Queue(消息队列): 消息的容器,一个消息可以放在一个或者多个队列中。
5、Binding(绑定): 用于消息队列和交换器之间的关联,一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,交换器跟队列的绑定可以是多对多的关系。
6、Connection(网络连接): 如一个Tcp连接。
7、Channel(信道): 多路复用连接中的一条独立的双向数据流通道,信道是建立在真实的TCP连接内的虚拟通道,AMQP命令都是通过信道发出去的,不管是发布消息,订阅队列,还是接收消息,都是通过信道完成,因为对于操作系统来说创建和销毁一个TCP连接都是很昂贵的开销,所以使用信道以实现复用一条TCP连接。
8、Consumer(消费者): 接受和消费消息。
9、Virtaul Hos(虚拟主机): 即小型的RabbitMQ服务器,它表示一批交换器,消息队列和相关对象,连接时必须指定,默认是:/(以路径区分)。
10、Broker: 消息队列服务器实体。

网友评论