翻译自:https://github.com/App-vNext/Polly/wiki/Fallback
点此跳转到系列目录
回退策略 Policy (v5.0 起)
目的
在失败时提供替代值(或被执行的替代操作)。
前言: ‘如果所有这些都失败了,优雅地降级’
彻底的失败仍然会发生:当失败发生时,计划好你要做什么。
语法
有返回值的调用
返回特定的回退结果:
Policy<UserAvatar>
.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank)
Run a function to provide a fallback result:
Policy<UserAvatar>
.Handle<Whatever>()
.Fallback<UserAvatar>(() => UserAvatar.GetRandomAvatar())
对于第二个示例,除非确实需要,否则不会计算回退(ps:返回一个任意值肯定不合适,除非要求一定要有返回值)。
无返回值的调用
FallbackPolicy
也可以用于无效返回调用。在这种情况下,它指定了在策略处理错误时要运行的替代“操作”(而不是替代返回值)。
Policy
.Handle<Whatever>()
.Fallback(() => DoFallbackAction())
上面的语法例子是同步的;异步操作也存在类似的异步重载。 更多细节请参考 readme 和wiki .
使用
- 执行委托
- 如果委托抛出已处理的异常或返回已处理的结果:
- 调用所配置的当回退发生时委托
onFallback/Async
- 然后调用所配置的回退要执行的
Func
/Action
- 调用所配置的当回退发生时委托
与策略操作交互
OnFallback(回退时)
一个可选的onFallback
/ onFallbackAsync
委托允许在回退Func
/Action
被调用之前执行特定的代码(例如日志)。
// 指定一个替代值或func,如果回退被调用,调用一个操作(例如日志)。
Policy<UserAvatar>
.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank, onFallback: (result, context) =>
{
logger.Error($"{context.PolicyKey} at {context.OperationKey}: fallback value substituted, due to: {result.Exception}.");
});
FallbackPolicy with ExecuteAndCapture()
请注意:不管总体执行结果是否被策略认为是失败,.ExecuteAndCapture/Async(...)
都能捕获并执行。因此,如果您的回退策略将一个失败结果替换为一个_成功_(就像许多回退策略所做的那样——“优雅降级”模式),那么“。.ExecuteAndCapture/Async(...)
内自然会报告PolicyResult.Outcome == OutcomeType.Success
.
Thread safety and policy reuse
线程安全
FallbackPolicy
是线程安全的: 不同的调用可以安全的使用同一个策略实例。
策略复用
FallbackPolicy
回退策略实例也可以跨点复用.
在重用策略时,使用“OperationKey”来区分日志和度量中的不同业务代码使用情况。
翻译自:https://github.com/App-vNext/Polly/wiki/Fallback
点此跳转到系列目录