Polly 降级策略
- 执行提供的操作
- 如果操作出现指定处理的异常,或返回了一个处理的结果
onFallback/Async
方法将被调用- 然后会调用
fallback
方法
在 Polly 中, 降级策略的使用很简单, 比较推荐使用异步方式, 提供 CancellationToken
来控制操作的取消。
class LearningFallback
{
public static void Try()
{
var avatar = Policy<UserAvatar>
.Handle<Exception>()
.FallbackAsync(
// 降级处理 fallbackAction
async (res, c, cancellationToken) =>
{
return await Task<UserAvatar>.Factory.StartNew(() =>
{
return UserAvatar.Blank;
}, cancellationToken);
},
// 失败时调用 onFallbackAsync
(res, c) =>
{
Console.WriteLine($"onFallbackAsync called:{res?.Exception?.Message}");
return Task.CompletedTask;
})
.ExecuteAsync(async () => await Task.FromResult(UserAvatar.FromReal));
Console.WriteLine($"Get User Avatar: {avatar.Result?.Url}");
}
}
class UserAvatar
{
public string Url { get; private set; }
public static UserAvatar Blank => new UserAvatar { Url = "default.png" };
public static UserAvatar FromReal => throw new Exception("Server Error");
}
运行 Try 方法后将会首先执行最后指定的 Execute/Async
,这里为了模拟场景, UserAvatar.FromReal
会抛出 Exception
, 也就是 Policy Handle 的异常。然后会调用 onFallbackAsync
, 再去调用 fallbackAction
, fallbackAction
可以为之前的操作提供一个替代值, 当然也可以无需返回值。
需要注意的是, 降级策略 AsyncPolicy
实质上也是一个 Policy, 所以也可以通过 Wrap
方法与其他的 Policy 进行联合使用。