高可用之降级、限流、拒绝服务

Reference:https://time.geekbang.org/column/article/40744

 

高可用建设

系统的⾼可⽤建设,它其实是⼀个系统⼯程,需要考虑到系统建设的各个阶段,也就是说它其实贯穿了系统建设的整个⽣命周期,如下图所⽰:

具体来说,系统的⾼可⽤建设涉及架构阶段、编码阶段、测试阶段、发布阶段、运⾏阶段,以及故障发⽣时。
1. 架构阶段:架构阶段主要考虑系统的可扩展性和容错性,要避免系统出现单点问题。例如多机房单元化部署,即使某个城市的某个机房出现整体故障,仍然不会影响整体⽹站的运转。
2. 编码阶段:编码最重要的是保证代码的健壮性,例如涉及远程调⽤问题时,要设置合理的超时退出机制,防⽌被其他系统拖垮,也要对调⽤的返回结果集有预期,防⽌返回的结果超出程序处理范围,最常见的做法就是对错误异常进⾏捕获,对⽆法预料的错误要有默认处理结果。
3. 测试阶段:测试主要是保证测试⽤例的覆盖度,保证最坏情况发⽣时,我们也有相应的处理流程。
4. 发布阶段:发布时也有⼀些地⽅需要注意,因为发布时最容易出现错误,因此要有紧急的回滚机制。
5. 运⾏阶段:运⾏时是系统的常态,系统⼤部分时间都会处于运⾏态,运⾏态最重要的是对系统的监控要准确及时,发现问题能够准确报警并且报警数据要准确详细,以便于排查问题。
6. 故障发⽣:故障发⽣时⾸先最重要的就是及时⽌损,例如由于程序问题导致商品价格错误,那就要及时下架商品或者关闭购买链接,防⽌造成重⼤资产损失。然后就是要能够及时恢复服务,并定位原因解决问题。

 

降级

所谓“降级”,就是当系统的容量达到⼀定程度时,限制或者关闭系统的某些⾮核⼼功能,从⽽把有限的资源保留给更核⼼的业务。它是⼀个有⽬的、有计划的执⾏过程,所以对降级⼀般需要有⼀套预案来配合执⾏。如果我们把它系统化,就可以通过预案系统和开关系统来实现降级。

降级的核⼼⽬标是牺牲次要的功能和⽤户体验来保证核⼼业务流程的稳定,是⼀个不得已⽽为之的举措。

 

限流

如果说降级是牺牲了⼀部分次要的功能和⽤户的体验效果,那么限流就是更极端的⼀种保护措施了。限流就是当系统容量达到瓶颈时,需要通过限制⼀部分流量来保护系统,并做到既可以⼈⼯执⾏开关,也⽀持⾃动化保护的措施。

在限流的实现⼿段上来讲,基于QPS和线程数的限流应⽤最多,最⼤QPS很容易通过压测提前获取,例如我们的系统最⾼⽀持1w QPS时,可以设置8000来进⾏限流保护。线程数限流在客户端⽐较有效,例如在远程调⽤时我们设置连接池的线程数,超出这个并发线程请求,就将线程进⾏排队或者直接超时丢弃。

 

拒绝服务

如果限流还不能解决问题,最后⼀招就是直接拒绝服务了。
当系统负载达到⼀定阈值时,例如CPU使⽤率达到90%或者系统load值达到2*CPU核数时,系统直接拒绝所有请求,这种⽅式是最暴⼒但也最有效的系统保护⽅式。例如秒杀系统,我们在如下⼏个环节设计过载保护:

  • 在最前端的Nginx上设置过载保护,当机器负载达到某个值时直接拒绝HTTP请求并返回503错误码,在Java层同样也可以设计过载保护。

拒绝服务可以说是⼀种不得已的兜底⽅案,⽤以防⽌最坏情况发⽣,防⽌因把服务器压跨⽽长时间彻底⽆法提供服务。像这种系统过载保护虽然在过载时⽆法提供服务,但是系统仍然可以运作,当负载下降时又很容易恢复,所以每个系统和每个环节都应该设置这个兜底⽅案,对系统做最坏情况下的保护。

 

posted @ 2019-10-08 11:09  李白与酒  阅读(595)  评论(0编辑  收藏  举报