类别什么是应用服务雪崩雪崩效应几种场景缓存雪崩方案雪崩整体方案熔断器设计隔离设计超时机制设计如何及早发现雪崩什么是应用服务雪崩雪崩问题在分布式系统中存在这样的问题。由于网络的不稳定,任何服务的可用性都不是100%。当网络不稳定时,作为服务提供者,可能会被拖死,导致服务调用者阻塞,最终可能会引发雪崩链效应。缓存雪崩当缓存服务器重启或一定时间内大量缓存失效时,失效时也会对后端系统(如DB)造成很大压力,导致后端失效数据库并导致应用服务器的雪崩。雪崩效应导致的几种场景下的流量激增:例如流量异常,用户重试导致系统负载增加;缓存刷新:假设A是客户端,B是服务器端,假设A系统请求所有流量到B系统,请求超过B系统的承载能力会导致B系统崩溃;程序存在BUG:代码循环调用的逻辑问题、未释放资源导致的内存泄露等;数据库严重瓶颈,如:长事务、sql超时等。线程同步等待:系统之间常采用同步服务调用方式,核心服务和非核心服务共享一个线程池和消息队列。如果核心业务线程调用非核心线程,则将非核心线程交给第三方系统完成。当第三方系统本身出现问题时,核心线程被阻塞,一直处于等待状态,进程间的调用有超时限制。最终这个线程会断掉,也有可能引起雪崩;缓存雪崩的解决方法。缓存失效的几种情况:1、缓存服务器宕机。2、缓存在高峰期部分失效。为避免缓存集中失效,为不同的键设置不同的超时时间2.添加互斥锁,控制数据库请求,重建缓存。3.提高缓存HA,如:redis集群。Avalanche的整体方案总的来说,对于服务依赖的保护主要有三种方案:(1)熔断模式这种模式主要是对参考电路进行熔断。如果线路电压过高,保险丝会熔断以防止火灾。在我们的系统中,如果一个目标服务调用很慢,或者有大量的超时,这个时候,这个服务的调用就会中断。对于后续的调用请求,目标服务不会再被调用,资源会被快速释放。如果目标服务更好,则恢复呼叫。关键监控机器性能指标cpu(Load)cpuusage/loadmemorymysql监控长事务(这里和sql查询超时密切相关,需要监控)sql超时线程数等。简而言之,除了cpu,内存,threadnumber另外,重点监控数据库端的长事务,sql超时等,应用服务器出现的雪崩场景,大部分都是因为数据库端的性能瓶颈,首先导致大量的数据库端的瓶颈,最终拖垮应用服务器雪崩。大雪崩。(2)隔离模式这种模式就像把系统请求按类型划分成小岛一样。当一个小岛被烧毁时,不会影响到其他小岛。例如,线程池可用于为不同类型的请求隔离资源。每种类型的请求互不影响。如果某一类请求线程资源耗尽,后续该类请求将直接返回,不调用后续资源。这种模式用在很多场景,比如拆解一个服务,使用单独的服务器部署重要的服务,或者公司最近推广多中心。(3)限流模式上述熔断模式和隔离模式属于错误发生后的容错处理机制,而限流模式可以称为预防模式。限流方式主要是预先为每一类请求设置最高QPS阈值。如果高于设定的阈值,则直接返回请求,不再调用后续资源。这种模型不能解决服务依赖的问题,只能解决系统整体的资源分配问题,因为不限流的请求还是有可能造成雪崩效应。熔断器设计熔断器的设计主要参考了hystrix的做法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断告警(1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个桶,每1个桶一个第二个Bucket,每个bucket记录请求的成功、失败、超时、拒绝状态。默认误差超过50%,10秒内超过20个请求被中断拦截。(2)熔断恢复:对于熔断请求,每5s允许部分请求通过,如果请求都是健康的(RT<250ms),则恢复请求的健康。(3)熔断告警:记录熔断请求,如果异常请求超过一定的设置,则进行告警。隔离设计隔离方式一般采用两种(1)线程池隔离方式:使用线程池存储当前请求,线程池处理请求,设置任务返回处理超时时间,将请求累积到线程池队列中。该方法需要为每个依赖的服务申请一个线程池,消耗一定的资源。优点是可以应对突如其来的流量(当流量高峰来临时,如果处理不完,可以将数据存放在线程池队中,慢慢处理)(2)信号量隔离模式:使用原子计数器(或信号量)记录当前有多少个线程在运行,请求时先判断计数器的值,如果超过设置的最大线程数则丢弃不同类型的新请求。如果不超过,则对计数器+1执行计数操作请求,并请求返回计数器-1。该方式严格控制线程立即返回,无法应对突发流量(当流量高峰来临时,处理的线程数超过数量,其他请求直接返回,不再继续请求依赖服务)超时机制设计(1)超时有两种,一种是请求等待超时,一种是请求运行超时。(2)等待超时:任务入队时设置任务入队时间,判断队头任务入队时间是否大于超时时间,超过则丢弃该任务。(3)运行超时:可以直接使用线程池提供的get方法。如何提前发现雪崩,就是先防止系统发生雪崩,然后通过监控发现请求正在接近或者超过阈值,然后根据具体情况进行处理。这种接近或超过阈值的过程可以称为“提前发现雪崩”。以上是对应用服务雪崩场景和技术方案的总结。作者简介陈睿|mikechen,10年+大厂架构经验,《mikechen 的互联网架构》系列文章作者,专注于互联网架构技术。阅读更多关于mikechen的InternetArchitectureJavaConcurrency的技术文章|虚拟机|数据库|春天|雷迪斯|建筑|
