什么是高可用
简单来讲就是我们系统如何提高对外的服务时间,想要系统达到 100% 可用基本是不太可能的,也内有一个专门的衡量标准 SLA (全称:Service Level Agreement),也就是有几个 9 的高可用性:
如何提高
想要提高系统的可用性,我们需要整合多种手段来保证,当然在使用各种手段之前,作为研发人员我们首先是要保证自己代码的高质量,这是一切的前提,如果不能保证代码的质量,再多高可用的手段都是徒劳;下面具体看看都有哪些常用手段;
负载均衡
高可用很重要的一个手段就是避免单点,为啥要避免单点,因为每台机器都会有出问题的概率,当某一台机器出现问题,其他机器节点同样可以提供相同的服务,来保证系统的可用性;从整个系统来看,每一层都需要避免单点,从系统的接入层到服务层到最后的数据层都避免单点的情况下才能保证整个系统的高可用;这时候负载均衡器就起了至关重要的功能,一个负载均衡器包含如下一些核心功能:
负载均衡器一方面避免了单点的出现,另一方面多个节点共同提供服务,提供整个系统的能力;每一层都有各自的负载均衡器:
隔离
隔离在为了系统在发生异常时,能将此异常限定在一定范围之内,不会产生蝴蝶效应,导致整个系统不可用;隔离的手段有很多比如线程隔离、进程隔离、集群隔离、机房隔离等等,这里重点看一下离开发人员更近的线程隔离;
看一个最常见的场景,在微服务架构下,某一条调用链中的某一个服务出现问题,导致线程阻塞,然后阻塞越积越多,占满所有的 io 线程,最终当前服务无法接受数据,直至奔溃;这时候线程隔离就起作用了,可以将 io 线程和业务线程分开,这样业务线程出现问题不至于影响到 io 线程;
一些框架提供了自己的线程模型,比如 Dubbo 的 Dispatcher 调度器可以配置消息的处理线程,包含了多种处理方式:
当然可以使用第三方工具来实现隔离,比如 Sentinel、Hystrix;提供了线程池隔离、信号量隔离;
限流
我们每个系统其实都有一个处理峰值,当接近峰值继续接受请求的时候,会导致整个系统响应缓慢;为了保护系统,需要拒绝处理过载的请求,这时候就需要用到限流 ;常见的限流算法:
一般我们做限流可以在接入层限流,也可以在业务层做限流,下面简单看一下都有哪些限流工具:
降级
当我们的系统出现访问量大增,比如遇到大促的情况,如果出现系统资源不够用的情况下,可以优先把资源给核心功能,对非核心功能可以做降级处理,保证核心功能的可用性,这是一种有损的手段;常见的降级手段:
超时重试
为什么要设置超时时间,因为如果不设置超时时间,可能因为某个请求无法即时响应导致整个链路处于长时间等待状态,这种请求如果过多,直接导致整个系统瘫痪,抛出超时异常其实也是及时止损;系统的每一层几乎都可以设置超时时间比如:数据库超时、缓存超时、RPC 超时、网关超时、Web 超时、Httpclient 超时等;所以对于开发人员来说超时时间的设置至关重要;
重试往往伴随着超时一起出现,因为超时可能是因为某些特殊原因导致暂时性的请求失败,也就是说重试是有可能出现请求再次成功的;限制一定的重试次数 (常见设置为 2 次),也是很有必要的;
其他
除了以上几种开发人员比较关注的高可用手段,还有一些其他的手段:
总结
以上介绍了要想实现一个高可用系统的各种手段,但不是说我们实现一个高可用的系统,就要把上面的手段一股脑的实现一遍;需要根据不同的系统类型、处在何种阶段、以及不同的系统模块等进行对应的取舍。