最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 函数保险丝:避免函数过热调用

    正文概述 掘金(JerryC)   2021-01-28   416

    函数保险丝:避免函数过热调用

    前言

    在日常开发中,我们会遇到很多这样的场景:

    1. 在抢购活动中,用户往往会频繁刷新接口,要给接口加上防护,频繁调用停止响应。
    2. 在弱网环境中,往往会实现失败重试功能,如果失败次数多了,频繁的重试需要制止。
    3. 在股票市场中,当价格波动的幅度在交易时间中达到某一个限定的熔断点时,对其暂停交易一段时间的机制。
    4. ......

    这类问题,本质是:「过热的调用」

    在物理电路中,对于「过热的调用」有一种大家生活中都常见的电子元件:保险丝

    保险丝会在电流异常升高到一定的高度和热度的时候,自身熔断切断电流,保护电路安全运行。

    我们可以模仿这样的思路,去解决编程中的「过热的调用」问题:

    1. 设定一个阈值,如果函数在短时间内调用次数达到这个阈值,就熔断一段时间。
    2. 在函数有一段时间没有被调用了,让函数的热度降下来。

    函数保险丝的功能实现

    基于以上的思路,我实现了一个 npm 库:Method Fuse

    使用方式如下:

    Step1:安装

    npm install @jerryc/method-fuse

    Step2:快速使用

    import { MethodFuse } from '@jerryc/method-fuse';
    
    // 一个请求远程资源的异步函数
    const getAssets = async () => API.requestAssets();
    
    // 创建 MethodFuse 实例
    const fuse = new MethodFuse({
      // 命名,用于日志输出
      name: 'TestFuse',
    
      // 最大负荷,默认:3
      maxLoad: 3,
    
      // 每次熔断时间。每次熔断之后,间隔 N 毫秒之后重铸,默认:5000ms
      breakingTime: 5000,
    
      // 自动冷却时间。在最后一次调用间隔 N 毫秒之后自动重铸,默认:1000ms
      coolDownTime: 1000,
    });
    
    // 代理原函数
    const getAssetsProxy = fuse.proxy(getAssets);
    
    // 高频并发调用 getAssetsProxy。
    getAssetsProxy();
    getAssetsProxy();
    getAssetsProxy();
    getAssetsProxy(); // 此次调用会熔断
    setTimeout(() => getAssetsProxy(), 5000); // 等待熔断重铸后,方可重新调用。
    
    // 以上会打印日志:
    // [method-fuse:info] TestFuse-通过保险丝(1/3)
    // [method-fuse:info] TestFuse-通过保险丝(2/3)
    // [method-fuse:info] TestFuse-通过保险丝(3/3)
    // [method-fuse:error] TestFuse-保险丝熔断,5000ms 之后重铸
    // [method-fuse:info] TestFuse-保险丝重置
    // [method-fuse:info] TestFuse-通过保险丝(1/3)
    

    Step3:使用装饰器

    如果你的项目中支持 TS 或者 ES Decorator,那么 MethodFuse 提供了快捷使用的装饰器。

    import { decorator as methodFuse } from '@jerryc/method-fuse';
    
    @methodFuse({ name: 'TestFuse' })
    async function getAsset() {
      return API.requestAssets();
    };
    

    Step4:修改日志级别

    MethodFuse 内置了一个迷你 logger(power by @jerryc/mini-logger),方便内部日志打印,外部可以获得 Logger 的实例,进行 log level 的控制。

    import { LoggerLevel } from '@jerryc/mini-logger';
    import { logger, MethodFuse } from '@jerryc/method-fuse';
    
    // 创建 MethodFuse 实例
    const MethodFuse = new MethodFuse({ name: 'TestFuse' });
    
    // 下调 Log level
    logger.level = LoggerLevel.ERROR;
    

    起源地下载网 » 函数保险丝:避免函数过热调用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元