码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 热点检测/降级框架Akali的部分原理解析


    发现个“轻量级本地化热点检测/降级框架
    这个框架名为Akali,项目地址:https://gitee.com/bryan31/Akali
    
    • 1
    • 2

    主要有两个作用

    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

  • 相关阅读:
    实践是成为网工最快的方法,网络工程师实战项目整理
    C_11微机原理
    使用OpenPCDet实现VoxelNext进行训练和测试:实现NuScence数据集的全局感知结果可视化
    物联网开发笔记(7)- 使用Wokwi仿真ESP32开发板实现LED灯点亮、按钮使用
    STM32单片机OLED贪吃蛇游戏记分计时
    【C++】函数参数扩展 ( 默认参数 | 默认参数定义规则 | 默认参数定义在参数列表末尾 )
    Java实现就医保险管理系统 JAVA+Vue+SpringBoot+MySQL
    木舟0基础学习Java的第十六天(异常,分类,自定义异常,注意事项)
    【视觉SLAM十四讲学习笔记】第二讲——初识SLAM
    入门力扣自学笔记79 C++ (题目编号241)
  • 原文地址:https://blog.csdn.net/qq_41316955/article/details/134452787
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号