偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

云原生系統(tǒng)之彈性模式

云計(jì)算 云原生
在分布式體系結(jié)構(gòu)中,當(dāng)服務(wù)B不響應(yīng)來自服務(wù)A的網(wǎng)絡(luò)請(qǐng)求會(huì)發(fā)生什么?當(dāng)服務(wù)C暫時(shí)不可用,其他調(diào)用C的服務(wù)被阻塞時(shí)該怎么辦?”

[[410918]]

本文轉(zhuǎn)載自微信公眾號(hào)「精益碼農(nóng)」,作者小碼甲 。轉(zhuǎn)載本文請(qǐng)聯(lián)系精益碼農(nóng)公眾號(hào)。

大綱

1.云原生系統(tǒng)的彈性模式resiliency pattern

  • 1.1 服務(wù)故障的雪崩效應(yīng)
  • 1.2 回應(yīng)之前云原生--彈性請(qǐng)求的疑問?

2. 彈性模式:作用在下游請(qǐng)求消息上

3. 短期中斷的響應(yīng)碼

4. Polly經(jīng)典策略

5. Golang 斷路器模式

德國哲學(xué)家尼采說過:那些殺不死我的東西,只會(huì)讓我更加強(qiáng)大。

01云原生系統(tǒng)的彈性模式

結(jié)合最近的工作經(jīng)驗(yàn),本次繼續(xù)聊一聊云原生的彈性模式 (resilience not scale), 這也是回應(yīng)《現(xiàn)代云原生設(shè)計(jì)理念》中

“在分布式體系結(jié)構(gòu)中,當(dāng)服務(wù)B不響應(yīng)來自服務(wù)A的網(wǎng)絡(luò)請(qǐng)求會(huì)發(fā)生什么?

當(dāng)服務(wù)C暫時(shí)不可用,其他調(diào)用C的服務(wù)被阻塞時(shí)該怎么辦?”

由于網(wǎng)絡(luò)原因或自身原因,B、C服務(wù)不能及時(shí)響應(yīng),服務(wù)A發(fā)起的請(qǐng)求將被阻塞(直到B、C響應(yīng)),此時(shí)若大量請(qǐng)求涌入,服務(wù)A的線程資源將被消耗殆盡,服務(wù)A的處理性能受到極大影響,進(jìn)而影響下游依賴的external clients/backend srv。

故障會(huì)傳播,造成連鎖反應(yīng),對(duì)整個(gè)分布式結(jié)構(gòu)造成災(zāi)難性后果,這就是服務(wù)故障的“雪崩效應(yīng)”。

當(dāng)B、C服務(wù)不可用,下游客戶端/backend srv能做什么?

客觀上請(qǐng)求不通,執(zhí)行預(yù)定的彈性策略:重試/斷路?

02彈性模式:作用在下游的請(qǐng)求消息上

彈性模式是系統(tǒng)面對(duì)故障仍然保持工作狀態(tài)的能力,它不是為了避免故障,而是接受故障并嘗試去面對(duì)它。

Polly是一個(gè)全面的.NET彈性和瞬時(shí)錯(cuò)誤處理庫,允許開發(fā)者以流暢和線程安全的方式表達(dá)彈性策略。

策略 場景 行為
Retry 抖動(dòng)/瞬時(shí)錯(cuò)誤,短時(shí)間內(nèi)自動(dòng)恢復(fù) 在特定操作上配置重試行為
Circuit Breaker 在短期內(nèi)不大可能恢復(fù) 當(dāng)故障超過閾值,在一段時(shí)間內(nèi)快速失敗
Timeout   限制調(diào)用者等待響應(yīng)的時(shí)間
Bulkhead   將操作限制在固定的資源池,防止故障傳播
Cache   自動(dòng)存儲(chǔ)響應(yīng)
Bulkhead   一旦失敗,定義結(jié)構(gòu)化的行為

一般將彈性策略作用到各種請(qǐng)求消息上(外部客戶端請(qǐng)求或后端服務(wù)請(qǐng)求)。

其目的是補(bǔ)償暫時(shí)不可用的服務(wù)請(qǐng)求。

03短期中斷的響應(yīng)碼

 

