成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

云原生系統之彈性模式

云計算 云原生
在分布式體系結構中,當服務B不響應來自服務A的網絡請求會發生什么?當服務C暫時不可用,其他調用C的服務被阻塞時該怎么辦?”

[[410918]]

本文轉載自微信公眾號「精益碼農」,作者小碼甲 。轉載本文請聯系精益碼農公眾號。

大綱

1.云原生系統的彈性模式resiliency pattern

  • 1.1 服務故障的雪崩效應
  • 1.2 回應之前云原生--彈性請求的疑問?

2. 彈性模式:作用在下游請求消息上

3. 短期中斷的響應碼

4. Polly經典策略

5. Golang 斷路器模式

德國哲學家尼采說過:那些殺不死我的東西,只會讓我更加強大。

01云原生系統的彈性模式

結合最近的工作經驗,本次繼續聊一聊云原生的彈性模式 (resilience not scale), 這也是回應《現代云原生設計理念》中

“在分布式體系結構中,當服務B不響應來自服務A的網絡請求會發生什么?

當服務C暫時不可用,其他調用C的服務被阻塞時該怎么辦?”

由于網絡原因或自身原因,B、C服務不能及時響應,服務A發起的請求將被阻塞(直到B、C響應),此時若大量請求涌入,服務A的線程資源將被消耗殆盡,服務A的處理性能受到極大影響,進而影響下游依賴的external clients/backend srv。

故障會傳播,造成連鎖反應,對整個分布式結構造成災難性后果,這就是服務故障的“雪崩效應”。

當B、C服務不可用,下游客戶端/backend srv能做什么?

客觀上請求不通,執行預定的彈性策略:重試/斷路?

02彈性模式:作用在下游的請求消息上

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

Polly是一個全面的.NET彈性和瞬時錯誤處理庫,允許開發者以流暢和線程安全的方式表達彈性策略。

策略 場景 行為
Retry 抖動/瞬時錯誤,短時間內自動恢復 在特定操作上配置重試行為
Circuit Breaker 在短期內不大可能恢復 當故障超過閾值,在一段時間內快速失敗
Timeout   限制調用者等待響應的時間
Bulkhead   將操作限制在固定的資源池,防止故障傳播
Cache   自動存儲響應
Bulkhead   一旦失敗,定義結構化的行為

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

其目的是補償暫時不可用的服務請求。

03短期中斷的響應碼

 

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

 

正確規范的響應碼能幫助開發者盡快確認故障。

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

04Polly的經典策略

  • Retry:對網絡抖動/瞬時錯誤可以執行retry策略(預期故障可以很快恢復),
  • Circuit Breaker:為避免無效重試導致的故障傳播,在特定時間內如果失敗次數到達閾值,斷路器打開(在一定時間內快速失敗);

