MQ (Message Queue)消息队列,是在消息传输过程中存储消息的容器。多用于分布式系统之间的通信。
队列是基础数据结构中 “先进先出” 的一种数据结构。
消息对列,指把要传输的数据消息放在队列中,用队列机制来实现消息传递。
上图中,“P”是我们的生产者,“C”是我们的消费者,中间就是存放消息的消息队列。
生产者将消息发送到MQ,MQ将消息推送给指定的消费者,或者消费者去MQ 拉取特定的消息。
生产者和消费者可以当做客户端,MQ就是服务端(也可以叫作消息中间件)。
未使用MQ前,库存系统、支付系统、物流系统其中任何一个子系统出现故障,都会造成下单操作异常。
使用MQ后,订单系统和库存系统、支付系统、物流系统进行了系统间的解耦,任何一个子系统出现故障不影响订单系统和其它子系统。比如物流系统出现故障了,需要几分钟进行修复,此时物流系统要处理的数据保存在了MQ中,用户的下单操作可以继续进行,当物流系统恢复后,继续处理订单信息即可。下单用户感受不到物流系统发生的故障,提高系统的容错性。
未使用MQ前,库存系统、支付系统、物流系统之间是同步(必须一个接一个)处理数据的,总共花费时间是3*300ms+20ms=920ms;
使用MQ后,我们在库存系统处理数据的同时,可以进行支付系统、物流系统处理数据,完成系统间的异步处理数据。总共花费时间是300ms+20ms+5ms=325ms;
比如:订单系统最多能处理1000次/s订单,这在平常时段没问题,但在高峰期,如果有1万次下订单,此时系统是处理不了的,否则系统会发生故障。使用MQ做缓冲,这时消息会积压在MQ服务器,在高峰期过后一段时间内,消息会一直维持在服务器能承受的范围内 ,直到消费完积压的消息,提升系统的稳定性。
系统引入的外部依赖越多,系统的稳定性越差。一旦MQ宕机,就会对业务造成影响。需要利用各种手段提高MQ的高可用。
大大提高了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。需要处理消息被重复消费以及防止消息丢失的问题。