消息队列中间件可以说是Java开发中最常使用的一块技术了,基本上上了规模的系统都会使用消息队列来优化系统架构。那么为什么要使用消息队列?我们使用消息队列来解决什么问题呢?
消息队列的优点
对于大多数系统来说,我们使用消息队列来做下面三件事情:解耦、削峰、异步。[1]
第一个作用:解耦。
在多个系统中,如果使用传统模式来做,那么使用传统模式将是这样的:
传统模式的缺点:系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码。如果将来D系统接入,系统A还需要修改代码,过于麻烦!
但是如果我们中间件改造一下,那么架构图如下:
使用消息中间件后,我们将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
第二个作用:异步。
传统模式下我们出息消息使用串行的方式,一些非必要的业务逻辑以同步的方式运行,太耗费时间。
如果我们使用消息中间件方式,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。
第三个作用:削峰。
在传统架构中,遇到并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常中间件模
但如果使用了消息中间件,系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。
除了上面说到的三大作用,其实消息队列还有其它作用,例如:可以持久化数据,保证消息之间的顺序等等。如果想了解更多消息队列的作用,可以参考文末资料[2]。
消息队列的缺点
说了这么多使用消息队列的好处,但其实消息队列也不是万能的,它也有一些缺点。
- 系统复杂性增加。 一个系统如果直接将业务串行处理,那么只需要在一个系统中把代码写写写就好了。但如果引入消息队列,则要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。
- 系统可用性降低。 你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性降低。
其实上面两个缺点导致的最终结果就是:系统研发成本增加。 引入消息队列后,你就必须要对大多数消息队列有个深入的理解,否则如何做技术选型呢?而消息队列本身也比较复杂,在短时间内无法完全理解。所以是否使用消息队列需要根据具体场景判断,而不是为了使用技术而用技术。
总结
本文讲了下面几个要点:
- 消息队列的优点
- 消息队列的缺点
看完之后,你应该能解答下面几个问题:
- 我的系统到底要不要使用消息队列?
下篇,我们聊聊使用消息队列需要考虑的几个问题。