推荐用 ihttpclientfactory + polly 封装异步请求并集成断路器,按失败率等条件自动跳闸,策略链中先重试再断路,open 状态立即抛异常,half-open 仅放行一个探测请求,配合超时、连接数限制及降级策略保障稳定性。

直接封装异步请求并集成断路器,核心是把失败识别、状态切换和快速失败三件事做进调用链里,而不是等超时或重试耗尽才反应。
选对基础组件:IHttpClientFactory + Polly 是主流路径
不要自己手写断路器状态机。.NET 生态中推荐用 IHttpClientFactory 管理 HTTP 客户端生命周期,再搭配 Polly 库定义策略。Polly 提供开箱即用的 CircuitBreakerPolicy,支持按失败率、异常类型、持续时间自动跳闸。
- 在
Program.cs中注册客户端时,把断路器策略加到策略链末尾(先重试、再断路) - 断路器策略需明确配置:比如连续 5 次失败就打开,保持打开状态 30 秒,半开状态下允许 1 个试探请求
- 避免把断路器和重试策略顺序颠倒——如果先断路再重试,重试逻辑可能永远没机会执行
异步调用必须与断路器状态联动
断路器不是装饰器,它要真实影响 await 的行为。当断路器处于 Open 状态时,所有请求应立即抛出 BrokenCircuitException,不发网络请求;处于 Half-Open 时,只放行一个请求做探测,其余继续失败。
- 所有对外部服务的
await client.GetAsync(...)调用,都必须包裹在policy.ExecuteAsync(...)中 - 不要在业务代码里手动检查断路器状态——那是策略内部的事;你的职责是统一走策略入口
- 若使用
HttpClient原生调用,断路器将失效,因为策略无法介入底层连接过程
配合超时与线程隔离,防止单点拖垮整个服务
断路器解决的是“要不要试”,但不解决“试多久”和“占多少资源”。异步请求若没设超时,仍可能堆积大量等待中的 Task,吃光线程池或连接数。
- 每个 HTTP 请求必须设置
Timeout,建议控制在 3–8 秒,明显短于断路器半开探测周期 - 用
HttpClientHandler.MaxConnectionsPerServer限制并发连接数,避免突发流量打爆下游 - 关键外部依赖可单独划分
Named HttpClient,实现连接池和策略隔离,避免一个服务故障影响其他调用
提供降级路径,让失败变得可预期
断路器打开后,业务不能卡住或返回 500。应在策略外层补一层降级逻辑,比如返回缓存数据、空对象或兜底文案。
- 用 Polly 的
FallbackPolicy接在断路器之后,捕获BrokenCircuitException或超时异常 - 降级响应需带明确标识(如 HTTP Header
X-Fallback: true),方便前端或监控识别 - 避免在降级逻辑里再调用另一个外部服务——那会引入新的故障面










