《The Art of Acalability》描述了一个关于应用的扩展性的三维立方体:扩展立方体,如下图所示。

扩展立方体中,将应用当做一个立方体,可以分别从X、Y和Z三个方向来对应用进行扩展,提升应用的容量、可用性、性能和系统功能的可维护性。
1 X轴扩展:服务/数据水平复制
X轴扩展通过克隆实例的方式来扩展,多个实例是无差别的,实例的请求分布是由负载均衡来控制的。这种方式可以很容易做到提供应用的吞吐量和可用性。例如,多个无状态的应用逻辑服务可以很简单的通过扩充机器来提高系统的吞吐量,主从数据库可以显著提高读的吞吐量,主主数据库可以提高读写的吞吐量。
- 优点
- 实现成本很低,一般来说效果都不错
- 缺点
- 受限于实例必须能够独立提供服务
- 该扩展方式无法降低业务系统代码堆积带来的复杂度
- 在数据量太大的情况下,该扩展效果不大
- 适用场景
- 业务发展初期,业务系统和数据量都不大时,需要增加系统的处理能力,可以考虑使用X轴扩展。
2 Y轴扩展:根据职责/功能划分
Y轴扩展根据职责/功能对系统进行划分,一般划分为多个更小的系统,同时在组织上也对应划分为多个团队。例如,将用户、商户、商品、订单、交易和结算等划分为各个小团队,系统也进行分离,更有利于整个大系统的维护。
- 优点
- 可以解决业务系统代码堆积带来的复杂度
- 可以解决整体的业务数据量太大的问题
- 通过功能拆分将系统分解为多个独立的系统,更有利于维护,提高团队的响应时间。
- 缺点
- 拆分系统具有较大的成本
- 若某个业务的数据量太大,但系统无法进一步拆分时,则通过Y轴扩展无法解决。例如,用户数据量太大,单张数据表无法存放。
- 适用场景
- 业务系统复杂,代码耦合严重
- 数据量太大
- 团队规模太大
本系列介绍的微服务,其实是Y轴扩展的一种实现。
3 Z轴扩展:根据请求属性路由
Z轴扩展根据请求中的属性,将不同的请求路由到不同的服务实例中,每个实例仅负责处理数据的一个子集。这听起来类似于X轴扩展,但X轴扩展每个实例可以处理所有的数据,而Z轴扩展每个实例只是处理数据的一个子集。例如,北京地区的用户访问位于北京的服务,上海地区的用户访问位于上海的服务;分片数据库中,每个分片只存储总体数据量的一个子集。
- 优点
- 能解决数据量大规模增长的问题
- 缺点
- 成本较高
- 不能解决业务系统代码复杂的问题
- 适用场景
- 某个业务领域的数据快速增长。例如,用户数据快速增长,超过单表允许的数据量,或者单表响应时间慢,则需要对于用户的数据表进行分片。