2024年3月14日

通俗易懂的消息队列作用

作者 高劲松

我们知道MQ(Message Queue,消息队列)主要解决的是是解耦、削峰填谷、异步消息、和持久化等问题,同时需要保证高性能、高可用、可伸缩和最终一致性架构。这些概念理解起来都很抽象,但是如果我们将这些概念与自然界的水循环系统类比起来可能会更好理解。实际上一般的计算机系统可以看作是数据流动的过程。例如:淘宝的订单信息流向阿里的后台服务器集群,进行处理之后的数据再流回消费者客户端。

这样一个过程很容易让我们想起自然界的水循环过程,山川溪流收集雨水,汇集成河流、江川,最后流向海洋,最后再以雨水的形式循环起来,计算机应用中的数据流动过程​其实就类似于自然界的水循环过程。而作为消息队列或者缓存队列的MQ其实就类似于三峡大坝的概念,上游的小溪流河流就类似于生产者的概念,下游的河道类似于消费者概念,而我们的海就类似于数据库集群的概念。接下来我们将从这个新奇的角度来理解MQ所提供的这些功能,以及为什么要有这些功能。

解耦:

首先是解耦的功能,我们不妨想想水库修建后的效果,上游的流量不再时刻影响着下游的流量,下游可以时刻根据自己的需求通过开闭闸门的方式控制流量的大小。这样一来,不需要担心上游流量暴涨而导致下游无法承受导致的洪水,也不需要担心当上游流量降低导致下游无水可用。所以解耦实际上来说,就是将消息生产者和消费者的事务互相独立开来,提升消息的处理速度和系统的并发量,维护系统整体稳定性。

削峰填谷:

应用系统跟气候一样,不会总是一成不变的,有雨季也有旱季。当雨季来临,上流河水流量暴涨,如果不加以处理就有可能给下流造成严重的洪涝灾害,对应计算机系统而言就是导致服务崩溃。因此,修建水库的作用,就是再雨季削减上流的流量,防止过度的流量导致下游的崩溃;旱季来临,当上游流量骤减,则利用存储的水进行合理分发。这一过程其实和MQ的作用可以说是一摸一样,最终目的都是有利于保障系统整体的稳定性。

持久化:

水库顾名思义就是将水积攒起来,这个过程水没有消失,既没有被蒸发也没有被消费,只是存储在我们的水库当中等待下游需要的时候进行消费。而MQ的作用也是一样,消息到MQ之后不是说没有人消费就把消息丢弃掉了,而是在MQ内部有相应的持久化机制,当消费者再次上线的时候可以继续进行消费。