专业的编程技术博客社区

网站首页 > 博客文章 正文

百万年薪程序员必备知识:如何设计可扩展的架构?

baijin 2024-10-21 03:33:35 博客文章 10 ℃ 0 评论

什么是系统扩展性?

系统的扩展性一般有两层含义,一是业务的扩展性,二是容量的扩展性

业务的扩展性extensibility)是指系统在应对需求变化和增加时提供的?种能?,简而言之就是,功能增加的时候程序能够不改或少改。例如Java中常说的“Write Once, Run Anywhere”,对于MVC(模型-视图-控制器)来说就是“View变化,Model和Controller不变”。

容量的扩展性也叫伸缩性(scalability),是指系统能够通过调整资源来适应业务的需求,比如系统的存储资源能够在数据量暴涨的情况下,通过分库分表来扩展存储能力。

扩展性设计,是为了支撑业务快速发展而出现的概念,目的是保证在企业发展的不同时期,在业务复杂度相近的情况下,业务上线所需要的研发时间不会大幅增加,甚至是基本不变的。本质上,所谓扩展性设计,就是在面向业务的不确定性做设计。

为什么扩展性重要?

扩展性是我们衡量系统架构的核心指标,它之所以重要是因为它有以下优点:

  • 需求响应快:良好的扩展性能够赋予业务快速发展、创新和试错的能?;
  • 研发效率高:良好的扩展性避免了重复建设,沉淀了业务经验,提升了研发效率;
  • 系统质量稳:良好的扩展性的系统不会因为新功能的增加而影响老功能的质量。

此外,更重要的是,随着时代的发展,软件的复杂度是不断提升的。良好的扩展性是解决软件复杂度的重要方法!最近比较流行的DDD(领域驱动设计)正是通过可扩展的业务建模来应对软件的复杂度的。

如何做扩展性设计?

AKF扩展立方体(Scalability Cube),是一种指导可扩展架构设计的模型,在《Scalability Rules(架构真经)》一书中有详细的介绍。

AKF扩展立方体将可扩展的系统的特征划分为3个正交维度:

  • X轴:水平复制,支持无差别的服务和数据的复制,流量可以均匀地分布在不同的服务节点上;
  • Y轴:业务拆分,关注应用中职责的划分,比如将系统拆分为用户中心、交易中心、营销中心等多个微服务;
  • Z轴:数据分片,关注服务和数据的优先级划分,是基于数据集本身的特性来进行扩展的方式,比如分库分表

在了解可扩展的系统架构所应该具备的特征后,我们来看看怎么来获得这些特征?

软件是以比特的方式反映现实世界,以面向对象的方式认识世界,是解决软件复杂度的方式,也是扩展性的来源。

所以,设计可扩展的系统的第一步是“建模”。UML(Unified Modeling Language,统一建模语言)和四色建模法是常用的业务建模方法。不熟悉的同学可以深入学习下,这里不做详细介绍。

业务建模的主要目标是,建立对于业务的模型化认识,包括哪些是稳定的,哪些是易变的。之后,我们的工作就是“拆分”,包括面向业务的拆分面向容量的拆分

  • 面向业务的拆分,主要的手段包括服务化架构、分层架构等。核心思想是,通过拆分隔离关注点降低最小单元的复杂度,以应对业务的变化。
  • 面向容量的拆分,分为应用容量拆分数据容量拆分

要支持应用容量的水平可扩展,首先是要将应用转变为无状态的服务。然后在支持负载均衡的分布式环境中,横向扩展服务节点的数量即可。

数据容量的扩展,可以根据业务场景的特性,将单库单表按照垂直维度或者水平维度拆分为多库多表,亦或通过部署一主多从扩展系统的读能力和灾备能力。

结语

任何业务架构都存在确定性和不确定性的部分,但二者并不是恒定不变的。所谓的确定性部分,可能无法适应业务的演进和发展,从而出现大量的改动;而所谓的不确定性部分,也可能随着时间的推移,逐渐固化为产品能力,变成设计内的确定性内容。

真正优秀的可扩展架构,是建立在看透业务本质的基础上的,面向不确定性,但要从不确定性中寻找确定性。并且,我们也要在二者间寻找到平衡,因为过度的可扩展设计也会带来复杂性的提升。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表