首先,澄清两个易混淆的概念:扩展性和伸缩性
扩展性(Extensibility)
指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。表现在系统基础设施稳定不需要经常变更,应用之间较少依赖和耦合,对需求变更可以敏捷响应。
它是系统架构设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑未来功能扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改。
伸缩性(Scalability)
指系统能够通过增加(减少)自身资源规模的方式增强(减少)自己计算处理事务的能力。如果这种增减是成比例的,就被称作线下伸缩性。在网站架构中,通常指利用集群的方式增加服务器数量、提高系统的整体事务吞吐能力。
开发低耦合系统是软件设计的终极目标之一,这一目标驱动着软件开发技术的创新与发展,从软硬件分离到操作系统诞生从汇编语言到面向过程的开发语言,再到面向对象的编程语言;从各种软件工具集到各种开发框架;无不体现着降低软件系统耦合度的终极目标。
可以说,度量一个开发框架、设计模式、编程语言优劣的重要尺度就是衡量它是不是让软件开发过程和软件产品更加低耦合。
低耦合的系统更容易扩展,低耦合的模块更容易复用,一个低耦合的系统设计也会让开发过程和维护变得更加轻松和容易管理。
个人理解:对功能模块解耦、抽象出基础设施,进行低耦合的架构设计,是架构师乃至程序员最基本的素养。写代码不仅仅是写,也是设计,确保代码低耦合,可以复用,无状态,方法读写分离,方法本身幂等,类的单一职责等等。
当然,完全没有耦合就是没有关系,也就无法组合出一个强大的系统。
如何分解系统的各个模块、如何定义各个模块的接口、如何复用组合不同的模块构造成一个完整的系统,这时软件设计中最有挑战的部分。
个人理解:网站的架构目标是低耦合,可复用。所以先分割和分层,模块化,之后聚合,可以通过分布式消息队列和分布式服务(HTTP、RPC)。
软件架构师最大的价值不在于掌握多少先进的技术,而在于具有将一个大系统切分成N个低耦合的子模块的能力,这些子模块包含横向的业务模块,也包含纵向的基础技术模块。这种能力一部分源自专业的技术和经验,还有一部分源自架构师对业务场景的理解、对人性的把握、甚至对世界的认知。
个人理解:平时在业务评审,架构评审时,多关注别人是如何考虑拆分的,积极参与讨论和提问,从中深刻理解拆分的思路。
设计网站可扩展架构的核心思想是模块化,并在此基础之上,降低模块间的耦合性,提高模块的复用性。
网站通过分层和分割的方式进行架构伸缩,分层和分割也是模块化设计的重要手段,利用分层和分割的方式将软件分割为若干个低耦合的独立组件模块,这些组件模块以消息传递及依赖调用的方式聚合成一个完整的系统。
大型网站中,这些模块通过分布式部署的方式,独立的模块部署在独立的服务器(集群)上,从物理上分离模块之间的耦合关系,进一步降低耦合性提高复用性。
模块分布式部署以后,具体的聚合方式主要有分布式消息队列和分布式服务。
对于模块之间不存在直接调用的情况,新增模块或修改模块对其他模块影响最小,这样系统的可扩展性无疑更好一些。
原文:https://www.cnblogs.com/wozixiaoyao/p/11561438.html