服务雪崩及防范机制
概念
服务雪崩与服务堆积是什么
默认情况下,只有一个线程池维护所有的服务接口,如果大量请求访问同一个接口,达到配置线程数的极限,可能会导致其他服务无法访问,线程池满了,从而导致系统无法访问而崩溃
主要产生雪崩原因是因为服务请求堆积问题
假设默认tomcat最大线程池是50,尝试第51个请求会阻塞,请求在等待,如果堆积请求过多,那么就会造成服务雪崩
大量的服务堆积请求会造成其他接口无法访问,导致服务崩溃
恶意的大量接口攻击可以导致服务雪崩
解决服务雪崩的方案
服务隔离(接口独立的线程池,接口间互不影响)
服务降级(当服务超时失败时,给予客户端默认返回)
服务限流(限制接口时间内的访问量,当超出时给予服务降级)
服务熔断(限制接口可承受的上限值,当超出时给予服务降级)
服务隔离
每个服务接口都有自己独立线程池,每个线程池互不影响,管理运行当前自己接口,这样就可以解决服务雪崩效应
遭遇大量恶意攻击时,单纯的隔离方案仍然危险
服务降级
高并发情况,当服务不可用时,直接返回一个默认提示或页面,避免客户端一直等待
避免大量请求处于阻塞状态,达到一定时间给予友好提示
服务限流
服务限流是什么
限制接口时间内的访问量,当超出时给予服务降级
常应用于秒杀抢购,服务安全(流量攻击,DDOS),雪崩效应,流量突然特别大的情况
服务限流的实现算法
滑动计数器
令牌桶
漏桶
滑动计数器
已时间格子的滑动窗口实现服务限流
滑动窗口随当前时间变化不断向后移动,最后的格子是当前的时间
进行请求时,检查前面的时间格子并根据制定的规则,得出此次请求是否应该被通过还是降级处理
令牌桶
令牌桶分为两个动作
动作1,固定速率往桶中存入令牌
动作2,客户端如果想访问请求,先从桶中获取令牌
创建令牌桶开启独立线程以固定的速率往桶中存放令牌,固定速率2R/S,表示每秒往桶中放入两个令牌
如果客户端从桶中获取不到令牌,进行降级处理
漏桶
流入: (客户端请求)
流出: (每允许通过的请求)
水都: (客户端请求的唯一标识)
已固定速率从桶中流出水滴,流出的水滴(请求),作为有效请求
当流入速率大于流出速率,那么水桶会溢出,溢出的水滴(请求)都进行降级处理
服务熔断
高并发情况,如果达到流量一定极限(阈值),超出了设置阈值,进行降级处理,保护当前服务不会遭到崩溃,熔断目的是为了保护服务
限制接口可承受的上限值,当超出时进行服务降级
转载至纤月博客