Rabbit MQ:概述
什么是MQ
MQ就是Message Queue的缩写,本质上就是一个队列只不过队列里存放的元素是一些消息而已,消息的类型可以很简单比如一个数字或者一个字符串,也可以是一些内嵌对象等等。
MQ一般用于分布式系统之间的通信
- 同步通信
数据直接由一端到达另一端
- 异步通信
数据由一端发送到一个容器存储起来,之后达到某个条件后再由这个容器发送给另外另一端。MQ就是这个容器的一个具体实现,而rabbitmq则是MQ的一种实现。

MQ的作用
MQ实际上就是起到一个仓库的作用。
- 异步解耦:在业务流程中,⼀些操作可能⾮常耗时,但并不需要即时返回结果.可以借助MQ把这些操 作异步化,比如用户注册后发送注册短信或邮件通知,可以作为异步任务处理,而不必等待这些操作 完成后才告知用户注册成功.
- 流量削峰:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见.如果 以能处理这类峰值为标准而投入资源,无疑是巨大的浪费.使⽤MQ能够使关键组件支撑突发访问压力,不会因为突发流量而崩溃.比如秒杀或者促销活动,可以使⽤MQ来控制流量,将请求排队,然后系 统根据自己的处理能力逐步处理这些请求.
- 消息分发:当多个系统需要对同⼀数据做出响应时,可以使用MQ进行消息分发.比如支付成功后,支付系统可以向MQ发送消息,其他系统订阅该消息,而无需轮询数据库.
- 延迟通知:在需要在特定时间后发送通知的场景中,可以使用MQ的延迟消息功能比如在电⼦商务平 台中,如果用户下单后⼀定时间内未支付,可以使用延迟队列在超时后自动取消订单
其他MQ
比较流行的MQ包括RabbitMQ,RocketMQ,Kafka等
Kafka
Kafka一开始的目的就是用于日志收集和传输,追求高吞吐量,性能卓越,单机吞吐达到十万级,在日志领域比较成熟,功能较为简单,主要支持简单的MQ功能,如果有日志采集需求,肯定是首选kafka了。
RocketMQ
RocketMQ采用Java语言开发,由阿里巴巴开源,后捐赠给了Apache。它在设计时借鉴了Kafka,并做出了一些自己的改进,青出于蓝而胜于蓝,经过多年双十一的洗礼,在可用性、可靠性以及稳定性等方面都有出色的表现。适合对于可靠性比较高,且并发比较大的场景,比如互联网金融。但支持的客户端语言不多,且社区活跃度一般。
RabbitMQ
采用Erlang语言开发,MQ功能比较完备,且几乎支持所有主流语言,开源提供的界面也非常友好,性能较好,吞吐量能达到万级,社区活跃度也比较高,比较适合中小型公司,数据量没那么大,且并发没那么高的场景。
RabbitMQ核心概念
Producer:生产者,也是RabbitMQ Service的客户端,向RabbitMQ发送信息
Consumer:消费者,也是一个RabbitMQ Service的客户端,从RabbitMQ接受消息
Broker:就是RabbitMQ Service,用来接受生产者的消息,然后发送给消费者

Connection:链接,就是生产者或消费者(客户端),和RabbitMQ之间的一个TCP连接,负责传输客户端和服务器之间所有的数据和消息
Channel:通道,Channel是建立在Connection之上,又或者说是包含在Connection里,一个TCP连接可以包含多个Channel,每个Channel都是独立的,发送和接受消息都是基于Channel,换言之由Channel来进行发送和接受消息。Channel的主要作用就是将消息的读写操作复用到一个TCP连接上,这样就可以减少建立和关闭连接的开销,提高性能。
Virtualhost:虚拟主机。这是一个虚拟的概念,为消息队列提供了一个逻辑上的隔离,一个Broker可以有多个虚拟机,当有多个用户使用同一个RabbitMQ服务时,可以虚拟出多个vhost,每个用户在自己的vhost创建队列等,就好比是MySQL的database
Queue:队列,用来存储消息,多个消费者可以订阅同一个队列
Exchange:交换机,生产者发送一条消息,通过Channel,然后到达交换机,之后再由交换机,根据一定规则分发给各个Queue中,最后消费者会从订阅的Queue中接受数据,交换机主要就起到一个路由的作用,用于分发消息,就类似将快递分发到各个站点。
RabbitMQ工作流程

- 首先由Producer产生一条消息
- 然后Producer和Broker建立一个连接Connection,并开启一条信道Channel
- 接着消息由交换机进行路由,进过一些条件发送到对应Queue,并存放信息
- 最后Consumer也通过Channel获取到订阅的队列里的消息并处理
AMQP
AMQP(Advanced Message Queuing Protocol)是一种高级消息队列协议,AMQP定义了一套确定的消息交换功能,包括交换器(Exchange)、队列(Queue)等。这些组件共同工作,使得生产者能够将消息发送到交换器,然后由队列接收并等待消费者接收。AMQP还定义了一个网络协议,允许客户端应用通过该协议与消息代理和AMQP模型进行交互通信。RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang的实现(当然RabbitMQ还支持STOMP、MQTT等协议)。AMQP的模型结构和RabbitMQ的模型结构是一样的。
