这个问题在网上一堆的答案,最核心的内容包含如下几个:异步解耦、峰值流量控制以及高性能、高可靠等等。这些词都是牛逼又高大上的词,相信读者朋友或多都了解过一些,没看过至少听过吧。下面我结合自己干了这么几年系统开发的感觉,按我自己思考的方式讲一讲。
-
依赖
百度百科中解释 “依靠别人或事物而不能自立或自给称为依赖 ”。一个系统一般会包含多个模块,比如:登录、存储、权限管理和系统配置等等,那这模块间就存在着相互依赖关系。例如,A需要完成某个业务逻辑,需要请求B的某个功能,而B又需要C的某个处理过程,那么我们就说A对B存在依赖,B对C存在依赖,也可表示为A->B->C,关系如下图1所示。
图1
-
单体应用
在学校里面学习编程时,只要考试几乎都是先做一个学生成绩管理系统,那回顾一下这个系统包含哪些模块:登录、学生/老师信息录入、课程录入、选课、成绩录入等,再加上日志、导入/导出、权限控制等基础功能。刚开始我们只是用内存存放数据,在Console捕获输入,打印输出。后来玩到了数据库,那就接一个关系型数据库来持久化,然后就没有然后了....,如下图2。一个普通的高校,少说也有几千人,牛逼的学校几万人,某天学校通知要开始下学期的选课了,然后通知到各个学院、各个系在哪个时间点登录系统去选课。即使错开时间,很多学校的系统也是会出现“哟吼,你访问的服务500”提示,然后一群人在寝室大骂这是哪个傻逼做的系统,可能老师也在埋怨......。
图2
功能、部署都在集中于一个系统的应用,我们称之为单体应用。为了保证服务的高性能、高可靠,一般的系统部署采用负载加多个应用服务器,后面接一个数据库(集群),对于本文的学生成绩管理系统,部署结构如下图3所示。
图3
-
系统拆分
学生选课需要老师先录入课程,这就存在依赖关系。针对上面系统不可用问题,把老师操作的系统与学生选课系统拆分开来,采用服务化的方式进行集成,这样保证即使学生选课错了问题,老师也可以继续录入课程,如下图4所示。
图4
这下老师、学生稍微可以缓一缓了。为保证学生选课系统里靠谱点,在老师进行课程登记时出了问题,已登记的课程学生任然可以继续选课,考虑在学生选课系统里进行多线程异步调用课程登记接口获取课程信息,在课程系统回复后在进行信息传递,也即使提高了系统的容错能力。
-
系统解耦
前面这种方案还是会对学生选课系统造成影响,比如大量的异常日志导致系统不稳定。同时也不适用与业务扩展。通过引入中间的服务处理程序把这种调用关系进行拆分来满足业务解耦,如下图5所示。
至此,引出了消息中间件方案,这里描述的时系统解耦,其他关于峰值流量控制、高性能、高可靠都可以类比推理。