发现个“轻量级本地化热点检测/降级框架
这个框架名为Akali,项目地址:https://gitee.com/bryan31/Akali
主要有两个作用
1:热点检测及处理
2:降级检测及处理
从官网文档来看使用是比较简单的,一个注解就能搞定
怀着好奇的心情clone下来准备看他具体怎么做的
从这两个注解开始debug
针对于降级他是直接采用了sentinel 对应的依赖包
注册了FlowRule,当超出对应的规则就会触发降级
针对于热点里面的注解注册了ParamFlowRule,到这里的时候我就比较好奇了,为啥像这种类似于hotkey要采用限流的规则进行实现
最后处理逻辑到了com.yomahub.akali.sph.SphEngine#process方法,过滤对应的策略
主要看HoT_METHOD对应的处理
仔细看这个catch的处理,最终他会路由到com.yomahub.akali.strategy.MethodHotspotStrategy#
process方法
为了探测接口查询的为热点数据,在首次进入时将返回值设置进TimeCache, 它是Hutool缓存方面的工具类
先看构造方法做了什么
CachUtils.newTimeCache(1000*60) : 创建本地缓存kv,默认60秒过期
schedulePrune(1000): 会启动一个定时器,定时清理一次过期的条目
get(key): 超时前调用了get(key)方法,会重头计算起始时间。类似于续期
如果超时前调用了get(key)方法,会重头计算起始时间。举个例子,用户设置key1的超时时间5s,用户在4s的时候调用了get(“key1”),此时超时时间重新计算。其本质相当于实时的监测了热点,并对其热点数据做了一个短时间内的缓存。
总体看下来这个hotkey的逻辑为
1:当并发超过所配置的规则从而触发sentinel的BlockException进行捕获
2:将其捕获后进入对应的热点策略实现类执行对应的查询逻辑并将查询的结果缓存至本地cache
3: 只要你的请求一直触发限流的规则,就会将最后一次方法返回值的key过期时间一直保存续期状态,就提为热点,并用热点数据直接返回。
4:当调用低于配置的规则调用时,框架会自动的摘除掉这个热点。使其正常的调用你原有代码进行逻辑计算并返回。这一切都是自动的。
TPS:
额外引入sentinel做此功能对于未使用sentinel的应用比较重,sentinel的一些机制会加重应用负担,比如内存使用量会增高,要维持 sentinel 运行,要损失一些性能。
对应的sentinel issues
https://github.com/alibaba/Sentinel/issues/2767