← 中文资源

简体中文版本

构建断路器代理

一个以上游断路器包裹的代理:错误率超阈值跳闸为开,半开探测恢复,探测成功则闭。

阅读英文原文

项目概述

本项目实现断路器代理:三态状态机,闭态转发请求并以滑动窗口计失败率,错误率超阈值且样本足量时跳闸为开,开态立即返回回退并启动冷却计时,冷却后转入半开放仅放一个探测请求,探测连续成功达阈值则闭,任一失败则回开。滑动窗口为时间界环缓冲,扫除旧样本后计算近期错误率。半开仅允许一个在途探测,并发请求得回退。每个上游独立断路器,互不影响。测试驱动假上游:超阈值断言开并回退;冷却后断言探测命中;连续探测成功断言闭;探测失败断言回开;旧样本滑出后断言率仅反映近期;双上游隔离断言互不干扰;单失败不断言跳闸。部署为 sidecar 或中间件;阈值/窗口/冷却/连续数按观测配置;记录每次状态转换。不区分请求类;无舱壁隔离;回退为静态。

架构与实施

构建断路器代理的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建断路器代理实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整undici版本。

代码示例

pnpm init
pnpm add undici
pnpm add pino
pnpm add -D typescript tsx vitest
circuit-breaker-proxy/
├── src/breaker.ts
├── src/proxy.ts
├── src/window.ts
├── tests/breaker.test.ts
└── package.json
window.push({ok:false, t:Date.now()}); const rate = failures/total;
if (rate > 0.5 && total > 20) state = "open";
if (state==="open" && now > trippedAt+cooldown) state = "half-open";
if (++consecutive >= 3) state = "closed";
pnpm vitest run