限流篇,欣赏阿里开源 Sentinel
限流只是为了限制流量吗
当然是为了资源啦,资源从来是有限的,具象理解下就是钱,互联网这行硬件成本不是主要的,但如果软件无法服务了,那就赔大了,至于程序猿,P0 一背,一年白干,那为什么会无法服务呢?
一般来说生产上的机器,如果没有 bug,内存、硬盘都不是瓶颈,如果访问量过大、线程数过多、load 过高,响应时间肯定变长,如果把数据库承受不了,又没有止损的办法,数据库打挂了,业务机器再多也只能干瞪眼了,如果...,这么多如果,怎么办呢?
简单嘛,无非是看报警、登机器、查代码,黑白名单、重启扩容大法、但线上出现了大范围报警、白页,等你去查到底是不是有慢查询、流量过大、FullGC 过多,服务可能挂了半个小时以上了,奔着 P0 的定级标准就去了,能不能尽量的缩小故障范围、同时提供一定的服务能力呢?
答案就是限流了,比如有个接口出现大量异常就熔断,别拖累上下游,比如有个服务,压测的安全 qps 是 100,流量突增到 120,那么后面的会被拒绝,那么问题的关键有 2 个,当资源出现压力过大等危险情况时,怎么保护它呢?怎么判定资源出现了危险呢?
Sentinel 的功能是什么
基于流量的 qps、并发数控制,即压测出来的安全流量;基于异常的慢调用、异常比例(数量)控制,即防止拖挂整个系统;基于系统负载的 Load、平均 RT、入口 QPS 和线程数控制,即防止不论什么原因造成的机器压力过高,这是比较常见的策略
其他的配合策略,基于集群资源视角的 token 数控制,作为 qps 策略的补充使用;基于参数的热点访问控制,这个策略 m 貌似有点被动;基于黑白名单的用户级别控制,捣乱的人从来都不缺的
Sentinel 的结构是什么
直接上官方图了
打眼一瞧,左上角是一棵树,中间虚线连着节点,右上角是一个 ring 环,均分了 X 段,每一段记录了开始时间、统计信息;再往下看,这不是责任链模式吗,创建节点的 Slot,处理规则的 Solt,怎么越看越像数据结构+处理呀,这不是面向过程吗?最重要的两个对象不是资源、规则吗?
到底应不应该面向对象这个问题,其实蛮好回答的,只要把关注划分好,面向谁都可以写出很好的程序,只不过一般来说业务系统,存储了大量的数据,又要随时支持业务,用这种方式容易乱,最起码套一个对象的框子,当然啦,老油条都知道,框子是套不住漫山遍野的 IF-ELSE 啦,甚至把 HttpResponse 传到 DAO 赋值,别说恁没见过
Sentinel 的分层是什么
直接上官方图了
嗨,又想起来有人问过我的问题,DDD 一共分几层,我说我忘了书上怎么说的,但我实践中一般是 3 层够用,他回答说 DDD 标准是 4 层的哈,我心话说这怎么还背起书来了,乍一看,sentinel 的分层咋不是四层捏,但要做分层的问题是为什么要这么分,而不是样子像不像
当然啦,软件这东西,你挫一点能跑,优秀些也能跑,只要把关键的算法、瓶颈处理好,堆 IF-ELSE 也能做,只要有人加班干活,也不耽误 PPT 吹牛皮,只是干活的人跟柴火一样,被人烧着用
书要简言言归正传,按上文说的各种控制规则,规则肯定要存储嘛,支持用户配置规则(组合),就是 3 层嘛,那竖的那一层捏,放到最后一层有问题嘛,那玩意又不是经常改
这么分层还得从 sentinel 要干嘛说起,其实就是对资源的控制,即规则的定义和处理,是不是很像元规则+用户配置规则,再加一个存储、配置的基础层,不就好了嘛
Sentinel 的关键算法是什么
第一个,基于滑动窗口的 LeapArray
来统计秒级指标数据,避免了单纯计数器算法带来的突发请求过密
第二个,限流算法不细究了哈,自己看代码吧,网上类似的源码分析一堆,如果真想学,自己动动手写
版权声明: 本文为 InfoQ 作者【下雨喽】的原创文章。
原文链接:【http://xie.infoq.cn/article/f088f4dc0d1a2a1c1e49a362a】。文章转载请联系作者。
评论