同時啟動一個timer,斷路器進入半開模式(發出少量請求,請求成功則認為故障已經修復,進入關閉狀態,重置失敗計數器。)

  1. services.AddHttpClient("small"
  2.         //降級 
  3.         .AddPolicyHandler(Policy<HttpResponseMessage>.HandleInner<Exception>().FallbackAsync(new HttpResponseMessage(),async b => 
  4.         { 
  5.            // 1、降級打印異常 
  6.           Console.WriteLine($"服務開始降級,上游異常消息:{b.Exception.Message}"); 
  7.           // 2、降級后的數據 
  8.           b.Result.Content= new StringContent("請求太多,請稍后重試", 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,    // 打開斷路器之前失敗的次數 
  16.               TimeSpan.FromSeconds(20), // 斷路器的開啟的時間間隔 
  17.               (ex, ts) =>  //熔斷器開啟 
  18.               { 
  19.                   Console.WriteLine($"服務斷路器開啟,異常消息:{ex.Exception.Message}"); 
  20.                   Console.WriteLine($"服務斷路器開啟的時間:{ts.TotalSeconds}s"); 
  21.               },  
  22.               () => { Console.WriteLine($"服務斷路器重置"); },   //斷路器重置事件 
  23.               () => { Console.WriteLine($"服務斷路器半開啟(一會開,一會關)"); }  //斷路器半開啟事件 
  24.             ) 
  25.         ) 
  26.         //重試 
  27.         .AddPolicyHandler(Policy<HttpResponseMessage>.Handle<Exception>().RetryAsync(3)) 
  28.        // 超時  
  29.        .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(2)));  
  30.         

??當一個應用存在多個Http調用,按照上面的經典寫法,代碼中會混雜大量重復、與業務無關的口水代碼,

思考如何優雅的對批量HttpClient做彈性策略。

這里提供兩個實踐:

① 博客園馳名博主edisonchou: 使用AOP框架,動態織入Polly

② 某佚名大牛,使用反射加配置實現的PollyHttpClientServiceCollectionExtension擴展類, 支持在配置文件指定HttpClientName

[[410921]]

05Golang的斷路器

  1. go get github.com/sony/gobreaker 

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

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

下面這個示例演示了:請求谷歌網站,失敗比例達到60%,就切換到"打開"狀態,同時開啟60sTimer,到60s進入“半開”狀態(允許發起一個請求),如果成功, 斷路器進入"關閉"狀態;失敗則重新進入“打開”狀態,并重置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)) 

總結

本文記錄了云原生系統的彈性模式:通過預設策略直面失敗,補償暫時不可用的請求、避免故障傳播, 這對于實現微服務高可用、彈性容錯相當重要。

 

責任編輯:武曉燕 來源: 精益碼農
相關推薦

2023-08-30 16:22:03

云原生云計算

2023-09-13 11:58:17

云原生反模式

2023-07-26 16:20:36

云原生云計算

2023-07-13 15:24:13

云計算云原生架構

2020-03-04 09:56:56

網絡安全云原生容器

2023-08-22 15:40:12

云原生云計算

2022-08-18 17:58:38

華為云華為云TechWav云原生數據庫

2023-02-08 07:55:33

K8sHPA服務器

2022-09-07 21:43:34

云原生存儲技術消息隊列

2021-11-15 08:00:00

云原生端點漏洞

2022-05-26 15:02:35

Docker容器云原生

2010-05-06 14:38:09

云計算

2023-10-12 09:48:00

微服務工具

2014-11-17 15:16:34

2023-01-05 14:41:24

2023-02-17 13:08:31

2023-07-10 15:47:05

2022-12-26 08:14:57

K8sCronhpa定時彈性

2015-01-19 09:50:12

阿里云12306云計算

2024-06-25 13:02:25

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕精品一区二区三区精品 | 国产精品91网站 | 欧美黄a | 日韩影院一区 | 日韩中文字幕 | 九九热在线视频免费观看 | 欧美日韩国产一区二区三区 | 国产一区二区免费电影 | 激情毛片 | 男女视频在线观看网站 | 精品视频99 | 亚洲精品乱码久久久久v最新版 | 国产精品福利在线观看 | 在线播放中文字幕 | 精品国产一区二区国模嫣然 | 日韩成人av在线播放 | 精品国产1区2区3区 一区二区手机在线 | 日韩在线观看精品 | 欧美a级成人淫片免费看 | 操久久| 欧美精品成人一区二区三区四区 | 精品av | 日韩精品一区二区三区中文在线 | 中文字幕国产视频 | 国产精品久久久久久久久久免费看 | 伊人在线 | 人人干人人超 | 日日天天| 久久中文视频 | 国产色在线| 久久另类视频 | 欧美综合一区二区三区 | 中文字幕日韩一区二区 | 在线观看国产三级 | 草草视频在线播放 | 国产精品自拍啪啪 | 久久久久国产精品 | av乱码| 国产高清在线观看 | 成人在线视频观看 | 久久久久久国产精品 |