高并发系统设计三大目标:
- 高性能
- 高可用
- 易扩展
高性能
性能优化要以问题为导向,在合适的度量指标的参考下,持续地做性能优化。
常用的性能度量指标就是响应时间,相比平均响应时间和最大响应时间,分位响应时间是更合理的选择。90分位响应时间表示百分之90的请求在这个响应时间之内。
一般的,一个优秀系统的响应时间的99分位值应当控制在200ms以内,99.99%的响应时间应当在1s以内。
性能优化思路:
- 提高系统的处理核心数:最简单直接的方式,但是不能无限制地增加,随着并发进程数的增加,并行的任务对于系统资源的争抢也会愈发严重,在某一个临界点上继续增加并发进程数,反而会造成系统性能的下降,这就是性能测试中的拐点模型
- 降低单次处理的响应时间:具体需要看你的系统是CPU密集型还是IO密集型。CPU密集型,使用更高效的算法、减少运算次数等。IO密集型:常见的数据库系统、缓存系统、Web系统等都是IO密集型。
高可用
高可用指的是系统具备较高的无故障运行的能力。
可用性度量
如何度量可用性?
- MTBF(Mean Time Between Failure),平均故障间隔,也就是系统正常运转的平均时间
- MTTR(Mean Time To Repair),平均恢复时间,也就是平均故障时间
我们定义:
可用性 = MTBF / (MTBF + MTTR)
一般的,我们用几个九来描述可用性,比如,一个九指90%,两个九指99%,三个九指99.9%,四个九指99.99%,五个九指99.999%,…
一个九和两个九,人工运维基本就能达到。
三个九和四个九,需要建立完善的运维值班体系和故障处理流程。
五个九就要靠系统的容灾和自动恢复能力了。
一般的,核心业务系统的可用性应该达到四个九,非核心业务系统的可用性可以放宽到三个九。
故障转移(failover)
对等节点failover比较简单,某一个节点故障,随机选择其他节点就可以了。
主备节点failover比较复杂,需要做故障检测。一般通过心跳检测来做故障检测。主节点故障时触发选主操作,选主的结果需要在备份节点间达成一致,涉及分布式一致性算法。
超时控制
出现大面积延迟时,大量系统资源被占用,导致系统整体崩掉。超时控制就是要避免出现这种问题,当请求处理超过一定时间时,直接让请求失败,释放资源给其他请求。
超时控制的关键是超时时间的设定,超时时间过大或过小都不行,这个需要依据历史日志或经验来确定一个相对合理的超时时间,并根据实际情况做出调整。
降级
降级是为了保证核心服务的稳定而牺牲非核心服务的做法。
限流
限流通过对并发的请求进行限速来保护系统。
灰度发布
故障演练
故障演练指的是对系统进行一些破坏性的手段,观察在出现局部故障时,整体的系统表现是怎样的。
易扩展
为什么不容易实现易扩展呢?因为扩展并不仅仅是业务服务器的扩展,还涉及到数据库、缓存、第三方服务等上下游全链路的各种服务。