数据密集型系统-系统思考

369 阅读2分钟

如何保证系统的可靠性

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

  2. 想办法分离最容易出错的地方

  3. 充分的测试

  4. 当出现人为失误, 提供快速的恢复机制

  5. 设置详细而清晰的监控子系统

系统负载的定义

负载根据系统体系结构的不同, 关注点也不太一样

有的系统更关注每秒请求处理数, 而有的关注数据库的写入比例, 而对于微博类似系统来说, 系统难点在于那些大V的fan-out数.

每个关注者的分布情况是可拓展的关键负载参数

在批处理系统如hadoop中, 我们通常关心吞吐量, 而在线系统通常更看重服务的响应时间.

即使所有请求都相同, 也会由于其他变量因素而引入一些随机延迟抖动, 这个因素包括上下文切换和进程调度、网络数据包丢失和TCP重传、垃圾回收暂停、缺页中断和磁盘IO等.

所以我们统计一个系统服务性能时, 并不能从单次反映出系统性能. 平均值也并不是合适的指标, 因为它无法真实的反馈出用户实际的等待时间。

通常我们使用百分位数来反应系统的性能, 通常我们说的 p99、p999就分别表示99%的请求时间和百分之99.9%的时间是小于对应的时间.

通常如果目标服务处于快速增长期, 我们应该认真考虑每增加一个数量级的负载, 架构应如何设计.

软件系统设计三原则

  1. 可运维性 方便运营团队保持系统平稳运行

  2. 简单性

    简化系统的复杂度

  3. 可演化性 项目知识设计理念传承, 能够让新工程师轻松应对系统变化.

我们都知道降低复杂度可以提高软件的可维护性, 因为简单性系统是我们关键目标之一.

降低这种复杂度的最好办法就是抽象设计

一个应用必须完成预期的多种需求, 包括:

  1. 功能性需求

应用的业务行为

  1. 非功能性需求

安全性、可靠性、合规性、可伸缩性、兼容性和可维护性