在平常开发中,咱们会遇到不少这样的场景:javascript
这类问题,本质是:「过热的调用」java
在物理电路中,对于「过热的调用」有一种你们生活中都常见的电子元件:保险丝git
保险丝会在电流异常升高到必定的高度和热度的时候,自身熔断切断电流,保护电路安全运行。github
咱们能够模仿这样的思路,去解决编程中的「过热的调用」问题:npm
基于以上的思路,我实现了一个 npm 库:Method Fuse编程
使用方式以下:安全
npm install @jerryc/method-fuse
markdown
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)
复制代码
若是你的项目中支持 TS
或者 ES Decorator
,那么 MethodFuse
提供了快捷使用的装饰器。并发
import { decorator as methodFuse } from '@jerryc/method-fuse';
@methodFuse({ name: 'TestFuse' })
async function getAsset() {
return API.requestAssets();
};
复制代码
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;
复制代码