自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你了解微服務(wù)的超時(shí)傳遞嗎?

開(kāi)發(fā) 架構(gòu)
很多連鎖故障的場(chǎng)景下的一個(gè)常見(jiàn)問(wèn)題是服務(wù)器正在消耗大量資源處理那些早已經(jīng)超過(guò)客戶端截止時(shí)間的請(qǐng)求,這樣的結(jié)果是,服務(wù)器消耗大量資源沒(méi)有做任何有價(jià)值的工作,回復(fù)已經(jīng)超時(shí)的請(qǐng)求是沒(méi)有任何意義的。

[[429473]]

本文轉(zhuǎn)載自微信公眾號(hào)「微服務(wù)實(shí)踐」,作者zhoushuguang。轉(zhuǎn)載本文請(qǐng)聯(lián)系微服務(wù)實(shí)踐公眾號(hào)。

為什么需要超時(shí)控制?

很多連鎖故障的場(chǎng)景下的一個(gè)常見(jiàn)問(wèn)題是服務(wù)器正在消耗大量資源處理那些早已經(jīng)超過(guò)客戶端截止時(shí)間的請(qǐng)求,這樣的結(jié)果是,服務(wù)器消耗大量資源沒(méi)有做任何有價(jià)值的工作,回復(fù)已經(jīng)超時(shí)的請(qǐng)求是沒(méi)有任何意義的。

超時(shí)控制可以說(shuō)是保證服務(wù)穩(wěn)定性的一道重要的防線,它的本質(zhì)是快速失敗(fail fast),良好的超時(shí)控制策略可以盡快清空高延遲的請(qǐng)求,盡快釋放資源避免請(qǐng)求的堆積。

服務(wù)間超時(shí)傳遞

如果一個(gè)請(qǐng)求有多個(gè)階段,比如由一系列 RPC 調(diào)用組成,那么我們的服務(wù)應(yīng)該在每個(gè)階段開(kāi)始前檢查截止時(shí)間以避免做無(wú)用功,也就是要檢查是否還有足夠的剩余時(shí)間處理請(qǐng)求。

一個(gè)常見(jiàn)的錯(cuò)誤實(shí)現(xiàn)方式是在每個(gè) RPC 服務(wù)設(shè)置一個(gè)固定的超時(shí)時(shí)間,我們應(yīng)該在每個(gè)服務(wù)間傳遞超時(shí)時(shí)間,超時(shí)時(shí)間可以在服務(wù)調(diào)用的最上層設(shè)置,由初始請(qǐng)求觸發(fā)的整個(gè) RPC 樹(shù)會(huì)設(shè)置同樣的絕對(duì)截止時(shí)間。例如,在服務(wù)請(qǐng)求的最上層設(shè)置超時(shí)時(shí)間為3s,服務(wù)A請(qǐng)求服務(wù)B,服務(wù)B執(zhí)行耗時(shí)為1s,服務(wù)B再請(qǐng)求服務(wù)C這時(shí)超時(shí)時(shí)間剩余2s,服務(wù)C執(zhí)行耗時(shí)為1s,這時(shí)服務(wù)C再請(qǐng)求服務(wù)D,服務(wù)D執(zhí)行耗時(shí)為500ms,以此類推,理想情況下在整個(gè)調(diào)用鏈里都采用相同的超時(shí)傳遞機(jī)制。

如果不采用超時(shí)傳遞機(jī)制,那么就會(huì)出現(xiàn)如下情況:

  • 服務(wù)A給服務(wù)B發(fā)送一個(gè)請(qǐng)求,設(shè)置的超時(shí)時(shí)間為3s
  • 服務(wù)B處理請(qǐng)求耗時(shí)為2s,并且繼續(xù)請(qǐng)求服務(wù)C
  • 如果使用了超時(shí)傳遞那么服務(wù)C的超時(shí)時(shí)間應(yīng)該為1s,但這里沒(méi)有采用超時(shí)傳遞所以超時(shí)時(shí)間為在配置中寫(xiě)死的3s
  • 服務(wù)C繼續(xù)執(zhí)行耗時(shí)為2s,其實(shí)這時(shí)候最上層設(shè)置的超時(shí)時(shí)間已截止,如下的請(qǐng)求無(wú)意義
  • 繼續(xù)請(qǐng)求服務(wù)D

如果服務(wù)B采用了超時(shí)傳遞機(jī)制,那么在服務(wù)C就應(yīng)該立刻放棄該請(qǐng)求,因?yàn)橐呀?jīng)到了截止時(shí)間,客戶端可能已經(jīng)報(bào)錯(cuò)。我們?cè)谠O(shè)置超時(shí)傳遞的時(shí)候一般會(huì)將傳遞出去的截止時(shí)間減少一點(diǎn),比如100毫秒,以便將網(wǎng)絡(luò)傳輸時(shí)間和客戶端收到回復(fù)之后的處理時(shí)間考慮在內(nèi)。

進(jìn)程內(nèi)超時(shí)傳遞

