1 核心概念,单一服务器到更强的服务器
垂直伸缩
- 通过使用RAID增加I/O吞吐能力
- 通过切换SSD改善I/O访问速度
- 通过增加内存减少I/O操作(意味着文件系统有更多的缓存空间,应用程序有更多的工作内存)
- 通过升级/增加网络接口提高网络吞吐能力
- 更新服务器获得更多处理器或者更多虚拟核
- 主要制约:成本,当越过某个点后,垂直伸缩会变得格外昂贵;CPU速度;每台服务器的虚拟核数目;硬盘速度。
服务分离
- 不同的物理机上安装不同的服务类型,比如FTP,DNS,缓存,等。
- 功能分割:将整个Web应用切分成一组不同的功能模块,将他们独立部署。
内容分发网络(CDN)
CDN 缓存静态文件。用户将从最近的CDN服务器获取静态内容,进而加速页面加载时间。
分散访问流量:水平伸缩
通过增加服务器提升计算能力。
服务全球用户的伸缩性架构。
- 使用GeoDNS服务:基于客户地理位置进行ip地址解析的DNS服务。用户会访问到离他最近的一个Web服务器,将网络延迟减到最小。
- 边缘缓存(edge-cache)服务器:边缘缓存是一种距离用户较劲的HTTP缓存服务器,便于部分缓存用户的HTTP流量。
分层架构
- 将不同功能划分到不同层次的架构。
- 低层的组件暴露一组API给高层组件调用。
- 每一层都消费其低层提供的服务,但是低层永远不会消费上层提供的服务。
- 分层可以强制结构化并减少耦合,低层组件变得更简单和系统。越底层稳定性越强。
支持技术
- Web周边,通常用一些第三方软件技术实现,比如消息队列,应用缓存,主数据存储,搜索引擎等。
- 这些应该是一种即插即用的扩展组件,保证在组件进行更换时,整个架构不受影响。
2 软件设计原则
简单
简化从以下四个基本步骤进行
隐藏复杂与构建抽象
- 系统很庞大时是无法保持整体简单的,能做的只是保持局部简单。
- 达到局部简单,最主要的方式是确保任何单个的类/模块/应用的设计目标及工作原理都能被快速理解。
- 好的设计原则是类之间的依赖关系尽量少。
- 在庞大复杂的系统中,当创建一个独立的服务时,需要添加一个抽象层,所有的功能层都在这些抽象层基础上去实现,从而隐藏功能层的复杂性。
避免过度设计
- 好的设计方法是可以在后期逐渐添加新的功能和特性,而不是一开始就开发一个超级大的系统。
- 早期构建一个合理的抽象层次,然后迭代的增加新特性。
尝试测试驱动开发(TDD)
- 先写测试代码,然后写功能实现代码。
- 有助于工程师可以更好地把握工作重点,从用户视角看待问题,使开发的接口更简单清晰。
从软件设计的简化范例中学习
低耦合
- 低耦合可以保证复杂性局部化。
- 来更高层面上进行结构,意味着将系统分成多个应用,每个应用都只关注相对较小的一部分功能。这样每个应用就可以按需分别伸缩。
- 促进低耦合:要在较高的抽象层面降低耦合度,需要让系统不同的部分接触面尽量少。
- 避免不必要的耦合:一般来说,画系统架构设计图很容易暴露循环依赖,所以在设计阶段一定要画架构图。一个良好设计的模块儿叫扣图,看起来像一棵树,而不像一个社交网络图。
- 低耦合范式:一个很好的低耦合设计例子是UNIX命令行编程及管道pipe用法。
不用重复自己
基于约定编程。
画架构图
- 用例图:不考虑技术方案,仅仅关注业务需求,可以将功能特性和业务需求提炼出来。
- 类图:展现独立模块的结构。一个典型的类图包含接口,类,关键方法名,以及他们的关系。依赖可以用一条线来表示,所以从类图上可以很容易的看出耦合关系。
- 模块图&