日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Polly:提升服务可用性

發布時間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Polly:提升服务可用性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Polly是.NET生態非常著名的組件包

一 介紹

Polly?的能力

??失敗重試:當我們服務調用失敗時,能夠自動的重試

??服務熔斷:當我們服務部分不可用時,我們的應用可以快速響應一個熔斷結果,避免持續的請求這些不可用的服務而導致整個應用程序出現問題

??超時處理:我們為服務的請求設置一個超時時間,當超過超時時間可以按照我們預定的操作進行處理,比如返回一個緩存的結果。

??艙壁隔離:實際上是一個限流的功能,我們可以為服務定義最大的流量和隊列,這樣可以避免我們的服務因為請求量過大而被壓崩。

??緩存策略:可以讓我與類似于AOP方式為應用嵌入緩存的機制,當緩存命中時,我們可以快速地響應緩存,而不是持續的請求服務。

??失敗降級:當我們的服務不可用時,我們可以響應一個更友好的結果而不是報錯。

??組合策略:可以讓我們將上面的 策略組合在一起,按照一定的順序,我們可以對不同的場景組合不同的策略類,實現我們的應用程序。

Polly?使用步驟

??定義要處理的異常類型或返回值

??定義要處理動作(重試、熔斷、降級響應等)

??使用定義的策略來執行代碼

適合失敗重試的場景

??服務“失敗”是短暫的,可自愈的

在失敗的場景里,我們可以非常有效的避免這種網絡閃斷這種情況

??服務是冪等的,重復調用不會有副作用

在失敗重試情況下,有可能會造成多次調用的情況,因為有些失敗,可能是你的命令已經發出了,但是你沒收到響應,它會重試。

場景舉例

??網絡閃斷

??部分服務節點異常

重試的過程可能就可以命中到正常的節點

最佳實踐

??設置失敗重試次數

??設置帶有步長策略的失敗等待間隔

??設置降級響應

??設置斷路器

盡量設置重試的次數,盡量設置不同的間隔,否則會造成類似于DDOS的情況,當我們的重試的次數達到上限以后,我們應該為服務提供一個降級的響應,更友好的響應結果。(DDOS 全稱Distributed Denial of Service,中文意思為“分布式拒絕服務”,就是利用大量合法的分布式服務器對目標發送請求,從而導致正常合法用戶無法獲得服務)

策略的類型

??被動策略(異常處理、結果處理)

??主動策略(超時處理、斷路器、艙壁隔離、緩存)

組合策略

??降級響應

??失敗重試

??斷路器

??艙壁隔離

策略與狀態共享

Policy類型狀態說明
CircuitBreaker(斷路器)有狀態共享成功失敗率,以決定是否熔斷
Bulkhead(艙壁隔離)有狀態共享容量使用情況,以決定是否執行動作
Cache(緩存)有狀態共享緩存的對象,以決定是否命中
其它策略無狀態-

有狀態:時間參數、次數參數等計數實例來承載的,對不同的服務進行定義不同的策略

二? 應用

我們本次使用的組件包如下:

Polly?

Polly.Extensions.Http?

Microsoft.Extensions.Http.Polly

瞬時Http錯誤重試策略

  錯誤規則

  • 網絡故障(HttpRequestException)

  • HTTP 5XX 狀態代碼(服務器錯誤)

  • HTTP 408 狀態代碼(請求超時)

    有關配置策略的指南,請參閱有關 PolicyHttpMessageHandler 的備注。

