为什么使用消息队列?

必言利

消息队列作为核心中间件被广泛使用于应用系统,可是我们为什么要使用它呢?

当然是它能带来好处,一般所认为好处有:

  1. 提高系统稳定性。A,B系统不一定同时在线,或系统故障,或系统属性,所以需要临时数据存储地方,比如邮箱系统。
  2. 提高系统伸缩性。这个是分布式系统带来的能力,分布式的消息队列也能带来这些能力。
  3. 异步化处理。同步处理太慢,或者没办法同步处理(对方系统不在线)时候,异步化处理能保证系统最终处理。消息队列可以异步化处理,但是异步化不是消息队列。
  4. 削峰填谷。在流量大的时候,通过消息队列暂时处理请求,让系统慢慢处理。
  5. 系统间信息传递。比如ETL,作为系统间的桥梁进行数据交换。
  6. 解耦。A系统发送N个消息给B系统,C系统,B要发系统给C,A等等,那么会导致系统耦合性很高,不如发送给一个中间节点,让接收方来订阅消息。

上面6条均是消息队列所带来的好处,但是不够言简意赅,因为有些是功能带来的,有些是队列本身带来的,有些互为因果,我觉得根本在于:

  1. 系统层面来看,它解决了系统处理速度的不同。
  2. 数据层面来看,它解决了动态数据管理问题。

系统层面

消息队列是一种有界缓冲区(Bounded buffer),用来处理系统间速度不一致。正是因为速度不一样,某个系统/操作明显很慢,所以需要缓冲区来进行处理。比如异步化处理时候,或者削峰填谷,均是系统间速度差异导致的问题,理想情况系统产生数据直接完美存入数据库,但是数据库处理能力跟不上。请求量过大,系统本身也可能处理不了,所以需要外部系统暂时存下,等后续有时间再处理。解耦只要引入第三方系统,都能解耦,所以不是消息队列带来的,而是消息队列对解耦处理的更好,比如发布订阅机制。

这里强调系统间速度,而不是单一系统速度,比如MySQL写入慢,暂时存在Redis,这是单一系统问题,不是系统间的速度问题。

数据层面

消息队列管理动态数据,数据库管理静态数据。从数据角度来看,所有系统最终都会产生数据,数据量可大可小,小的时候数据系统能承受,数据太大,数据系统承受不了,流动的数据过多,欲要静止而不可,动静转换,均是数据形态。动转静,静转动,消息队列均可。ETL本身也是管理动态数据的方法。

结论

消息队列能带来很多好处,有时候需要的并不是消息队列,而是需要判断当前系统的问题。在如今各种开源软件功能越来越全面时候,一个KV系统做的和消息系统类似,甚至提供了比消息系统更多的功能,系统间的边界越来越模糊,消息队列的简单选择考量因素却被淹没在很多似是而非的言论中,在我看来,系统层面系统间的速度问题数据层面动态管理问题是我要选择消息队列的重要考量因素,当明白了关键问题后,对待各种具体产品可以做到游刃有余。