zoukankan      html  css  js  c++  java
  • 消息中间件系列第1讲:为什么要用消息队列?

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

    消息队列的优点

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

    第一个作用:解耦。

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

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

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

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

    第二个作用:异步。

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

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

    第三个作用:削峰。

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

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

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

    消息队列的缺点

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

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

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

    总结

    本文讲了下面几个要点:

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

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

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

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

    参考资料

  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/chanshuyi/p/message_queue_serial_01_why_use_message_queue.html
Copyright © 2011-2022 走看看