如何在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
相关产品推荐
相关产品推荐

