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

概述

现在很多新型应用都属于数据密集型,而非计算密集型。对于这类应用第一限制因素不是CPU处理能力,而是数据量、数据的复杂度以及快速变化性。

摆在人们面前的是可靠性、可扩展、可维护三座大山,只有保证这些因素,才能扬帆起航。

应用系统一般包含以下模块:

  • 数据库:存储数据,用于应用再次访问。
  • 高速缓存:缓存那些复杂或操作代价昂贵的结果,以加快下一次访问·
  • 索引:用户可以按关键字搜索数据并支持各种过滤。
  • 流式处理:持续发送消息至另一个进程,处理采用异步方式。
  • 批处理:定期处理大量的累积数据·

可靠性

概念:即使发生某些错误,系统仍然能继续运行。

可能出错的事情称为错误(faults)或故障,系统可应对错误则称为 容错(fault-tolerant) 或者 弹性(resilient) 。

所谓容错机制即在不可靠组件基础上构建可靠性系统的相关技术或措施,用以避免从故障引发系统失效。

常见的故障有:

  • 硬件故障

    • 场景:硬盘崩溃、异常掉电、网络中断
    • 应对:冗余处理,磁盘配置RAID(磁盘阵列,Redundant Arrays of Independent Disks,RAID),数据中心备用电源
  • 软件故障

    • 场景:共享资源访问错误、级联故障、内存泄漏
    • 应对:看门狗进行重新拉起服务进程、异常进程隔离、测试覆盖验证
  • 人为因素

    • 场景:操作不当、配置参数错误、先后顺序不当
    • 应对:UI界面限制一些异常操作、提供快速的故障恢复机制、设置操作权限

可扩展性

概念:描述系统应对负载增加能力的术语。

负载参数:每秒请求处理次数、数据库写入占比、缓存命中率等

负载增加,性能指标变化:

  1. 系统资源不变,性能如何变化
  2. 要增加多少系统资源,才能保证性能与原先保持一致

应对负载增加的措施

  • 垂直扩展(增强机器性能)和水平扩展(负载均摊到其他机器),水平扩展较优
  • 自动检测负载机制,动态调节资源数量

可维护性

软件开发初期,就需要注重可维护性,不管是开发人员代码的可读性、简洁性,还是产品运维的简单、易操作等特性。

软件系统三个设计原则:

  • 可运维性
    • 方便运营团队来保持系统平稳运行。
  • 简单性
    • 简化系统复杂性,使新工程师能够轻松理解系统。
  • 可演化性
    • 后续工程师能够轻松地对系统进行改进,并根据需求变化将其适配到非典型场景,也称为可延伸性、易修改性或可塑性。