什么是MQ
MQ (message queue)消息队列
MQ从字⾯意思上看,本质是个队列,FIFO先⼊先出,只不过队列中存放的内容是消息(message).消息可以⾮常简单,⽐如只包含⽂本字符串,JSON等,也可以很复杂,⽐如内嵌对象
RabbitMQ是MQ的一种实现,是Rabbit 企业下的⼀个消息队列产品
RabbitMQ采⽤Erlang语⾔开发,MQ功能⽐较完备,且⼏乎⽀持所有主流语⾔,开源提供的界⾯也⾮常友好,性 能较好,吞吐量能达到万级,社区活跃度也⽐较⾼,⽐较适合中⼩型公司,数据量没那么⼤,且并发没那么⾼的场景.
RabbitMQ是一个实现AMQP的消息队列服务,是当前主流的消息中间件之一
AMQP,即AdvancedMessageQueuingProtocol(⾼级消息队列协议),是⼀个通⽤的应⽤层协议,提供统⼀消息服务的协议,为⾯向消息的中间件设计。
基于此协议的客⼾端与消息中间件可传递消息,并不受客⼾端或中间件,开发语⾔等条件的限制。
通信
MQ通常用于分布式系统之间进⾏通信
系统之间的调⽤通常有两种⽅式:
1.同步通信
直接调⽤对⽅的服务,数据从⼀端发出后⽴即就可以达到另⼀端.
2.异步通信
数据从⼀端发出后,先进⼊⼀个容器进⾏临时存储,当达到某种条件后,再由这个容器发送给另⼀端.
容器的⼀个具体实现就是MQ( message queue )
\
比如: 打客服电话
1.客服直接响应
2.客服记录下来,等过一段时间后进行回复
MQ的作用
MQ主要⼯作是接收并转发消息,在不同的应⽤场景下可以展现不同的作⽤
MQ类似于一个仓库,采购部⻔进货之后,把零件放进仓库⾥,⽣产部⻔从仓库中取出零件,并加 ⼯成产品.
MQ和仓库的区别是,仓库⾥放的是物品,MQ⾥放的是消息,仓库负责存储物品,并转发物品, MQ负责存储和转发消息
1. 异步解耦
在业务流程中,⼀些操作可能⾮常耗时,但并不需要即时返回结果.可以借助MQ把这些操作异步化
举例:用户注册
⽤⼾注册完后发送邮件通知,可以作为异步任务处理,⽽不必等待插入数据库等操作完成后才告知⽤⼾注册成功
2. 流量削峰
在访问量剧增的情况下,应⽤仍然需要继续发挥作⽤,但是这样的突发流量并不常⻅.如果以能处理这类峰值为标准⽽投⼊资源,⽆疑是巨⼤的浪费.使⽤MQ能够使关键组件⽀撑突发访问压⼒,不会因为突发流量⽽崩溃
举例:大促
双十一时,用户请求很多,可以使⽤MQ来控制流量,将请求排队,然后系 统根据⾃⼰的处理能⼒逐步处理这些请求.
3. 消息分发
当多个系统需要对同⼀数据做出响应时,可以使⽤MQ进⾏消息分发
举例:支付系统
⽀付成功后,⽀付系统可以向商家,向平台财务部门等都发送通知
4. 延迟通知
在需要在特定时间后发送通知的场景中,可以使⽤MQ的延迟消息功能
举例:支付
⽤⼾下单后⼀定时间内未⽀付,可以使⽤延迟队列在超时后⾃动取消订单