消息队列中间件可以说是Java开发中最常使用的一块技术了,基本上上了规模的系统都会使用消息队列来优化系统架构。那么为什么要使用消息队列?我们使用消息队列来解决什么问题呢?

消息队列的优点

对于大多数系统来说,我们使用消息队列来做下面三件事情:解耦、削峰、异步。[1]

第一个作用:解耦。

在多个系统中,如果使用传统模式来做,那么使用传统模式将是这样的:

消息中间件系列第1讲:为什么要用消息队列?_消息中间件

传统模式的缺点:系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码。如果将来D系统接入,系统A还需要修改代码,过于麻烦!

但是如果我们中间件改造一下,那么架构图如下:

消息中间件系列第1讲:为什么要用消息队列?_消息中间件_02

使用消息中间件后,我们将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。

第二个作用:异步。

传统模式下我们出息消息使用串行的方式,一些非必要的业务逻辑以同步的方式运行,太耗费时间。

消息中间件系列第1讲:为什么要用消息队列?_消息中间件_03

如果我们使用消息中间件方式,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。

消息中间件系列第1讲:为什么要用消息队列?_消息队列_04

第三个作用:削峰。

在传统架构中,遇到并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常中间件模

消息中间件系列第1讲:为什么要用消息队列?_消息中间件_05

但如果使用了消息中间件,系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

消息中间件系列第1讲:为什么要用消息队列?_中间件_06

除了上面说到的三大作用,其实消息队列还有其它作用,例如:可以持久化数据,保证消息之间的顺序等等。如果想了解更多消息队列的作用,可以参考文末资料[2]。

消息队列的缺点

说了这么多使用消息队列的好处,但其实消息队列也不是万能的,它也有一些缺点。

  • 系统复杂性增加。一个系统如果直接将业务串行处理,那么只需要在一个系统中把代码写写写就好了。但如果引入消息队列,则要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。
  • 系统可用性降低。你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性降低。

其实上面两个缺点导致的最终结果就是:系统研发成本增加。 引入消息队列后,你就必须要对大多数消息队列有个深入的理解,否则如何做技术选型呢?而消息队列本身也比较复杂,在短时间内无法完全理解。所以是否使用消息队列需要根据具体场景判断,而不是为了使用技术而用技术。

总结

本文讲了下面几个要点:

  • 消息队列的优点
  • 消息队列的缺点

看完之后,你应该能解答下面几个问题:

  • 我的系统到底要不要使用消息队列?

下篇,我们聊聊使用消息队列需要考虑的几个问题。

消息中间件系列第1讲:为什么要用消息队列?_消息队列_07