架构设计的目的
在一个有约束的条件中去寻求最优解,约束条件包括:团队规模、经验、技术水平、成本、资源、业务所处阶段、用户量等
设计参考维度
性能
扩展性
可用性
安全性
成本
注:不同的公司、不同的客户群、不同的业务需求对各个维度的要求各不相同,所以并不是系统做的越复杂越好,适合才最重要。
大型互联网公司设计注意事项
性能
主从
集群
异步
动静分离
缓存
扩展性
架构应能水平扩展 - 水平扩展可以有效避免瓶颈问题
无状态设计 - 服务无状态可以水平扩容
高可用
N+1设计 - 系统中的每个组件都应该做到没有单点故障
回滚设计 - 确保系统可以向前兼容,在系统升级时应有办法回滚版本
禁用设计 - 应该提供控制具体功能是否可用的配置,在系统出现故障时能够快速下线功能
监控设计 - 在设计阶段就应该考虑监控的手段
多活数据中心设计 - 若系统需要极高的高可用,应考虑异地多活数据中心
采用成熟的技术 - 新发布的版本或是新开源的框架可能隐藏bug
资源隔离设计 - 应该避免单一业务占用全部资源
使用商用硬件 - 有效降低硬件故障率
快速迭代 - 功能细分,持续交付
链路追踪 - 快速定位问题
灰度设计 - 灰度设计
成本
非核心购买 - 如果非核心功能需要占据大量开发资源,可采用购买
安全性
网络层
防火墙
内外网
安全传输https
软件层
身份认证
加签验签
黑白名单
风控体系
注意:各个维度都可以从软硬件两个方面进行分析,这里主要分析软件设计方面
三、架构设计原则 – 《架构真经》
对于任务和原则应遵循smart规则
S – 原则和任务必须具体
M – 可度量
A – 可实现
R – 可达成
T – 可验证
N+1设计
开发的系统在发生故障时,至少有一个冗余的实例
对于服务来说 – 集群部署
对于网络机房来说 – 灾备
对于数据库来说 – 多库
回滚设计
确保系统可以向后兼容
禁用设计
可以关闭任何发布的功能,特别是与其他系统进行通信时
监控设计
多活数据中心设计
异地多活,读写分离
故障隔离
避免单一业务占用全部资源,避免业务之间相互影响,机房隔离避免单点故障
水平扩展
通过部署机械可解决
快速迭代
- 异步设计
无状态设计
有状态:数据存储或更改
无状态:只是一次操作,不能保存数据
有状态服务:服务端保存请求的相关信息,每个请求默认可以使用之间的请求
无状态服务:服务端不用保存任何请求信息
有状态对象:非线程安全
无状态对象:线程安全
四、系统设计六个原则
单一职责原则
一个类或一个接口只干一件事,只有一个原因引起这个类的改变
开闭原则
对扩展开放,对修改关闭
里式替换原则
在使用基类的地方可以任意使用其子类,能保证子类完美替代基类
迪米特法则**-**最小知识原则
一个软件实体应当尽可能少地与其他实体发生相互作用,中介者或外观模式
接口隔离原则
客户端不应该依赖那些他不需要的接口,接口中的方法尽量少。
依赖倒置原则
高层模块不应该依赖底层模块,抽象不依赖细节,细节应该依赖抽象,面向接口编程