细谈八种架构设计模式及其优缺点概述( 三 )

  • 作为架构师,我已经失去了对这个系统的把控......
  • 为了解决上述问题,我司使用了微服务模式,这种模式的一般设计见下图:
    细谈八种架构设计模式及其优缺点概述

    文章插图
     
    如上图所示,我把业务分块,做了垂直切分,切成一个个独立的系统,每个系统各自衍化,有自己的库、缓存、ES等辅助系统,系统之间的实时交互通过RPC,异步交互通过MQ,通过这种组合,共同完成整个系统功能 。
    那么,这么做是否真的解决上述问题了呢?不玩虚的,一个个来说 。对于问题一,由于拆分成了多个子系统,系统的压力被分散了,而各个子系统都有自己的数据库实例,所以数据库的压力变小 。
    对于问题二,一个子系统A的数据库挂了,只是影响到系统A和使用系统A的那些功能,不会所有的功能不可用,从而解决一个数据库挂了,导致所有功能不可用的问题 。
    问题三、四,也因为拆分得到了解决,各个子系统有自己独立的GIT代码库,不会相互影响 。通用的模块可通过库、服务、平台的形式解决 。
    问题五,子系统A发生改变,需要上线,那么我只需要编译A,然后上线就可以了,不需要其他系统做同样的事情 。
    问题六,顺应了康威定律,我部门该干什么事、输出什么,也通过服务的形式暴露出来,我部只管把我部的职责、软件功能做好就可以 。
    问题七,所有需要我部数据的需求,都通过接口的形式发布出去,客户通过接口获取数据,从而屏蔽了底层数据库结构,甚至数据来源,我部只需保证我部的接口契约没有发生变化即可,新的需求增加新的接口,不会影响老的接口 。
    问题八,不同的子系统需要不同的权限,这个问题也优雅的解决了 。
    问题九,暂时控制住了复杂性,我只需控制好大的方面,定义好系统边界、接口、大的流程,然后再分而治之、逐个击破、合纵连横 。
    目前来说,所有问题得到解决!bingo!
    但是,还有许多其他的副作用会随之产生,如RPC、MQ的超高稳定性、超高性能,网络延迟,数据一致性等问题,这里就不展开来讲了,太多了,一本书都讲不完 。
    另外,对于这个模式来说,最难把握的是度,切记不要切分过细,我见过一个功能一个子系统,上百个方法分成上百个子系统的,真的是太过度了 。实践中,一个较为可行的方法是:能不分就不分,除非有非常必要的理由! 。
    • 优点:相对高性能,可扩展性强,高可用,适合于中等以上规模公司架构 。
    • 缺点:复杂、度不好把握 。指不仅需要一个能在高层把控大方向、大流程、总体技术的人,还需要能够针对各个子系统有针对性的开发 。把握不好度或者滥用的话,这个模式适得其反!
    七、多级缓存模式这个模式可以说是应对超高查询压力的一种普遍采用的策略,基本的思想就是在所有链路的地方,能加缓存就加缓存,如下图所示:
    细谈八种架构设计模式及其优缺点概述

    文章插图
     
    如上图所示,一般在三个地方加入缓存,一个是客户端处,一个是API网关处,一个是具体的后端业务处,下面分别介绍 。
    【细谈八种架构设计模式及其优缺点概述】客户端处缓存:这个地方加缓存可以说是效果最好的---无延迟 。因为不用经过长长的网络链条去后端业务处获取数据,从而导致加载时间过长,客户流失等损失 。虽然有CDN的支持,但是从客户端到CDN还是有网络延迟的,虽然不大 。具体的技术依据不同的客户端而定,对于WEB来讲,有浏览器本地缓存、Cookie、Storage、缓存策略等技术;对于App来讲,有本地数据库、本地文件、本地内存、进程内缓存支持 。以上提到的各种技术有兴趣的同学可以继续展开来学习 。如果客户端缓存没有命中,那么就会去后端业务拿数据,一般来讲,都会有个API网关,在这里加缓存也是非常有必要的 。
    API网关处缓存:这个地方加缓存的好处是不用把请求发送到后方,直接在这里就处理了,然后返回给请求者 。常见的技术,如http请求,API网关用的基本都是Nginx,可以使用nginx本身的缓存模块,也可以使用Lua+redis技术定制化 。其他的也都大同小异 。
    后端业务处:这个我想就不用多说了,大家应该差不多都知道,什么Redis,Memcache,Jvm内等等,不熬述了 。
    实践中,要结合具体的实际情况,综合利用各级缓存技术,使得各种请求最大程度的在到达后端业务之前就被解决掉,从而减少后端服务压力、减少占用带宽、增强用户体验 。至于是否只有这三个地方加缓存,我觉得要活学活用,心法比剑法重要!总结一下这个模式的优缺点:


    推荐阅读