软件开发中的决策:权衡与取舍
上QQ阅读APP看书,第一时间看更新

1.3.1 可扩展性与弹性

我们创建的系统需要有能力处理海量的数据,同时,它们还要能按需伸缩。如果系统的一个节点每秒可以处理N个请求,流量暴增时,微服务架构允许你快速横向扩展(水平扩展)来满足业务需求(见图1.3)。当然,系统需要以支持容易扩展的方式编码,也需要使用底层的组件。

图1.3 横向扩展意味着可以通过向资源池中添加更多的机器来满足增长的业务需求

举个例子,为了让你的系统有能力每秒处理2N个请求(这里的2表示服务的数量,N表示单个服务可以处理的请求数),你可以增加一个原微服务的新实例。不过,要想达到期望的效果,底层的数据访问层需要具备向上扩展的能力。

当然,扩展性会有上限,当它达到上限之后,增加新节点也不一定能带来太大吞吐量的提升。性能瓶颈可能出现于数据库、消息队列、网络带宽等达到了扩展的上限时。

不过,就整体而言,与单体系统相比,微服务架构的扩展要容易得多。在单体系统中,一旦某些资源达到上限,几乎不可能做快速扩展。

你可以通过为计算实例添加更多处理器、更大的内存或者磁盘容量来垂直扩展(通常称为纵向扩展)你的应用,同样地,这种方式也存在一定限制,达到上限之后很难继续提升性能。举个例子,有个单体应用部署到云端,部署时选择更强劲的云计算实例类型(更多的处理器或者更大的内存)就可以纵向扩展,提升其性能。如果能够增加更多的资源,这种方式显然是有效的。然而,云计算实例也存在资源上限,某些时候,云计算提供商可能也无法提供更强劲的机器。这时,横向扩展的灵活性优势就体现出来了。如果你的应用在设计和实现时考虑了支持部署到N个实例,就可以通过部署更多的实例,为服务提供更高的总吞吐量。