可扩展性
我们的系统一般分为平时流量与高峰流量,为了节约成本一般都是预留1到2倍的容量,以应对突发的流量。但是如果突然来了一个大事件,一下来了很多请求,那么此时我们的系统可能承受不了那么多的流量。如果我们的系统的可扩展性非常好,那么我们可以快速的扩展我们的系统,以应对峰值流量。为此我们的系统需要具有良好的可扩展性。
如何设计可扩展性的系统
那么我们有什么依据来设置我们的系统,以实现良好的可扩展性呢?
我们可以基于AKF立方体来拆分我们的系统,以实现高可扩展性。AKF 立方体也叫做scala cube,旨在提供一个系统化的扩展思路。AKF 把系统扩展分为以下三个维度:X 轴:直接水平复制应用进程来扩展系统。Y 轴:将功能拆分出来扩展系统。Z 轴:基于用户信息扩展系统。其结构图如下所示:
我们日常见到的各种系统扩展方案,都可以归结到 AKF 立方体的这三个维度上。而且,我们可以同时组合这 3 个方向上的扩展动作,使得系统可以近乎无限地提升性能。
下文以电商系统为例说明
1、在系统刚开始设计阶段,为了使得系统能够尽快上线,同时限于团队规模,我们会基于MVC设计我们的电商系统,其架构图如下
我们把注册用户,添加购物车,下单,商品详情,评论等业务逻辑的处理全部都放到了一个应用中,然后通过这个应用直接操作数据库。
2、随着我们业务的发展,由于全部业务逻辑都操作同一个数据库,数据库渐渐的出现了性能瓶颈,为此我们沿着AKF的Y轴将数据库拆分成了多个库,以分摊读写压力,同时还能够在数据层面做到隔离,此时整体的架构图如下:
但是涉及到数据库的拆分,架构调整的成本还是很高的,业务逻辑上面需要处理数据应该路由到哪个库表。
3、随着业务的继续发展,当个应用程序,由于部署在同一个服务器上面,慢慢着这台服务器出现了性能瓶颈,为此我们引入了负载均衡器,从AKF的X轴扩展系统,以实现请求能够扩多个应用服务节点,此时的系统架构图如下:
从图中可以看出我们只是引入了一个负载均衡的中间件,就实现了应用延这AKF的X轴扩展。
4、随着业务的继续发展,我们的数据库又出现了性能瓶颈,我们经过分析数据的请求特点,发现很多都是读多写少的场景,为此我们沿着AKF的Y轴,在数据层面引入读写分离机制,此时的架构图如下:
读写分离的架构调整的成本也是很小的,我们只需要引入一个中间件,就可以帮我们实现读写分离。我们做完读写分离后,还可以通过沿着AKF的X轴增加读数据库的数量,实现读性能的提升。
5、随着业务的继续发展,我们发现每次发布新版本都得更新整个系统,系统的可用性比较差,我们的团队规模也越变越大,团队内部之间的沟通成本也越来越高,开发维护成本也变的不可接受。更可怕的是我们的应用程序也出现了性能瓶颈并且沿着AKF的X轴怎么水平扩展,整个系统的吞吐量并没有上升,反而下降了,通过google了解到现在比较流行微服务,为此我们决定沿着AKF的Y轴对服务进行微服务改造。将应用程序拆分成了如下的架构:
6、随着我们业务的发展,渐渐着,我们的单个库的大小达到了亿级别,此时在怎么拆分服务,数据规模都在那里,数据库的操作越来越慢。为此我们决定沿着AKF的Z轴,将数据库做水平拆分,将数据库按照一定的规则拆分到不同的库表中
不过数据库的分库分表有很多开源的中间件,我们可以使用中间件降低开发成本。
从如上的例子可以看出,AKF的Y轴的改造成本最大,往往涉及到架构的调整,数据库的迁移;Z轴的成本也比较大,通过引入中间件降低了开发的成本,但是也数据库的迁移;X轴的成本最小,往往通过增加服务的节点即可。而且AKF的X、Y与Z轴往往是相辅相成的。