服务限流
简介
- 服务降级的一种
限流就是限制系统输入输出流量达到保护系统的目的。
系统的吞吐量通过测算之后,为保证系统稳定运行,当某服务达到一定阀值,就需要限制流量采取一些措施以达到限制流量的目的。例如延迟处理/拒绝处理/部分拒绝
等。
「服务限流」其实是指当系统资源不够,不足以应对大量请求,即系统资源与访问量出现矛盾的时候,我们为了保证有限的资源能够正常服务,因此对系统按照预设的规则进行流量限制或功能限制的一种方法。
为什么做服务限流设计
- 容量
假设系统设计只允许300万的用户正常使用,当服务器某天用户达到500万,由于这500万用户的随机性,在不做限流的情况下很有可能一次压垮整个应用。
怎么做服务限流设计
-
熔断
当系统出现问题时,如果短时间内无法修复,系统要自动
判断,开启熔断器,拒绝流量访问,降低服务器压力,避免对后台的请求过高不释放导致服务器宕机。系统也应该能够动态监测后端程序的修复情况,当程序已恢复稳定时,可以关闭熔断开关,恢复正常服务。
熔断器实现方式可采用Spring Cloud Hystrix -
服务降级
将系统所有功能进行分级,当系统出现问题,可对不重要的功能进行降级处理,停止服务,以达到释放资源另主要服务可正常运作。
例如当视频APP,播放视频会占用太多资源,我们可以在后台直接关闭评论或者点赞功能,让看视频业务可正常运作。
除了功能降级以外,还可以采用不直接操作数据库,而全部读缓存、写缓存的方式作为临时降级方案。 -
延迟处理
此模式需要在前端设置一个缓冲池,将所有请求全部缓存入池,不立即处理。后台业务处理程序从池中取出请求依次处理,可以通过队列模式实现。
通过队列方式做到延迟处理,但是,当前端缓存池请求较多的时候,会出现后台处理不及时的问题。 -
特权处理
用户分类,通过用户分类,系统优先处理需要高保障的用户群体,类似2/8原则
-
实现方式
-
熔断技术
重点参考Netflix的开源组件hystrix,主要三个模块熔断请求判断算法、熔断恢复机制、熔断报警
GitHub 传送门 -
计数器方法
系统维护一个计数器,请求时+1,请求结束-1,当计数器超过预设阀值,拒绝处理请求
阀值的扩展:按不同服务设定不同阀值,可动态修改无需重启服务等 -
队列方法
基于FIFO队列
,所有请求都进入队列,后端从队列中获取请求(请求池)
队列的扩展:是否可以设置多个队列服务,做到合理分流和监控 -
令牌桶算法
首先基于一个队列,请求放入队列里面。但除了队列以外,还需要设置一个令牌桶,另外有一个脚本以持续恒定
的速度往令牌桶里放入令牌,后端处理程序每处理一个请求就必须从桶里拿出一个令牌,如果令牌拿完了,那就不处理请求了
我们可以控制脚本放令牌的速度来达到控制后端处理的速度,以实现动态流控
-
注意事项
-
实时监控
搭建全链路实时监控,来保证限流及时检测和处理,解决方案有: -
手动开关
系统除自动限流以外,应添加手动开关限流功能,以确保随时允许人工介入 -
限流的性能
限流对系统性能存在一定影响,所以要做好系统优化,在业务和服务调度和链路要有一定对优化