第一章 可靠、可扩展、可维护的应用系统
- 可靠性:容忍硬件、软件失效,人为错误,版本可回滚,功能可开关,可监控性;
- 可扩展性:
- 负载与性能
- 延迟百分位数
- 吞吐量
- 可维护性:
- 可运维
- 简单性
- 可演化性
应用系统通常包括:
- 数据库:用于存储数据,持久化需要的信息;
- 高速缓存:缓存 单次操作代价昂贵 的数据结果,下次访问可直接获取数据;
- 索引:支持用户通过关键字搜索数据,提供多种过滤方式;
- 流式处理:持续 发送消息到另一个进程,异步处理;
- 批处理:定期处理大量积累的数据;
设计数据服务时,常见的问题:
- 系统内出现局部失效时,如何确保数据的正确性与完整性?
- 当发生系统降级(degrade)时,该如何为客户提供一致的良好表现?
- 负载增加时,系统如何扩展?
- 如何设计友好的服务API?
可靠性
- 容错:指系统可容忍特定类型的故障。
注:故障 != 失效(failure)
- 故障:组件出现差错,导致个别组件偏离正常运行方向;
- 失效:整体服务不可用。故障不可能被杜绝(如网络故障),通常设计容错机制以避免故障导致失效。换句话说,使用不可靠的组件,通过容错机制实现服务/系统的可靠性;
容错机制测试:Chaos Monkey 测试服务的容错机制是否完善。
软件故障
难以预料,不像硬件故障可以很容易发现,一方面节点间通过软件相联系,需要进行排查,另一方面软件故障可能需要特定的触发条件,即存在边界情况导致故障;如:
- 应用程序共享CPU、内存、磁盘或网络IO时,当程序异常运行,共享资源会被占满,导致系统故障;
- 依赖某些服务时,当服务速度变慢、无响应或返回异常,可能导致系统故障;
- 级联故障,如同多米诺骨牌般发生;
一般的检查方法,发现错误后自动告警:
- 自动告警发现错误。
- 允许进程崩溃并自动重启,监控并分析生产环境行为。
- 检查系统行为是否符合预期(如检查消息队列的消息未丢失或重复消费)。
可扩展性
- 定义:系统应对负载增加的能力。
系统性能问题
- 考虑:
- 负载增加时,系统资源(CPU、内存、带宽等)保持不变,系统性能如何变化?
- 若要保持性能不变,需要增加多少资源?
延迟与响应时间
- 延迟:请求在处理上花费的时间。
- 响应时间:客户端发出请求后得到响应的间隔时长(包括延迟 + 网络延迟 + 信息往返的时长)。
- 使用百分位数说明请求性能,选择中位数(p50,50百分位数)表示50%的请求响应时间大于该值。
可维护性
- 软件系统设计三原则:
- 可运维性
- 简单性
- 可演化性
可运维性
- 监控系统健康,快速恢复服务当出现异常状态。
- 追踪定位问题,如系统故障或性能下降。