1. 应用系统的三个问题
可靠性:出现意外情况下,系统能继续运转,性能可允许降低,但功能必须正确
可扩展性:随规模增长(如数据量、流量、复杂性),系统能以合理的方式匹配这种增长
可维护性:随时间推移,不同的开发运维的参与维护新场景,系统都应高效运转
2. 错误(故障)、失效与可靠性
错误(fault):系统内组件偏离正常的规格,包含:
- 硬件故障
- 软件错误
- 人为失误
失效(failure):系统作为整体而停止
因此系统应对错误的能力叫做容错能力(fault-tolerant)/弹性(resilient)。
而保证系统可靠,可结合下列实践:
- 以最小出错方式设计系统
- 分离容易出错的地方/接口
- 充分的测试
- 提供快速恢复机制(如回滚)
- 设置良好的监控系统
- 推行规范的管理流程与培训
3. 可扩展性
可扩展性:描述系统应对负载增加的能力
3.1. 描述负载
可用负载参数的若干数字描述,如:
- 每秒请求处理次数
- 数据库写入的比例
- 活动用户数
- 缓存命中率
有时候要看平均值,有时候要看峰值。
3.2. 描述性能
通常有2个最常见的指标:
-
吞吐量(每秒可处理的记录条数)
-
响应时间(客户端发送请求到收到响应的时间)
而延迟是请求花费在处理上的时间,和响应时间不同
通常这些指标可以看平均数,但是最好使用百分位数,有:
- p50,即中位数
- p95,即95百分位数
- p99,即99百分位数
- p999,即99.9百分位数
这些参数可用于描述、定义服务质量目标(SLA)
3.3. 应对方法
一般而言,针对特定级别的负载而设计的架构不太可能应付超过目标10倍的负载。(即通常要重构了)
通常要在垂直扩展和水平扩展作取舍:
- 垂直扩展:增强单点的性能
- 水平扩展:将架构分布到更多的机器上
而一般,扩展能力好的架构通常会做出假设(如操作类型等),然后针对进行优化设计。
4. 可维护性
通常包含三个设计原则:
- 可维护性:方便运营团队来保持系统稳定运行
- 简单性:简化系统复杂性,让后面的开发者快速理解系统
- 可演化性:后续开发者能轻松地对系统进行改进,并适配新需求