Http Status code 原因
404 not found
408 request timeout
429 two many requests
502 bad gateway
503 service unavailable
504 gateway timeout

 

正確規(guī)范的響應(yīng)碼能幫助開發(fā)者盡快確認(rèn)故障。

執(zhí)行故障策略時(shí),也能有的放矢,比如只重試那些由失敗引起的操作,對(duì)于403UnAuthorized不可重試。

04Polly的經(jīng)典策略

  • Retry:對(duì)網(wǎng)絡(luò)抖動(dòng)/瞬時(shí)錯(cuò)誤可以執(zhí)行retry策略(預(yù)期故障可以很快恢復(fù)),
  • Circuit Breaker:為避免無效重試導(dǎo)致的故障傳播,在特定時(shí)間內(nèi)如果失敗次數(shù)到達(dá)閾值,斷路器打開(在一定時(shí)間內(nèi)快速失敗);

同時(shí)啟動(dòng)一個(gè)timer,斷路器進(jìn)入半開模式(發(fā)出少量請(qǐng)求,請(qǐng)求成功則認(rèn)為故障已經(jīng)修復(fù),進(jìn)入關(guān)閉狀態(tài),重置失敗計(jì)數(shù)器。)

  1. services.AddHttpClient("small"
  2.         //降級(jí) 
  3.         .AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(new HttpResponseMessage(),async b => 
  4.         { 
  5.            // 1、降級(jí)打印異常 
  6.           Console.WriteLine($"服務(wù)開始降級(jí),上游異常消息:{b.Exception.Message}"); 
  7.           // 2、降級(jí)后的數(shù)據(jù) 
  8.           b.Result.Content= new StringContent("請(qǐng)求太多,請(qǐng)稍后重試", Encoding.UTF8, "text/html"); 
  9.           b.Result.StatusCode = HttpStatusCode.TooManyRequests; 
  10.           await Task.CompletedTask; 
  11.         })) 
  12.         //熔斷                                                       
  13.         .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>()  
  14.            .CircuitBreakerAsync( 
  15.               3,    // 打開斷路器之前失敗的次數(shù) 
  16.               TimeSpan.FromSeconds(20), // 斷路器的開啟的時(shí)間間隔 
  17.               (ex, ts) =>  //熔斷器開啟 
  18.               { 
  19.                   Console.WriteLine($"服務(wù)斷路器開啟,異常消息:{ex.Exception.Message}"); 
  20.                   Console.WriteLine($"服務(wù)斷路器開啟的時(shí)間:{ts.TotalSeconds}s"); 
  21.               },  
  22.               () => { Console.WriteLine($"服務(wù)斷路器重置"); },   //斷路器重置事件 
  23.               () => { Console.WriteLine($"服務(wù)斷路器半開啟(一會(huì)開,一會(huì)關(guān))"); }  //斷路器半開啟事件 
  24.             ) 
  25.         ) 
  26.         //重試 
  27.         .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().RetryAsync(3)) 
  28.        // 超時(shí)  
  29.        .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(2)));  
  30.         

??當(dāng)一個(gè)應(yīng)用存在多個(gè)Http調(diào)用,按照上面的經(jīng)典寫法,代碼中會(huì)混雜大量重復(fù)、與業(yè)務(wù)無關(guān)的口水代碼,

思考如何優(yōu)雅的對(duì)批量HttpClient做彈性策略。

這里提供兩個(gè)實(shí)踐:

① 博客園馳名博主edisonchou: 使用AOP框架,動(dòng)態(tài)織入Polly

② 某佚名大牛,使用反射加配置實(shí)現(xiàn)的PollyHttpClientServiceCollectionExtension擴(kuò)展類, 支持在配置文件指定HttpClientName

[[410921]]

05Golang的斷路器

  1. go get github.com/sony/gobreaker 

