什么是架构?
架构是系统的结构轮廓。引出问题:
- 系统都有哪些层?
- 每层的职责是什么?
- 层与层之间的关系是什么?
角色:架构师,设计师,开发者
架构师:
- 理解现有的技术和工具
- 为支撑业务寻找技术方案
- 提供一个中心视野
- 识别技术组合的优点和弱点
设计师:
- 某方面的技术专家
- 分析需求和代码
- 面向对象设计和非面向对象设计
- 设计模式
开发者:
- 熟悉技术和工具
- 开发语言
架构模式
tier是物理分层,layer是逻辑分层。
一个系统可以划分为很多tier。
- 单tier,远程桌面
- 两tier,客户端,数据库
- 三tier,web,应用,数据库
- 四tier,web,缓存,应用,数据库
Layer
- 按功能将应用程序分层,如逻辑上的组件
- 层数不限,不强制用多层,刻意多层只会降低效率
- Layer在tier里,每tier有一或多layer
如何分Layer
- 利用抽象,将通用的功能抽象出来,将需要改变的独立出来。
- 严格和松散分Layer层,松散的分层很难交换两个Layer,紧密耦合
设计Layer
- 耦合,紧耦合意味着改变一layer会影响到其依赖layer,反之则反之
- 内聚,高内聚意味着一个layer把一件事情做好。小而专注的layer容易被集成到复杂的组件中。低内聚则意味着一个layer做很多事情。
Google的Layer
- Sawzall 是用来处理数据的脚本语言
- MapReduce是一套简单的风格数据处理API
- BigTable提供灵活的分布式存储API
- GFS是一个分布式文件系统
Tier与Layer的映射关系
逻辑分层:
物理分层:
分布式系统的挑战
- 潜在因素,远程通信速度慢,序列化开销大
- 局部故障,远程组件可能随时出现故障,必须能优雅地恢复
- 并发,高效地处理多个连接,异步调用
通信方式
- 同步,Remoting,WebService
- 异步,MSMQ,同步并发
- 协议,TCP,HTTP
- 序列化格式,XML(可互操作,速度慢),二进制(不可互操作,速度快)
扩展性
- 灵活性架构,如果负载(包括web请求,数据量,大量计算)增加,可迅速加入新的资源(硬盘,CPU,内存,带宽)
- 设计挑战,架构模式,程序设计,成本,工期
稳定性
- 任何环节都可能出故障,软件,硬件,网络,数据中心
- 发现问题,容错,抢救,恢复
灵活性和重用性
- 软件需求改变
- 设计模式升级
- 可重用的开发(类,组件,服务)
- Layer的重用(抽象API,扩展性)
安全性
- 控制对服务的访问(身份认证,代码访问的安全)
- 保护信息(加密,读写权限)
性能
- 80、20原则,80%的时间解决20%的代码上,用工具发现瓶颈
- 好算法带来高性能
- IO瓶颈,网络瓶颈,CPU常常不是瓶颈