用promise实现带限流与熔断的异步调用,核心是将请求控制逻辑封装进promise工厂函数:先检查限流(滑动窗口计数器),再检查熔断(三态状态机),最后执行真实请求;任一环节失败即终止链式流程。

用 Promise 实现带限流 + 熔断的异步接口调用,核心是把“请求控制逻辑”封装进 Promise 工厂函数,不侵入业务请求本身。关键不在 Promise 多复杂,而在如何用它组合限流器(如令牌桶或计数器)和熔断器(状态机 + 时间窗口)。
限流:用计数器 + 时间窗口控制并发请求数
简单可靠的方式是维护一个滑动时间窗口内的请求数。每次调用前检查是否超出阈值,超了就返回 rejected Promise 或排队等待。
- 定义最大并发数(如 maxConcurrency = 3)和时间窗口(如 windowMs = 1000)
- 用数组记录最近请求的发起时间戳,每次调用前过滤掉过期时间戳
- 若剩余配额 ≤ 0,返回 Promise.reject(new Error('Rate limit exceeded'));否则允许执行并记录当前时间
熔断:三态状态机 + 失败率统计
熔断器有三种状态:CLOSED(正常)、OPEN(熔断中)、HALF_OPEN(试探恢复)。靠失败率(如 5 秒内失败 ≥ 50%)触发状态切换。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- CLOSED 状态下,记录成功/失败次数,达到阈值后切到 OPEN,并设置下次尝试时间(如 resetTimeout = 60000)
- OPEN 状态下直接拒绝请求:Promise.reject(new Error('Circuit breaker is open'))
- 到 resetTimeout 后自动切 HALF_OPEN,允许一次请求试探;成功则恢复 CLOSED,失败则重置 OPEN
组合限流与熔断:Promise 链式封装
把限流检查、熔断检查、实际请求三步串成 Promise 链,任一环节 reject 整个调用就终止:
- 先跑限流检查 → 拒绝则直接 reject
- 再跑熔断检查(OPEN 状态?)→ 拒绝则直接 reject
- 都通过后,用 fetch 或 axios 发起真实请求
- 请求成功:更新熔断器为 success;失败:更新为 failure,并可能触发熔断
示例骨架:
const makeLimitedAndCircuitCall = (url, options) => {return new Promise((resolve, reject) => {
if (!limiter.tryAcquire()) return reject(new Error('Too many requests'));
if (circuit.isOpen()) return reject(new Error('Service unavailable'));
fetch(url, options)
.then(res => { circuit.recordSuccess(); resolve(res); })
.catch(err => { circuit.recordFailure(); reject(err); });
});
};
可选增强:支持排队等待与降级回调
限流拒绝太生硬?可加简单队列:当无配额时,把请求暂存,等有空位时用 setTimeout 或 Promise.resolve().then() 触发;熔断 OPEN 时,也可提供 fallback 函数返回默认数据:
- 限流排队:用 queue.push({ resolve, reject, fn: () => fetch(...) }),释放配额时 shift 并执行
- 熔断降级:调用时传入 fallback: () => Promise.resolve({ data: 'mock' }),OPEN 状态下直接 resolve fallback 结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