public void ConfigureServices(IServiceCollection services) {services.AddHttpClient("myClient", conifg =>{conifg.BaseAddress = new Uri("http://localhost:9090");}).//瞬時http錯誤重試策略 執行10次//拋出 HttpRequestException 或者響應碼為5XX或者408AddTransientHttpErrorPolicy(p =>//錯誤重試配置 ?重試次數p.RetryAsync(10)).AddTransientHttpErrorPolicy(p =>p.WaitAndRetryAsync(10, i => TimeSpan.FromSeconds(2))).AddTransientHttpErrorPolicy(p =>//等待第i次*兩秒重試 總共重試10次 越往后等的時間越久p.WaitAndRetryAsync(10, i => TimeSpan.FromSeconds(2 * i))).AddTransientHttpErrorPolicy(p =>//等待第i次*兩秒重試 一直重試 直到成功p.WaitAndRetryForeverAsync(i => TimeSpan.FromSeconds(i * 3))); }

使用自定義的Http錯誤重試策略

  可以根據HttpResponseMessage定義自己的重試條件

public void ConfigureServices(IServiceCollection services) {//定義自己的策略 var reg = services.AddPolicyRegistry();//根據返回的狀態碼自定義自己的返回策略 reg.Add("retryforever", Policy.HandleResult<HttpResponseMessage>(message => {return message.StatusCode == System.Net.HttpStatusCode.Created;}).RetryForeverAsync());//配置httpclient使用retryforever 的策略 services.AddHttpClient("myClient2"). AddPolicyHandlerFromRegistry("retryforever");//根據HttpRequestMessage 來定義策略 services.AddHttpClient("myClient3"). AddPolicyHandlerFromRegistry((registry, message) => { return message.Method == HttpMethod.Get ?registry.Get<IAsyncPolicy<HttpResponseMessage>>("retryforever") :Policy.NoOpAsync<HttpResponseMessage>();});} });}

熔斷策略

public void ConfigureServices(IServiceCollection services) {//熔斷services.AddHttpClient("myClient4").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().CircuitBreakerAsync( //報錯10次后盡行熔斷 handledEventsAllowedBeforeBreaking: 10, //熔斷的時間 10秒 durationOfBreak: TimeSpan.FromSeconds(10), //當我們熔斷時觸發的一個事件 onBreak: (r, t) => { },//當我們熔斷恢復時的事件 onReset: () => { }, //在我們恢復之前進行驗證服務是否可用? //打一部分的流量去驗證我們的服務是否可用的事件 onHalfOpen: () => { })); }

高級熔斷策略

public void ConfigureServices(IServiceCollection services) { //高級熔斷策略 services.AddHttpClient("myClient4"). AddPolicyHandler(Policy<HttpResponseMessage>. Handle<HttpRequestException>(). AdvancedCircuitBreakerAsync( //比例0.8服務出錯進行熔斷 failureThreshold: 0.8, //10秒以內 請求出錯比例0.8 進行熔斷 samplingDuration: TimeSpan.FromSeconds(10), //最小的吞吐量100? //當我們請求量比較小的時候 //比如說我們十秒采樣范圍內? //當我們的請求數超過100個時才會進行熔斷? //當請求量比較小的時候是不需要熔斷 minimumThroughput: 100, //熔斷的時長 20秒 durationOfBreak: TimeSpan.FromSeconds(20), //當我們熔斷時觸發的一個事件 onBreak: (r, t) => { }, //當我們熔斷恢復時的事件 onReset: () => { }, //在我們恢復之前進行驗證服務是否可用? //打一部分的流量去驗證我們的服務是否可用的事件 onHalfOpen: () => { }));}

服務降級策略

publicvoid ConfigureServices(IServiceCollection services)

{//定義服務降級的策略//當我們遇到熔斷時 我們響應一個異常的友好結果//定義我們的熔斷 var breakPolicy = Policy<HttpResponseMessage>.Handle<HttpRequestException>().AdvancedCircuitBreakerAsync(//百分之八十的服務出錯進行熔斷failureThreshold: 0.8, //10秒以內 請求出錯比例0.8 進行熔斷 samplingDuration: TimeSpan.FromSeconds(10), //最小的吞吐量100 //當我們請求量比較小的時候,比如說我們十秒采樣范圍內 //當我們的請求數超過00個時才會進行熔斷 //當請求量比較小的時候是不需要熔斷 minimumThroughput: 100, //熔斷的時長 20秒 durationOfBreak: TimeSpan.FromSeconds(20), //當我們熔斷時觸發的一個事件 onBreak: (r, t) => { }, //當我們熔斷恢復時的事件onReset: () => { }, //在我們恢復之前進行驗證服務是否可用 //打一部分的流量去驗證我們的服務是否可用的事件 onHalfOpen: () => { } ); //定義返回結果 var message2 = new HttpResponseMessage() { Content = new StringContent("{\"IsError\":true,\"ErrorMsg\":\"服務異常\"}") }; };//定義降級策略 var fallback = Policy<HttpResponseMessage>.Handle<BrokenCircuitException>().FallbackAsync(message2);//定義重試 var retry = Policy<HttpResponseMessage>. Handle<Exception>(). WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(1)); //定義請求策略組合 var fallbackBreak = Policy.WrapAsync(fallback, retry, breakPolicy); //注入HttpClient定義策略 services.AddHttpClient("myClient5"). AddPolicyHandler(fallbackBreak); }}

限流策略

public void ConfigureServices(IServiceCollection services) {//限流//定義請求的并發是多少var bulk = Policy.BulkheadAsync<HttpResponseMessage>(??//最大請求并發數????maxParallelization: 30,// 當我們請求超過30的并發數時//?剩下的請求怎么處理的問題// 如果我們不定義我們的隊列數// 它就會拋出異常//?如果定義了隊列數// 可以有20個請求在隊列里排隊// 只有超出隊列的請求才會拋出異常// 讓多出來的請求不至于直接報錯maxQueuingActions: 20,//當我們的請求超出了并發數時怎么處理 這里可以定義自己的規則????onBulkheadRejectedAsync: context => Task.CompletedTask);var message3 = new HttpResponseMessage(){Content = new StringContent("{}")};//定義超出并發數策略 var fallback2 = Policy<HttpResponseMessage>.Handle<BulkheadRejectedException>().FallbackAsync(message3);//定義限流組合策略var fallbackBulk = Policy.WrapAsync(fallback2, bulk);//注入HttpClient定義策略 services.AddHttpClient("myClient6").AddPolicyHandler(fallbackBulk);} }

?參考地址:

http://www.thepollyproject.org?

https://github.com/App-vNext/Polly.git?

https://github.com/App-vNext/Polly.Extensions.Http.git?

https://github.com/App-vNext/Polly-Samples.git?

總結

以上是生活随笔為你收集整理的Polly:提升服务可用性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本特级黄色 | 日本少妇裸体做爰 | 91av日本| 亚洲国产精品成人综合久久久 | 两个小y头稚嫩紧窄h文 | 亚洲av成人无码久久精品 | 日日干日日摸 | av日韩国产 | 精品国产久 | free性满足hd国产精品久 | 久久人人添人人爽添人人片 | 成年人看的羞羞网站 | 亚洲一区二区三区电影 | 日本精品视频一区二区三区 | 亚洲欧洲日本在线 | 上原亚衣av一区二区三区 | www..com国产 | 日本欧美中文字幕 | 91久久精品国产 | 四虎4hu| 欧美中文字幕在线 | 国产精品剧情av | 日韩欧美一区二区三区免费观看 | 亚洲欧美精品一区二区 | 亚洲欧美日韩系列 | 日韩av手机在线免费观看 | 初尝黑人巨炮波多野结衣 | 欧美激情69 | 男女猛烈无遮挡 | 亚洲色图18p | 亚洲乱色| 呦呦精品 | 成人手机在线观看 | 成人做爰黄 | av国产一区 | 国产一二三四在线 | 欧美激情一区二区三区在线 | 清纯唯美第一页 | 狠狠地日 | 99在线国产 | 日日噜噜夜夜狠狠久久波多野 | 国产一区91精品张津瑜 | 国产真人做爰毛片视频直播 | 免费在线成人网 | 婷婷综合在线观看 | 毛片视频免费观看 | 欧美美女喷水 | 久久久噜噜噜久久中文字幕色伊伊 | 欧美xxxx69 | 韩日少妇 | 欧美又粗又大xxxxbbbb疯狂 | 欧美色图一区二区三区 | 亚洲一级电影 | 91瑟瑟| 国产成人愉拍精品久久 | 中文字幕在线观看国产 | 日韩欧美日本 | 国产精品国产三级国产a | 国产精品高潮呻吟久久 | 四季av国产一区二区三区 | 欧美精品乱码99久久蜜桃 | 成人精品一区二区三区 | 日韩片在线观看 | 992tv人人草| 怒海潜沙秦岭神树 | 欧美3p在线观看 | 噼里啪啦免费看 | 在线播放成人av | 成年人视频在线免费观看 | 日韩毛片在线看 | 国产69精品久久久久久久久久 | 日本一二三区不卡 | 一本一道人人妻人人妻αv 九一在线视频 | 国产二区在线播放 | 国产黄色视屏 | 亚洲免费国产 | av地址在线 | 福利视频一区二区三区 | 青青草91久久久久久久久 | 国产欧美一区二区三区在线看蜜臀 | 海角官网| 女av在线 | ,亚洲人成毛片在线播放 | 日本视频免费在线 | 国产一区二区三区在线看 | 长篇乱肉合集乱500小说日本 | 亲切的金子餐桌片段的金子 | 色吧综合网 | 白洁av| 一边摸一边抽搐一进一出视频 | 天堂va蜜桃一区 | 成人av一区二区三区在线观看 | 春草| 天天干夜夜撸 | 一级黄色大片网站 | 久久精品爱 | 亚洲无毛 | 日韩精品高清在线 | 久草免费在线播放 |