.NET中Polly库,弹性和瞬时处理超详细!

.NET中弹性和瞬时处理库Polly的使用详解

 更新时间:2024年01月18日 11:03:38   作者:rjcql  
Polly 是一个 .NET 弹性和瞬态故障处理库,允许开发人员以 Fluent 和线程安全的方式来实现重试、断路、超时、隔离和回退策略,下面就跟随小编一起来看看它的具体使用吧

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

写在前面

Polly 是一个 .NET 弹性和瞬态故障处理库,允许开发人员以 Fluent 和线程安全的方式来实现重试、断路、超时、隔离和回退策略。

Polly 的七种策略介绍

重试(Retry): 当出现故障时自动进行重试

断路(Circuit-breaker):当系统遇到严重问题时,快速回馈失败比让用户/调用者等待要好,限制系统出错的体量,有助于系统恢复。

超时(Timeout):当系统超过一定时间的等待,我们就几乎可以判断不可能会有成功的结果,直接去干别的事情。

隔离(Bulkhead Isolation):当系统的一处出现故障时,可能促发多个失败的调用,很容易耗尽主机的资源(如 CPU)。下游系统出现故障可能导致上游的故障的调用,甚至可能蔓延到导致系统崩溃。所以要将可控的操作限制在一个固定大小的资源池中,以隔离有潜在可能相互影响的操作。

回退(Fallback):有些错误无法避免,就要有备用的方案。这个就像浏览器不支持一些新的 CSS 特性就要额外引用一个 polyfill 一样。一般情况,当无法避免的错误发生时,我们要有一个合理的返回来代替失败。

缓存(Cache):一般我们会把频繁使用且不会怎么变化的资源缓存起来,以提高系统的响应速度。如果不对缓存资源的调用进行封装,那么我们调用的时候就要先判断缓存中有没有这个资源,有的话就从缓存返回,否则就从资源存储的地方(比如数据库)获取后缓存起来,再返回,而且有时还要考虑缓存过期和如何更新缓存的问题。Polly 提供了缓存策略的支持,使得问题变得简单。

策略包(Policy Wrap):一种操作会有多种不同的故障,而不同的故障处理需要不同的策略。这些不同的策略必须包在一起,作为一个策略包,才能应用在同一种操作上。这就是文章开头说的 Polly 的弹性,即各种不同的策略能够灵活地组合起来。

通过NuGet安装Polly类库:

官方项目地址: https://github.com/App-vNext/Polly 

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/// <summary>
/// FallBack => 当出现故障,则进入降级动作
/// </summary>
public static void Case1()
{
    ISyncPolicy policy = Policy.Handle<ArgumentException>()
        .Fallback(() =>
        {
            Console.WriteLine("Error occured");
        });
 
    policy.Execute(() =>
    {
        Console.WriteLine("Job Start");
 
        throw new ArgumentException("Hello Polly!");
 
        Console.WriteLine("Job End");
    });
}
 
/// <summary>
/// Retry => 重试
/// </summary>
public static void Case2()
{
    ISyncPolicy policy = Policy.Handle<Exception>().Retry(3);
 
    try
    {
        policy.Execute(() =>
        {
            Console.WriteLine("Job Start");
            if (DateTime.Now.Second % 10 != 0)
            {
                throw new Exception("Special error occured");
            }
            Console.WriteLine("Job End");
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine("There's one unhandled exception : " + ex.Message);
    }
}
 
/// <summary>
/// CircuitBreaker => 短路保护
/// </summary>
public static void Case3()
{
    // Stop for 10s after retry 6 times
    ISyncPolicy policy = Policy.Handle<Exception>()
        .CircuitBreaker(6, TimeSpan.FromSeconds(10));
 
    while (true)
    {
        try
        {
            policy.Execute(() =>
            {
                Console.WriteLine("Job Start");
                throw new Exception("Special error occured");
                Console.WriteLine("Job End");
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine("There's one unhandled exception : " + ex.Message);
        }
 
        Thread.Sleep(500);
    }
}
 
/// <summary>
/// Timeout 与 Wrap => Wrap是指策略封装,可以把多个ISyncPolicy合并到一起执行。Timeout则是指超时处理,但是超时策略一般不能直接使用,而是其其他策略封装到一起使用。
/// </summary>
public static void Case4()
{
    try
    {
        ISyncPolicy policyException = Policy.Handle<TimeoutRejectedException>()
            .Fallback(() =>
            {
                Console.WriteLine("Fallback");
            });
        ISyncPolicy policyTimeout = Policy.Timeout(3, Polly.Timeout.TimeoutStrategy.Pessimistic);
        ISyncPolicy mainPolicy = Policy.Wrap(policyTimeout, policyException);
        mainPolicy.Execute(() =>
        {
            Console.WriteLine("Job Start...");
            Thread.Sleep(5000);
            throw new Exception();
            Console.WriteLine("Job End...");
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Unhandled exception : {ex.GetType()} : {ex.Message}");
    }
}
 
/// <summary>
/// 异步方法
/// </summary>
public static async void Case5()
{
    var policy = Policy<byte[]>.Handle<Exception>()
        .FallbackAsync(async c =>
        {
            Console.WriteLine("Executed Error!");
            return new byte[0];
        }, async r =>
        {
            Console.WriteLine(r.Exception);
        });
 
    policy.WrapAsync(Policy.TimeoutAsync(5, TimeoutStrategy.Pessimistic,
     async (context, timespan, task) =>
     {
         Console.WriteLine("Timeout!");
     }));
 
    var bytes = await policy.ExecuteAsync(async () =>
    {
        Console.WriteLine("Start Job");
        HttpClient httpClient = new HttpClient();
        var result = await httpClient.GetByteArrayAsync("https://img-blog.csdnimg.cn/img_convert/50f2b9069f40b88ea8348492d56abb87.png");
        Console.WriteLine("Finish Job");
 
        return result;
    });
 
    Console.WriteLine($"Length of bytes : {bytes.Length}");
}

调用示例

Case1:

Case2: 

Case3:

到此这篇关于.NET中弹性和瞬时处理库Polly的使用详解的文章就介绍到这了,更多相关.NET Polly内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/rjcql/article/details/135662967

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

最新评论

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空