RabbitMQ作为一款热门的消息队列中间件,具备高效可靠的消息异步传递机制,主要用于不同系统间的数据交流和传递,在企业解决方案、金融支付、电信、电子商务、社交、即时通信、视频、物联网、车联网等众多领域都有广泛应用。
一、异步通信
消息队列 AMQP 版可用于单体应用被拆解为微服务后不同微服务间的通信。应用解耦的好处是不同应用的迭代不再相互依赖,而异步通信的好处是数据不再需要被立即处理。异步解耦能有效缩短数据链路长度,提高数据处理效率。 如网站的用户注册场景,在用户注册成功后,还需要发送注册邮件与注册短信,这两个流程使用RabbitMQ消息服务通知邮件发送系统与短信发送系统,从而提升注册流程的响应速度。 图1 串行发送注册邮件与短信流程
图2 借助消息队列异步发送注册邮件与短信流程
异步解耦是消息队列 MQ 的主要特点,主要目的是减少请求响应时间和解耦。主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时,由于使用了消息队列MQ,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦合。
二、错峰流控与流量削峰
在电子商务系统或大型网站中,上下游系统处理能力存在差异,处理能力高的上游系统的突发流量可能会对处理能力低的某些下游系统造成冲击,需要提高系统的可用性的同时降低系统实现的复杂性。
电商大促销等流量洪流突然来袭时,可以通过队列服务堆积缓存订单等信息,在下游系统有能力处理消息的时候再处理,避免下游订阅系统因突发流量崩溃。消息队列提供亿级消息堆积能力,3天的默认保留时长,消息消费系统可以错峰进行消息处理。
图3 消息队列应对秒杀大流量场景
秒杀处理流程如下所述:
- 用户发起海量秒杀请求到秒杀业务处理系统。
- 秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求发送至消息队列 MQ。
- 下游的通知系统订阅消息队列 MQ 的秒杀相关消息,再将秒杀成功的消息发送到相应用户。
- 用户收到秒杀成功的通知。
三、系统解耦
以电商秒杀、抢购等流量短时间内暴增场景为例,传统做法是,用户下单后,订单系统发送查询请求到库存系统,等待库存系统返回请求结果给订单系统。如果库存系统发生故障,订单系统获取不到数据,订单失败。这种情况下,订单系统和库存系统两个子系统高耦合。 图4 系统高耦合
引入RabbitMQ消息队列,当用户下单后,将消息写入到RabbitMQ消息队列中,然后返回用户下单成功。库存系统订阅下单的消息,消费下单消息,然后进行库操作。即使库存系统出现故障,也不影响用户下单。 图5 系统解耦
四、分布式缓存同步
大量并发访问数据库会导致页面响应时间长。通过消息队列 AMQP 版构建分布式缓存,支持实时通知数据变化,有效降低页面响应时间,满足对变更的大量访问需求。
如果有多个数据中心存在,需要在多个数据中心之间消费,那么 AMQP可以非常方便实现数据中心之间的同步。