DDIA-可靠、可扩展与可维护的应用系统

Posted by keys961 on December 26, 2018

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. 可维护性

通常包含三个设计原则:

  • 可维护性:方便运营团队来保持系统稳定运行
  • 简单性:简化系统复杂性,让后面的开发者快速理解系统
  • 可演化性:后续开发者能轻松地对系统进行改进,并适配新需求