下一篇(ch.3)

第一章 可靠、可扩展、可维护的应用系统

  • 可靠性:容忍硬件、软件失效,人为错误,版本可回滚,功能可开关,可监控性;
  • 可扩展性
    • 负载与性能
    • 延迟百分位数
    • 吞吐量
  • 可维护性
    • 可运维
    • 简单性
    • 可演化性

应用系统通常包括:

  • 数据库:用于存储数据,持久化需要的信息;
  • 高速缓存:缓存 单次操作代价昂贵 的数据结果,下次访问可直接获取数据;
  • 索引:支持用户通过关键字搜索数据,提供多种过滤方式;
  • 流式处理:持续 发送消息到另一个进程,异步处理;
  • 批处理:定期处理大量积累的数据;

设计数据服务时,常见的问题:

  1. 系统内出现局部失效时,如何确保数据的正确性与完整性?
  2. 当发生系统降级(degrade)时,该如何为客户提供一致的良好表现?
  3. 负载增加时,系统如何扩展?
  4. 如何设计友好的服务API?

可靠性

  • 容错:指系统可容忍特定类型的故障。

注:故障 != 失效(failure)

  • 故障:组件出现差错,导致个别组件偏离正常运行方向;
  • 失效:整体服务不可用。故障不可能被杜绝(如网络故障),通常设计容错机制以避免故障导致失效。换句话说,使用不可靠的组件,通过容错机制实现服务/系统的可靠性;

容错机制测试:Chaos Monkey 测试服务的容错机制是否完善。

软件故障

  难以预料,不像硬件故障可以很容易发现,一方面节点间通过软件相联系,需要进行排查,另一方面软件故障可能需要特定的触发条件,即存在边界情况导致故障;如:

  • 应用程序共享CPU、内存、磁盘或网络IO时,当程序异常运行,共享资源会被占满,导致系统故障;
  • 依赖某些服务时,当服务速度变慢、无响应或返回异常,可能导致系统故障;
  • 级联故障,如同多米诺骨牌般发生;

  一般的检查方法,发现错误后自动告警:

  • 自动告警发现错误。
  • 允许进程崩溃并自动重启,监控并分析生产环境行为。
  • 检查系统行为是否符合预期(如检查消息队列的消息未丢失或重复消费)。

可扩展性

  • 定义:系统应对负载增加的能力。

系统性能问题

  • 考虑:
    • 负载增加时,系统资源(CPU、内存、带宽等)保持不变,系统性能如何变化?
    • 若要保持性能不变,需要增加多少资源?

延迟与响应时间

  • 延迟:请求在处理上花费的时间。
  • 响应时间:客户端发出请求后得到响应的间隔时长(包括延迟 + 网络延迟 + 信息往返的时长)。
  • 使用百分位数说明请求性能,选择中位数(p50,50百分位数)表示50%的请求响应时间大于该值。

可维护性

  • 软件系统设计三原则
    • 可运维性
    • 简单性
    • 可演化性

可运维性

  • 监控系统健康,快速恢复服务当出现异常状态。
  • 追踪定位问题,如系统故障或性能下降。