Skip to content

可靠性

即使发生了某些错误,系统仍可以继续工作

系统不可靠的原因

  1. 硬件错误
  2. 软件错误
  3. 人为失误

如何保证系统可靠性

  1. 以最小出错的方式设计系统

静心设计的抽象层,API, 以及管理界面, 使 “做正确的事情” 很容易,但是搞破坏很复杂

  1. 充分的测试,包括单元测试、集成测试和系统测试
  2. 支持快速恢复,可恢复,可灰度
  3. 详细且清晰的监控子系统
  4. 良好的管理流程、规范

可扩展性

如果系统以某种方式增长,我们应对增长的措施有哪些

描述负载

  1. web 服务器的 QPS/TPS
  2. 数据库的写入比例
  3. 聊天室同时活跃的用户数量
  4. 缓存命中率

描述性能

主要用百分位数

  1. 吞吐量
  2. TPS
  3. 响应时间

队头阻塞

队头阻塞是指在一个队列中,前面的请求没有被处理完,后面的请求就无法被处理的现象,后续请求的响应时长增加

长尾效应

一次完整的服务, 包含了多次请求调用,用户需要等待最慢的那个请求完成,才能得到最终的结果

应对方案

  1. 垂直扩展,升级更强大的机器
  2. 水平扩展,增加更多的机器,在多台机器上分配负载

可维护性

软件系统的成本

  1. 开发成本
  2. 维护与缺陷修复
  3. 监控系统
  4. 故障排查
  5. 适配新平台
  6. 搭配新场景
  7. 技术缺陷的完善
  8. 增加新功能

三个设计原则

  1. 可运维性
  2. 简单性
  3. 可演化性

可运维性

太多了,看书吧

简化复杂度

系统复杂性

  1. 状态空间膨胀
  2. 木块紧耦合
  3. 复杂的依赖关系
  4. 不一致的命名和术语
  5. 为了性能而采取的特殊处理
  6. 为了解决特定问题而引入的特殊框架

复杂系统的问题

  1. 维护困难
  2. 变更引入潜在错误的风险增大
  3. 开发人员难以准确理解、评估或者更加容易忽略相关系统行为

消除意外复杂性最好的手段是抽象

  1. 隐藏实现细节
  2. 提供干净易懂的接口
  3. 提高复用率

可演化性

可以轻松地修改数据系统,使其使用不断变化的需求,这和简单性和抽象性密切相关。简单易懂的系统往往比复杂的系统更容易修改