热点检测/降级框架Akali的部分原理解析

发现个“轻量级本地化热点检测/降级框架
这个框架名为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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值