收缩型模型(有用的三维可扩展性模型)
收缩型模型(有用的三维可扩展性模型)理想情况下,每个服务应该只有很小的一个责任集合。Bob大叔Martin曾经提出过使用单一责任原则(Single Responsible Principle,SRP)来设计类[PDF]。SRP将类的职责定义为变更的原因,应该只有一个原因会导致某个类产生变更。当设计服务时,使用SRP也是很有价值的。扩展的第三个维度称为Y轴扩展或功能分解。与Z轴扩展中对事情进行拆分类似,Y轴扩展会将不同的事情进行拆分。在应用层,Y轴扩展会将庞大的整体应用拆分为一组服务。每个服务实现一组相关的功能,如订单管理、客户管理等。决定如何将系统拆分为一组服务在很大程度上来讲是一门艺术,不过有一些策略可以提供帮助。拆分服务的一种方式是按照动词(verb)或者是用例来进行拆分。例如,稍后你会看到拆分后的在线商店应用包含了Checkout UI服务,它实现了结账用例的UI功能。另外一种拆分方式就是将系统按照名词或者说是资源进行
有用的三维可扩展性模型:扩展性立方,如图所示。
在这个模型中,要对应用进行扩展,最常用的方式就是在负载均衡器后面运行多个完全相同的应用,这也就是所谓的X轴扩展。对于提升应用的处理能力以及可用性来讲,这是一种很好的方式。
Z轴扩展当使用Z轴扩展时,每个服务器都运行着相同的代码。在这方面,它很类似于X轴扩展。很大区别在于每个服务器只负责数据的一个子集。系统中会有些组件负责将每个请求路由到对应的服务器。一个常用的路由条件就是请求的属性,如要访问实体的主键,这也就是所谓的sharding。另外一个常见的路由条件是客户类型。例如,相对于免费客户,应用可能需要对收费客户提供更高的SLA(Service-Level Agreement,服务等级协议),这样的话,就需要将收费客户的请求路由到具有更高处理能力的不同服务器上面。
Z轴扩展,类似于X轴扩展,提升了应用的处理能力和可用性。但是,它们都无法解决不断增长的开发和应用复杂性。为了解决这些问题,我们需要Y轴扩展。
Y轴扩展扩展的第三个维度称为Y轴扩展或功能分解。与Z轴扩展中对事情进行拆分类似,Y轴扩展会将不同的事情进行拆分。在应用层,Y轴扩展会将庞大的整体应用拆分为一组服务。每个服务实现一组相关的功能,如订单管理、客户管理等。
决定如何将系统拆分为一组服务在很大程度上来讲是一门艺术,不过有一些策略可以提供帮助。拆分服务的一种方式是按照动词(verb)或者是用例来进行拆分。例如,稍后你会看到拆分后的在线商店应用包含了Checkout UI服务,它实现了结账用例的UI功能。
另外一种拆分方式就是将系统按照名词或者说是资源进行拆分。这种服务会负责给定类型实体/资源的所有操作。
理想情况下,每个服务应该只有很小的一个责任集合。Bob大叔Martin曾经提出过使用单一责任原则(Single Responsible Principle,SRP)来设计类[PDF]。SRP将类的职责定义为变更的原因,应该只有一个原因会导致某个类产生变更。当设计服务时,使用SRP也是很有价值的。