Appearance
可靠性
即使发生了某些错误,系统仍可以继续工作
系统不可靠的原因
- 硬件错误
- 软件错误
- 人为失误
如何保证系统可靠性
- 以最小出错的方式设计系统
静心设计的抽象层,API, 以及管理界面, 使 “做正确的事情” 很容易,但是搞破坏很复杂
- 充分的测试,包括单元测试、集成测试和系统测试
- 支持快速恢复,可恢复,可灰度
- 详细且清晰的监控子系统
- 良好的管理流程、规范
可扩展性
如果系统以某种方式增长,我们应对增长的措施有哪些
描述负载
- web 服务器的 QPS/TPS
- 数据库的写入比例
- 聊天室同时活跃的用户数量
- 缓存命中率
描述性能
主要用百分位数
- 吞吐量
- TPS
- 响应时间
队头阻塞
队头阻塞是指在一个队列中,前面的请求没有被处理完,后面的请求就无法被处理的现象,后续请求的响应时长增加
长尾效应
一次完整的服务, 包含了多次请求调用,用户需要等待最慢的那个请求完成,才能得到最终的结果
应对方案
- 垂直扩展,升级更强大的机器
- 水平扩展,增加更多的机器,在多台机器上分配负载
可维护性
软件系统的成本
- 开发成本
- 维护与缺陷修复
- 监控系统
- 故障排查
- 适配新平台
- 搭配新场景
- 技术缺陷的完善
- 增加新功能
三个设计原则
- 可运维性
- 简单性
- 可演化性
可运维性
太多了,看书吧
简化复杂度
系统复杂性
- 状态空间膨胀
- 木块紧耦合
- 复杂的依赖关系
- 不一致的命名和术语
- 为了性能而采取的特殊处理
- 为了解决特定问题而引入的特殊框架
复杂系统的问题
- 维护困难
- 变更引入潜在错误的风险增大
- 开发人员难以准确理解、评估或者更加容易忽略相关系统行为
消除意外复杂性最好的手段是抽象
- 隐藏实现细节
- 提供干净易懂的接口
- 提高复用率
可演化性
可以轻松地修改数据系统,使其使用不断变化的需求,这和简单性和抽象性密切相关。简单易懂的系统往往比复杂的系统更容易修改