《大型网站技术架构》读书笔记7 架构-网站的可扩展架构
网站的可扩展架构
- 网站的扩展性架构设计:就是在对现有系统影响最小的情况下,系统功能可持续扩展及提升的能力。
- 扩展性:表现在系统基础设施稳定不需要经常变更,应用之间较少依赖和耦合,对需求变更可以敏捷响应。它是系统架构设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑未来功能扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改。
构建可扩展的网站架构
- 开发低耦合系统是软件设计的终极目标之一
- 软件架构师最大的价值在于具有将一个大系统切分成N个抵耦合的子模块的能力。这些子模块包含横向的业务模块,也包含纵向的基础技术模块。
- 软件设计中最有挑战的部分,如何分解系统的各个模块、如何定义各个模块的接口、如何复用组合不同的模块构造一个完整的系统。
- 设计网站可扩展架构的核心思想是模块化,并在此基础上,降低模块间的耦合性,提高模块的复用性。
- 利用分层和分割的方式将软件分割为若干个低耦合的独立的组件模块,这些组件模块以消息传递及依赖调用的方式聚合成一个完整的系统。
- 在大型网站中,这些模块通过分布式部署的方式,独立的模块部署在独立的服务器(集群)上,从物理上分离模块之间的耦合关系,进一步降低耦合性提高复用性。
- 模块分布式部署以后具体聚合方式主要有分布式消息队列和分布式服务。
利用分布式消息队列降低系统耦合性
- 事件驱动架构EDA(Event Driven Architecture):通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作。
- 最常用的是分布式消息队列,利用发布-订阅模式工作。
利用分布式服务打造可复用的业务平台
- 分布式服务通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务调用。
- 巨无霸应用系统解决方案就是拆分,将模块独立部署,降低系统耦合性。拆分可以分为纵向拆分和横向拆分两种。
- 纵向拆分:将一个大应用拆分为多个小应用,如果新增业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统。
- 横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务,不需要依赖具体的模块代码,即可快速搭建一个应用系统,而模块内业务逻辑变化的时候,只要接口保持一致就不会影响业务程序和其他模块。
- Facebook利用Thrift(一个开源的远程服务调用框架)管理其分布式服务,服务的注册、发现及调用都通过Thrift完成,但对于一个大型网站可以使用的分布式服务框架,仅有Thrift还远远不够,遗憾的是,Facebook没有开源其基于Thrift的分布式服务框架。
- 目前国内有较多成功实施案例的开源分布式服务框架是阿里巴巴的Dubbo。
- 对应用最少侵入:分布式服务框架需要支持即使用了