摘要: 本文翻译自http://microservices.io/articles/scalecube.html,作者Chris Richardson。这篇文章描述了伸缩应用的三个维度:X轴的伸缩指运行多份应用的拷贝,通过负载均衡器来路由请求;Y轴的伸缩指对应用功能进行分解,将应用划分为多个服务,可以通过API网关来路由请求到具体的服务;Z轴伸缩指每个服务器只处理部分数据。
The Art of Scalability这本书描述了一个很有用、三维伸缩模型:伸缩立方。
X轴伸缩
X轴的伸缩,由负载均衡器后运行的多个拷贝构成。如果有N份拷贝,每份拷贝处理1/N的负载。这是个简单常用的伸缩应用的方式。
这个方法的缺点是,由于每份拷贝潜在地访问所有数据,缓存需要更多内存才能更加有效。另一个问题是,这个方法并没有解决不断增加的开发和应用复杂度的问题。
Y轴伸缩
不同于X轴和Z轴那种运行多份完全相同应用的伸缩方式,Y轴伸缩将应用分成多份不同的服务。每份服务负责一个或多个紧密相关的功能。将应用分解为多个服务的方法有很多。一种方法是使用动词分解,服务实现单个用例,如检出。另外的选择是通过名词来分解,服务负责与特定实体相关的所有操作,如客户管理。某个应用可以采用动词分解和名词分解的组合。
Z轴伸缩
使用Z轴伸缩的话,每个服务器运行一份完全相同的代码。在这个角度上,它与X轴伸缩类似。最大的区别在于每个服务器只负责数据的一个子集。系统的某些组件负责将请求路由到合适的服务器上。一个常用的路由标准是请求的属性,如被访问的实体主键。另一个常用路由标准是客户类型。例如,应用可以将SLA(服务水平协议, Service Level Agressment)更高的付费客户的请求路由到处理能力更强的服务器上去。
Z轴分割常用于数据库的伸缩。数据依据每个记录的属性被跨服务器地分区(也叫分片)。这这个例子中,RESTAURANT表的主键用于在两个不同数据库服务器间对数据行进行分区。注意通过部署一个或多个服务器作为备份/从服务器(replicas/slaves),X轴克隆也可以用于每个分区。Z轴伸缩也可用于应用。在这个例子中,搜索服务包含很多分区。路由将每个内容条目发送到合适的分区(会在分区中被索引和储存)。聚合器(aggregator)将每个查询发送到所有分区,并将所有响应结果组合在一起。
Z轴伸缩的好处:
-
每台服务器只处理数据的一个子集。
-
提升了缓存的利用率,减少了内存占用和I/O流量。
-
提升了事务的可伸缩性,因为请求一般分布在多台服务器上。
-
另外,Z轴伸缩提升了故障隔离(fault isolation),因为故障只造成一部分数据不能访问。
Z轴伸缩的缺点:
-
提高了应用复杂度。
-
需要实现一个分区方案,可能很棘手,尤其当我们需要重新对数据进行分区时。
-
它没有解决不断增加的开发和应用复杂度。为了解决这些问题,我们需要采用Y轴伸缩。