许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  .NET中Polly库,弹性和瞬时处理超详细!

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

阅读数 2317
点赞 0
article_banner

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

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


写在前面

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 进行投诉反馈,一经查实,立即处理!

相关文章

  • 这篇文章主要给大家介绍了在ASP.NET core Web中使用appsettings.json配置文件的方法,文中给出了详细的示例代码,需要的朋友可以参考学习,下面来一起看看吧。
    2017-04-04
  • 这篇文章主要为大家详细介绍了WPF集合控件实现分隔符ItemsControl Separator,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 这篇文章介绍了asp.net 生成随机密码的具体代码,有需要的朋友可以参考一下
    2013-09-09
  • 这篇文章主要给大家介绍了关于.Net学习笔记之Layui多图片上传功能的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.Net具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 大家在项目中比较多的会对文件进行操作,例如文件的上传下载,文件的压缩和解压等IO操作。而在.NET项目中较多的会使用DataSet,DataTable进行数据的缓存。每一个DataSet都是一个或多个DataTable对象的集合,本文主要介绍的是如何将文本文件的内容存储到DataSet里去。
    2016-12-12
  • 这篇文章主要为大家详细解析了微信公众平台开发之语音识别.Net代码,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 本文将详细介绍下List<>泛型集合/Dictonary<>字典/泛型集合练习 /中日期转换提取为方法以及泛型集合练习之翻译软件,感兴趣的你可不要错过了哈
    2013-02-02
  • 完美解决“换另一台电脑上用VS2008继续开发web项目时出现“System.Runtime.InteropServices.COMException”,然后是加载不了项目。”
    2009-03-03
  • 主要的原理就是替换模板里的特殊字符。
    2010-03-03
  • 这篇文章主要介绍了.net 中的 StringBuilder 和 TextWriter 区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论


武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

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

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空