13:Polly-Fallback(回退)

翻译自: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()) 

上面的语法例子是同步的;异步操作也存在类似的异步重载。 更多细节请参考 readmewiki .

使用

  • 执行委托
  • 如果委托抛出已处理的异常或返回已处理的结果:
    • 调用所配置的当回退发生时委托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
点此跳转到系列目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值