一、什么是 MQ
MQ(message queue),从字面意思上看,本质上是一个队列,遵循先进先出(FIFO),只不过队列中存放的是 message 而已,是一种跨进程的通信机制,用于上下游传递消息,在互联网架构中,MQ 是一种非常常见的上下游 逻辑解耦 + 物理解耦 的消息通信服务,使用了 MQ 之后上游发送消息只需要依赖 MQ,不再需要依赖下游服务了
二、MQ 的作用
1、流量削峰
假设一个订单系统一秒最多只能处理 10000 个下订单请求,这个处理能力在应付正常时段的下单是绰绰有余的,在正常下单的情况下,我们一秒钟之后就能返回下单成功的结果给用户,但是在高峰期,用户下单的数量猛增到 80000,这个时候我们下单系统的服务器是无法处理这么多的请求的,只能在下单超过 10000 之后限制用户下单,这样给用户的体验就很不友好,如果使用了 MQ 做缓冲,我们就可以取消这个下单的限制,把一秒内下的订单先缓冲在 MQ 中,然后再先分散成一段时间来处理,虽然这个时候有些用户可能在下单十几秒之后才能收到下单成功的结果,但是总比不能下单的体验要好
2、应用解耦
假设一个电商系统的应用中有订单系统、库存系统、物流系统、支付系统,用户下单完成之后需要调用库存系统、物流系统、支付系统,如果这个时候有任何一个系统发生了故障,都会造成整个下单操作异常,当我们使用了 MQ 之后,系统之间的调用故障就会减少很多,比如物流系统发生了故障,需要几分钟的时间来修复,在这几分钟的时间里,物流系统要处理的订单任务就被缓存在消息队列中,当物流系统恢复故障后,就可以从 MQ 中取出订单任务进行处理,下单的用户是感知不到物流系统的故障的,这样就可以提升系统的可用性
3、异步处理
有些服务调用是异步的,例如 A 调用 B,B 需要花很长的时间去执行,但是 A 需要知道 B 什么时候可以执行完,以前一般有两种方式,A 过一段时间去调用 B 的查询 api 去查询 B 是否已经执行完成,或者 A 提供一个回调的 api,当 B 执行完了任务之后就调用 A 的回调 api 通知 A 服务,这两种方式都不是很优雅,使用 MQ 就可以很方便的解决这个问题,A 调用 B 服务后只需要监听 B 处理完成的消息,当 B 处理完成之后,会发送一条消息给 MQ ,MQ 会将此消息转发给 A 服务,这样一来 A 就不用循环调用 B 的查询 api,也不用提供回调 api,同样 B 服务也不需要执行这些操作,A 服务还能及时的得到异步处理成功的消息