不光服務(wù)間需要超時(shí)傳遞進(jìn)程內(nèi)同樣需要進(jìn)行超時(shí)傳遞,比如在一個(gè)進(jìn)程內(nèi)串行的調(diào)用了Mysql、Redis和服務(wù)B,設(shè)置總的請(qǐng)求時(shí)間為3s,請(qǐng)求Mysql耗時(shí)1s后再次請(qǐng)求Redis這時(shí)的超時(shí)時(shí)間為2s,Redis執(zhí)行耗時(shí)500ms再請(qǐng)求服務(wù)B這時(shí)候超時(shí)時(shí)間為1.5s,因?yàn)槲覀兊拿總€(gè)中間件或者服務(wù)都會(huì)在配置文件中設(shè)置一個(gè)固定的超時(shí)時(shí)間,我們需要取剩余時(shí)間和設(shè)置時(shí)間中的最小值。

context實(shí)現(xiàn)超時(shí)傳遞

context原理非常簡(jiǎn)單,但功能卻非常強(qiáng)大,go的標(biāo)準(zhǔn)庫(kù)也都已實(shí)現(xiàn)了對(duì)context的支持,各種開(kāi)源的框架也實(shí)現(xiàn)了對(duì)context的支持,context已然成為了標(biāo)準(zhǔn),超時(shí)傳遞也依賴context來(lái)實(shí)現(xiàn)。

我們一般在服務(wù)的最上層通過(guò)設(shè)置初始context進(jìn)行超時(shí)控制傳遞,比如設(shè)置超時(shí)時(shí)間為3s

  1. ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) 
  2. defer cancel() 

當(dāng)進(jìn)行context傳遞的時(shí)候,比如上圖中請(qǐng)求Redis,那么通過(guò)如下方式獲取剩余時(shí)間,然后對(duì)比Redis設(shè)置的超時(shí)時(shí)間取較小的時(shí)間

  1. dl, ok := ctx.Deadline() 
  2. timeout := time.Now().Add(time.Second * 3) 
  3. if ok := dl.Before(timeout); ok { 
  4.  timeout = dl 

服務(wù)間超時(shí)傳遞主要是指 RPC 調(diào)用時(shí)候的超時(shí)傳遞,對(duì)于 gRPC 來(lái)說(shuō)并不需要要我們做額外的處理,gRPC 本身就支持超時(shí)傳遞,原理和上面差不多,是通過(guò) metadata 進(jìn)行傳遞,最終會(huì)被轉(zhuǎn)化為 grpc-timeout 的值,如下代碼所示 grpc-go/internal/transport/handler_server.go:79

  1. if v := r.Header.Get("grpc-timeout"); v != "" { 
  2.   to, err := decodeTimeout(v) 
  3.   if err != nil { 
  4.    return nil, status.Errorf(codes.Internal, "malformed time-out: %v", err) 
  5.   } 
  6.   st.timeoutSet = true 
  7.   st.timeout = to 

超時(shí)傳遞是保證服務(wù)穩(wěn)定性的一道重要防線,原理和實(shí)現(xiàn)都非常簡(jiǎn)單,你們的框架中實(shí)現(xiàn)了超時(shí)傳遞了嗎?如果沒(méi)有的話就趕緊動(dòng)起手來(lái)吧。

go-zero 中的超時(shí)傳遞

go-zero 中可以通過(guò)配置文件中的 Timeout 配置 api gateway 和 rpc 服務(wù)的超時(shí),并且會(huì)在服務(wù)間自動(dòng)傳遞。

之前的 一文搞懂如何實(shí)現(xiàn) Go 超時(shí)控制 里面有講解超時(shí)控制如何使用。

參考

《SRE:Google運(yùn)維解密》

項(xiàng)目地址

 

https://github.com/zeromicro/go-zero

 

責(zé)任編輯:武曉燕 來(lái)源: 微服務(wù)實(shí)踐
相關(guān)推薦

2024-06-04 07:58:31

架構(gòu)本質(zhì)微服務(wù)

2016-09-26 14:45:46

微服務(wù)

2024-05-10 08:46:13

微服務(wù)架構(gòu)技術(shù)

2022-11-11 17:09:55

微服務(wù)RPC

2018-10-28 18:09:22

微服務(wù)Microservic架構(gòu)

2018-03-19 09:13:16

2018-07-30 08:23:30

微服務(wù)架構(gòu)設(shè)計(jì)

2024-05-17 16:18:45

微服務(wù)灰度發(fā)布金絲雀發(fā)布

2019-10-31 08:36:59

線程內(nèi)存操作系統(tǒng)

2012-09-27 10:24:22

監(jiān)控機(jī)房

2012-09-06 17:54:28

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫(kù)

2014-04-17 16:42:03

DevOps

2025-01-03 08:09:15

2010-09-07 14:54:01

PPP幀中繼

2023-11-09 08:22:38

2012-02-06 13:52:33

JavaScript

2018-11-21 09:32:10

IT云計(jì)算

2023-01-07 10:17:06

微服務(wù)架構(gòu)模式

2024-06-12 08:05:06

點(diǎn)贊
收藏

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