在平常開發中,咱們會遇到不少這樣的場景: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;
複製代碼