前面已经讲到了高层架构设计落地的第二步:如何进行服务拆分。
接下来聊聊AKF扩展立方体,以及模块划分的一些基本原则。
一:AKF扩展立方体
AKF扩展立方体形象地描述了一系列用于系统扩展的方法,它以AKF公司合伙人的名称命名,形如:
从左下角原点开始进行扩展,目标就是右上角的无限扩展。
1:X轴扩展
也被称为水平扩展,通过复制服务或数据库以分散事务处理带来的负载。
这个比较简单,单从服务来讲,比如原本你做的应用,部署在一个Web服务器(如Tomcat)里面,运行得挺好。
慢慢的,发现性能不能满足要求了,这个时候怎么办呢?
很简单,先做水平扩展,就是多部署几个Tomcat,每个Tomcat里面都跑着你的应用,然后前面用Nginx之类的软件来进行负载均衡和反向代理,把服务请求分散到这多个Tomcat里面去。
![](https://img.haomeiwen.com/i20063139/1c28ed69332a7343.png)
这样,从单个Tomcat来看,请求数量减少了,它完全能完成请求处理,并保证性能符合要求。
数据库也是一样的道理,做Master-Slave,读写分离,也可以多带两个Slave,来分散数据请求的压力。如果是写的压力过大,还可以做数据库集群,多做几个Master,以分散写的压力。
这就是X轴扩展,也就是水平扩展。
2:Y轴扩展
指的是根据服务、功能或资源进行拆分,拆分的维度可能会多一些。
比如按照服务拆分,假设一个Tomcat里面,部署完整的系统功能,压力太大了,我们可以按照服务进行拆分,这样一个Tomcat里面,就只需要部署这个服务,也就是系统的一部分,这样性能上就能满足要求了。
按照Y轴扩展后,同样可以再按照水平扩展,比如:虽然这个Tomcat里面只部署一个服务,但是压力还是很大,这个时候完全可以再进行水平扩展,多来一些Tomcat,每个Tomcat里面只部署这同一个服务,自然就形成了这个服务的集群。
![](https://img.haomeiwen.com/i20063139/ab19ca20427f9ddb.png)
前面讲如何进行服务拆分里面讲到的方法,基本都可以应用到这个Y轴扩展上。
把X轴扩展和Y轴扩展有机地结合起来,就能满足大多数系统的需要。
3:Z轴扩展
通过Y轴扩展,业务系统可以越拆越小,直到满足性能的需求,这个时候,问题往往出现在数据库这边,数据库撑不住系统的高并发 或者是 海量的数据。
这就自然而然的需要进行Z轴扩展,其实本质就是数据拆分,比如根据数据的独特属性(如ID、姓名、地理位置等)进行数据的拆分。
数据拆分通常又分为:水平拆分和垂直拆分,也就是我们常听到的:垂直分库、垂直分表、水平分库和水平分表,这些应该是大家都比较熟悉的内容,这里就不多啰嗦了。
其实不管是X、Y、Z轴扩展,其体现的思想都是:分而治之,这是做架构设计当中,非常重要的一个思想。简单点说,就是问题太大搞不定,拆小点,多拆几个,把所有小问题都解决了,大问题自然也就解决了。
二:模块划分的基本原则
模块划分的方法和前面服务拆分的方法类似,只不过模块的功能范围更小一些。
1:按业务功能进行聚合拆分
就是把同一主体的业务功能,尽量聚合封装到一起,这就是一个模块。
比如:把用户管理里面,跟用户账号相关的功能聚合起来,就可以形成用户账号管理模块;而跟用户信息相关的功能聚合起来,就可以形成用户信息管理模块,等等。
2:根据功能聚合的范围和封装颗粒度,进行子模块的拆分
聚合形成多个模块过后,如果发现某个模块功能比较多,就要考虑,是不是可以进一步拆分。
比如前面提的用户信息管理模块,现在你发现功能多了,还可以继续向下,拆分成为用户基本信息管理模块;用户教育信息管理模块;用户工作经历管理模块,等等。
就是进一步的缩小业务主体,把一个大模块的功能,进一步细化和拆分,形成更多的子模块。
3:根据模块封装的功能所起的作用来进行分层拆分
如果这些模块功能是公共使用的,你可以把它分到基础层。
如果这些模块功能是用来处理业务的,你可以把它分到业务层。
如果这些模块功能是用来聚合功能,提供前端使用的,你可以把它分到聚合层,等等的,以此类推,进行分层拆分。
4:为重用进行模块拆分
如果在进行模块拆分的过程中,发现有一些功能,多个模块都可能使用到,那么就需要把这些功能提炼出来,放到一些公共的模块,比如:放到底层的基础模块,或者是通用功能包,或者是util之类的工具包里面。
好了,关于AKF立方体和模块划分的一些基本原则,就先聊到这里。
作者:CTO说
链接:https://www.toutiao.com/a7006972723784319518/?log_from=6e9a8e8683151_1632557296879
网友评论