Reference:https://time.geekbang.org/column/article/40744前端
系统的⾼可⽤建设,它实际上是⼀个系统⼯程,须要考虑到系统建设的各个阶段,也就是说它其实贯穿了系统建设的整个⽣命周期,以下图所⽰:服务器
具体来讲,系统的⾼可⽤建设涉及架构阶段、编码阶段、测试阶段、发布阶段、运⾏阶段,以及故障发⽣时。
1. 架构阶段:架构阶段主要考虑系统的可扩展性和容错性,要避免系统出现单点问题。例如多机房单元化部署,即便某个城市的某个机房出现总体故障,仍然不会影响总体⽹站的运转。
2. 编码阶段:编码最重要的是保证代码的健壮性,例如涉及远程调⽤问题时,要设置合理的超时退出机制,防⽌被其余系统拖垮,也要对调⽤的返回结果集有预期,防⽌返回的结果超出程序处理范围,最多见的作法就是对错误异常进⾏捕获,对⽆法预料的错误要有默认处理结果。
3. 测试阶段:测试主要是保证测试⽤例的覆盖度,保证最坏状况发⽣时,咱们也有相应的处理流程。
4. 发布阶段:发布时也有⼀些地⽅须要注意,由于发布时最容易出现错误,所以要有紧急的回滚机制。
5. 运⾏阶段:运⾏时是系统的常态,系统⼤部分时间都会处于运⾏态,运⾏态最重要的是对系统的监控要准确及时,发现问题可以准确报警而且报警数据要准确详细,以便于排查问题。
6. 故障发⽣:故障发⽣时⾸先最重要的就是及时⽌损,例如因为程序问题致使商品价格错误,那就要及时下架商品或者关闭购买连接,防⽌形成重⼤资产损失。而后就是要可以及时恢复服务,并定位缘由解决问题。架构
所谓“降级”,就是当系统的容量达到⼀定程度时,限制或者关闭系统的某些⾮核⼼功能,从⽽把有限的资源保留给更核⼼的业务。它是⼀个有⽬的、有计划的执⾏过程,因此对降级⼀般须要有⼀套预案来配合执⾏。若是咱们把它系统化,就能够经过预案系统和开关系统来实现降级。并发
降级的核⼼⽬标是牺牲次要的功能和⽤户体验来保证核⼼业务流程的稳定,是⼀个不得已⽽为之的举措。测试
若是说降级是牺牲了⼀部分次要的功能和⽤户的体验效果,那么限流就是更极端的⼀种保护措施了。限流就是当系统容量达到瓶颈时,须要经过限制⼀部分流量来保护系统,并作到既能够⼈⼯执⾏开关,也⽀持⾃动化保护的措施。编码
在限流的实现⼿段上来说,基于QPS和线程数的限流应⽤最多,最⼤QPS很容易经过压测提早获取,例如咱们的系统最⾼⽀持1w QPS时,能够设置8000来进⾏限流保护。线程数限流在客户端⽐较有效,例如在远程调⽤时咱们设置链接池的线程数,超出这个并发线程请求,就将线程进⾏排队或者直接超时丢弃。spa
若是限流还不能解决问题,最后⼀招就是直接拒绝服务了。
当系统负载达到⼀定阈值时,例如CPU使⽤率达到90%或者系统load值达到2*CPU核数时,系统直接拒绝全部请求,这种⽅式是最暴⼒但也最有效的系统保护⽅式。例如秒杀系统,咱们在以下⼏个环节设计过载保护:线程
拒绝服务能够说是⼀种不得已的兜底⽅案,⽤以防⽌最坏状况发⽣,防⽌因把服务器压跨⽽长时间完全⽆法提供服务。像这种系统过载保护虽然在过载时⽆法提供服务,可是系统仍然能够运做,当负载降低时又很容易恢复,因此每一个系统和每一个环节都应该设置这个兜底⽅案,对系统作最坏状况下的保护。设计