系统扩展的三种维度

经常提到一个系统的扩展性,只谈到垂直扩展和水平扩展,其中垂直扩展是提高系统内单个系统的处理能力,比如给机器加内存,换性能更高的机器等;水平扩展通俗一点说就是加更多的机器来处理请求,而不是试图提高单机的处理能力.

<<可扩展的艺术>>一书,将一个系统的可扩展性做了更多的划分和分析,它将一个系统的扩展性划分为以下三种维度:

其中:

  1. X轴:平等的克隆服务和数据
  2. Y轴:根据职责/功能的类型来划分.
  3. Z轴:根据服务面向的不同类型的用户来进行划分.

下面以一个例子为例展开讨论这三种维度的划分,在这个例子中假想的是一个电商网站的首页,需要处理用户的登录,同时还需要返回页面展现所需的商品信息.

X轴扩展

其实X轴扩展就是我们前面提到的水平扩展,这是最简单也最容易实现的一种扩展.X轴划分,要求每一个被划分出来的服务,都能独立完成所有的请求处理,并且数据也是一致的.

如果服务是无状态的,X轴扩展会相对的好做一些,需要用到的是各种负载均衡的技术,比如反向代理,DNS轮询等,其原因在于,无状态服务意味着每个服务上不涉及到数据的存储读取.

如果服务是有状态的,那么就涉及到一致性问题,需要考虑数据的复制,同步等问题.

Y轴扩展

前面的做法问题在于,把几个可以拆分开的服务都耦合在一起了,比如用户的登录和页面的展示并不紧密相关,对于页面的展示而言,只要获取到了商品就能用于展示,用户的验证慢一点也没有关系,所以把这两个不同的服务拆分出来:

将服务这么拆分之后,响应速度快了很多,因为只需要返回商品数据就能展现页面了.

但是这样又有一个问题:这里向客户端暴露了两个服务地址,如果服务变多了,是不是还需要暴露更多的地址?这样显然是不合理的,所以一般的做法,是在前面加一个代理网关来转发请求到不同的服务去,客户端只需要知道网关的地址就可以了:

同时,还可以将前面的X轴扩展运用到这里的不同服务上,成为这样的架构:

Z轴扩展

Z轴扩展.是根据特定的用户群体进行划分的扩展方法.它与X轴扩展一样,都能够提供一套完整的服务,所以经常会被混淆.差别在于,X轴扩展是无差异的扩展,一个请求过来,这一次到服务A上面,下一次到服务B上面,都是可以的;而Z轴扩展之后,一个请求只会到特定的服务上(当然这套服务同样又可以进行X轴扩展).继续以我们前面的例子来做说明,当业务扩大之后,希望在海外也部署一套服务,那么此时国内的服务和海外的服务之间就互为Z轴扩展的关系,一个请求过来不会一下到国内集群,一下到国外集群上.

另外的Z轴服务的划分方式,还有根据用户的ID,时间来进行的划分等.

总结来说,X轴扩展是最容易想到也是最容易实施的一种扩展方式,在需要扩展的时候,几乎第一步考虑到的都是首先进行X轴扩展.但是当系统的功能越来越复杂,如果还是继续进行X轴扩展,那么势必很多不同类型的服务都会耦合在一起,此时就需要进行按照不同服务/职责类型的Y轴划分.而当用户量进一步扩大,就需要考虑根据不同的用户类型来进行Z轴的扩展.

Leave a Reply