You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polly的AdvancedCircuitBreakerAsync的onHalfOpen中获取Context?

AdvancedCircuitBreakerAsync中onHalfOpen获取Context的解决方案

确实,Polly的AdvancedCircuitBreakerAsync所有重载里,onHalfOpen委托都没有接收Context参数——这是因为onHalfOpen是断路器从断开状态自动切换到半开状态时触发的事件,此时并没有关联具体请求;而onBreak/onReset是和单次请求的执行结果绑定的,因此能拿到请求级别的Context。

根据不同需求,有以下可行解决办法:

场景1:需要全局上下文(如全局Logger、配置)

直接通过闭包捕获当前作用域内的上下文对象即可,示例代码:

// 假设当前作用域已获取全局Logger或其他上下文对象
var globalLogger = GetGlobalLogger();

var cB = Policy
    .Handle<Exception>()
    .AdvancedCircuitBreakerAsync(
        getFailureThreshold(),
        getSamplingDuration(),
        getMinimumThroughput(),
        getDurationOfBreak(),
        onBreak: (exception, timeSpan, context) =>
        {
            var logger = context.GetLogger();
            logger.LogWarning("In Break");
        },
        onReset: (context) =>
        {
            var logger = context.GetLogger();
            logger.LogWarning("In Reset");
        },
        onHalfOpen: () =>
        {
            // 使用闭包捕获的全局上下文对象
            globalLogger.LogWarning("Circuit entering Half-Open state");
        });

场景2:需要请求级别的上下文

由于onHalfOpen触发时无关联请求,无法直接获取请求级Context。若要跟踪半开状态下的请求信息,可在半开状态执行的请求对应的onReset/onBreak中处理——半开请求成功会触发onReset,失败则触发onBreak,这两个委托都能拿到该请求的Context:

var cB = Policy
    .Handle<Exception>()
    .AdvancedCircuitBreakerAsync(
        getFailureThreshold(),
        getSamplingDuration(),
        getMinimumThroughput(),
        getDurationOfBreak(),
        onBreak: (exception, timeSpan, context) =>
        {
            var logger = context.GetLogger();
            if (context.ContainsKey("IsHalfOpenAttempt"))
            {
                logger.LogWarning("Half-Open attempt failed, circuit re-opened");
            }
            else
            {
                logger.LogWarning("In Break");
            }
        },
        onReset: (context) =>
        {
            var logger = context.GetLogger();
            if (context.ContainsKey("IsHalfOpenAttempt"))
            {
                logger.LogWarning("Half-Open attempt succeeded, circuit reset");
            }
            else
            {
                logger.LogWarning("In Reset");
            }
        },
        onHalfOpen: () =>
        {
            // 仅记录状态切换,请求级信息在后续委托中处理
            GetGlobalLogger().LogWarning("Circuit entering Half-Open state");
        });

// 执行请求时标记为半开尝试
await cB.ExecuteAsync(async (context) =>
{
    context["IsHalfOpenAttempt"] = true;
    // 业务逻辑代码
}, new Context());

进阶方案:自定义Policy扩展

如果需要在onHalfOpen中强制关联特定上下文,可通过自定义Polly Policy扩展,将全局上下文注入断路器的状态管理逻辑中,但该方案需要深入Polly内部实现,复杂度较高,仅推荐复杂场景使用。

内容的提问来源于stack exchange,提问作者Dr. Strangelove

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:35:51