func NewCircuitBreaker(st Settings) *CircuitBreaker 實(shí)例化斷路器對(duì)象, 參數(shù)如下:

  1. type Settings struct { 
  2.     Name          string 
  3.     MaxRequests   uint32       #半開狀態(tài)允許的最大請(qǐng)求數(shù)量,默認(rèn)為0,允許1個(gè)請(qǐng)求 
  4.     Interval      time.Duration 
  5.     Timeout       time.Duration  # 斷路器進(jìn)入半開狀態(tài)的間隔,默認(rèn)60s 
  6.     ReadyToTrip   func(counts Counts) bool   # 切換狀態(tài)的邏輯 
  7.     OnStateChange func(name string, from State, to State) 

下面這個(gè)示例演示了:請(qǐng)求谷歌網(wǎng)站,失敗比例達(dá)到60%,就切換到"打開"狀態(tài),同時(shí)開啟60sTimer,到60s進(jìn)入“半開”狀態(tài)(允許發(fā)起一個(gè)請(qǐng)求),如果成功, 斷路器進(jìn)入"關(guān)閉"狀態(tài);失敗則重新進(jìn)入“打開”狀態(tài),并重置60sTimer

  1. package main 
  2. import ( 
  3.     "fmt" 
  4.     "io/ioutil" 
  5.     "log" 
  6.     "net/http" 
  7.     "github.com/sony/gobreaker" 
  8. var cb *gobreaker.CircuitBreaker 
  9. func init() { 
  10.     var st gobreaker.Settings 
  11.     st.Name = "HTTP GET" 
  12.     st.ReadyToTrip = func(counts gobreaker.Counts) bool { 
  13.         failureRatio := float64(counts.TotalFailures) / float64(counts.Requests) 
  14.         return counts.Requests >= 3 && failureRatio >= 0.6 
  15.     } 
  16.     cb = gobreaker.NewCircuitBreaker(st) 
  17. // Get wraps http.Get in CircuitBreaker. 
  18. func Get(url string) ([]byte, error) { 
  19.     body, err := cb.Execute(func() (interface{}, error) { 
  20.         resp, err := http.Get(url) 
  21.         if err != nil { 
  22.             return nil, err 
  23.         } 
  24.         defer resp.Body.Close() 
  25.         body, err := ioutil.ReadAll(resp.Body) 
  26.         if err != nil { 
  27.             return nil, err 
  28.         } 
  29.         return body, nil 
  30.     }) 
  31.     if err != nil { 
  32.         return nil, err 
  33.     } 
  34.     return body.([]byte), nil 
  35. func main() { 
  36.     body, err := Get("http://www.google.com/robots.txt"
  37.     if err != nil { 
  38.         log.Fatal(err) 
  39.     } 
  40.     fmt.Println(string(body)) 

總結(jié)

本文記錄了云原生系統(tǒng)的彈性模式:通過預(yù)設(shè)策略直面失敗,補(bǔ)償暫時(shí)不可用的請(qǐng)求、避免故障傳播, 這對(duì)于實(shí)現(xiàn)微服務(wù)高可用、彈性容錯(cuò)相當(dāng)重要。

 

責(zé)任編輯:武曉燕 來源: 精益碼農(nóng)
相關(guān)推薦

2023-08-30 16:22:03

云原生云計(jì)算

2023-09-13 11:58:17

云原生反模式

2023-07-26 16:20:36

云原生云計(jì)算

2023-07-13 15:24:13

云計(jì)算云原生架構(gòu)

2023-08-22 15:40:12

云原生云計(jì)算

2020-03-04 09:56:56

網(wǎng)絡(luò)安全云原生容器

2022-08-18 17:58:38

華為云華為云TechWav云原生數(shù)據(jù)庫

2023-02-08 07:55:33

K8sHPA服務(wù)器

2022-09-07 21:43:34

云原生存儲(chǔ)技術(shù)消息隊(duì)列

2021-11-15 08:00:00

云原生端點(diǎn)漏洞

2022-05-26 15:02:35

Docker容器云原生

2023-10-12 09:48:00

微服務(wù)工具

2023-01-05 14:41:24

2014-11-17 15:16:34

2010-05-06 14:38:09

云計(jì)算

2023-02-17 13:08:31

2023-07-10 15:47:05

2022-12-26 08:14:57

K8sCronhpa定時(shí)彈性

2015-01-19 09:50:12

阿里云12306云計(jì)算

2024-06-25 13:02:25

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)