MQ定义
消息队列,FIFO先进先出,上下流传递消息,相当于一个快递站
MQ作用
流量消峰
加一个中间消息队列MQ MQ内部对访客排队,超过一万不给操作,防止宕机
应用解耦
不同系统的交流通过队列来进行(加一层)
异步处理
不同系统处理速度不同,有时一个系统要等另一个系统 MQ来负责将一个系统处理结果返回给所需的另一个系统。在正常业务流程中,比较耗时而且不需要即时返回结果的操作。将这些操作可以做为**「异步处理」**,这样可以大大的加快请求的响应时间。
消息分发
多个系统对同一个数据感兴趣,只需要监听同一类消息即可。
例如付款系统,在付款成功之后,正常做法是通知外围系统这个单子付款成功了,或者是外围系统定时来拉取付款结果,使用MQ后,付款系统可以在付款成功之后,将消息放到MQ里面,想知道这个结果的系统订阅这个主题的消息即可,非常方便,也不需要定时去拉取数据了。
分布式事务的数据一致性
目前主流的MQ框架,都支持分布式事务消息,也可以采用专门处理分布式事务的开源框架「Seata」
事务消息发送步骤如下:
- 发送方将半事务消息发送至消息队列RabbitMQ
- 消息队列RabbitMQ将消息持久化成功之后,向发送方返回Ack确认消息已经发送成功,此时消息为半事务消息。
- 发送方开始执行本地事务逻辑。
- 发送方根据本地事务执行结果向服务端提交二次确认(Commit或是Rollback),服务端收到Commit状态则将半事务消息标记为可投递,订阅方最终将收到该消息;服务端收到Rollback状态则删除半事务消息,订阅方将不会接受该消息。
事务消息回查步骤如下:
- 在断网或者是应用重启的特殊情况下,上述步骤4提交的二次确认最终未到达服务端,经过固定时间后服务端将对该消息发起消息回查。
- 发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果。
- 发送方根据检查得到的本地事务的最终状态再次提交二次确认,服务端仍按照步骤4对半事务消息进行操作。