由于软件开发的特殊性,导致在一个团队内只有少量的开发可以彻底了解某一个系统,在人数增加以后,沟通复杂度会呈指数型上升。所以,在系统越来越复杂的时候,就需要拆分团队,每个小团队负责某个或者某些服务,服务之间以 API 的形式互相调用,减少沟通损耗,提升研发效率。
亚马逊的创始人贝佐斯有一个披萨定律:如果两张全尺寸的披萨无法喂饱团队,说明团队应该拆分了。
软件架构本质上是软件维护团队的组织架构,组织上是分小组的,那软件架构上自然就是分层的。
一个单体系统进行分布式架构演进的第一步一般就是横向扩张:增加数据库的硬件资源,并将后端代码分散到多台服务器上运行,用一个负载均衡软件对用户流量进行分发。横向扩张通常包括以下步骤:
普通的横向扩展使用 Nginx 加上固定数量的后端服务器就可以实现,如果后端压力不定,为了省钱,可以使用 Consul 服务发现,让负载均衡器自己发现并适应不同数量的后端服务器,这样既可以满足业务高峰期的计算资源需求,也可以省钱。
如果业务规模再大,就需要更复杂的 K8s 软件来进行更大规模的计算资源调整了,需要引入外部负载均衡器,设计更大的更复杂的后端集群。而数据库由于拥有单点性,是很难横向扩张的,此时可能需要对后端系统进行拆分,分散数据库的压力,并对高性能需求的模块进行缓存改造,努力顶住压力。
K8s比虚拟机技术先进的地方主要有:
📙 高并发的哲学原理 《Philosophical Principles of High Concurrency》
Copyright © 2023 吕文翰