GogRPC超時(shí)控制Deadlines用法詳解_第1頁
GogRPC超時(shí)控制Deadlines用法詳解_第2頁
GogRPC超時(shí)控制Deadlines用法詳解_第3頁
GogRPC超時(shí)控制Deadlines用法詳解_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第GogRPC超時(shí)控制Deadlines用法詳解目錄Deadlines為什么要設(shè)置gRPCClientServer驗(yàn)證總結(jié)

Deadlines

今天將介紹gRPCDeadlines的用法,這一個(gè)必備技巧。內(nèi)容也比較簡單。

Deadlines意指截止時(shí)間,在gRPC中強(qiáng)調(diào)TL;DR(Toolong,Dontread)并建議始終設(shè)定截止日期,為什么呢?

為什么要設(shè)置

當(dāng)未設(shè)置Deadlines時(shí),將采用默認(rèn)的DEADLINE_EXCEEDED(這個(gè)時(shí)間非常大)

如果產(chǎn)生了阻塞等待,就會(huì)造成大量正在進(jìn)行的請求都會(huì)被保留,并且所有請求都有可能達(dá)到最大超時(shí)

這會(huì)使服務(wù)面臨資源耗盡的風(fēng)險(xiǎn),例如內(nèi)存,這會(huì)增加服務(wù)的延遲,或者在最壞的情況下可能導(dǎo)致整個(gè)進(jìn)程崩潰

gRPC

Client

funcmain(){

ctx,cancel:=context.WithDeadline(context.Background(),time.Now().Add(time.Duration(5*time.Second)))

defercancel()

client:=pb.NewSearchServiceClient(conn)

resp,err:=client.Search(ctx,amp;pb.SearchRequest{

Request:"gRPC",

iferr!=nil{

statusErr,ok:=status.FromError(err)

ifok{

ifstatusErr.Code()==codes.DeadlineExceeded{

log.Fatalln("client.Searcherr:deadline")

log.Fatalf("client.Searcherr:%v",err)

log.Printf("resp:%s",resp.GetResponse())

context.WithDeadline:會(huì)返回最終上下文截止時(shí)間。第一個(gè)形參為父上下文,第二個(gè)形參為調(diào)整的截止時(shí)間。若父級時(shí)間早于子級時(shí)間,則以父級時(shí)間為準(zhǔn),否則以子級時(shí)間為最終截止時(shí)間

funcWithDeadline(parentContext,dtime.Time)(Context,CancelFunc){

ifcur,ok:=parent.Deadline();okamp;amp;cur.Before(d){

//Thecurrentdeadlineisalreadysoonerthanthenewone.

returnWithCancel(parent)

c:=amp;timerCtx{

cancelCtx:newCancelCtx(parent),

deadline:d,

propagateCancel(parent,c)

dur:=time.Until(d)

ifdur=0{

c.cancel(true,DeadlineExceeded)//deadlinehasalreadypassed

returnc,func(){c.cancel(true,Canceled)}

c.mu.Lock()

deferc.mu.Unlock()

ifc.err==nil{

c.timer=time.AfterFunc(dur,func(){

c.cancel(true,DeadlineExceeded)

returnc,func(){c.cancel(true,Canceled)}

context.WithTimeout:很常見的另外一個(gè)方法,是便捷操作。實(shí)際上是對于WithDeadline的封裝

funcWithTimeout(parentContext,timeouttime.Duration)(Context,CancelFunc){

returnWithDeadline(parent,time.Now().Add(timeout))

status.FromError:返回GRPCStatus的具體錯(cuò)誤碼,若為非法,則直接返回codes.Unknown

Server

typeSearchServicestruct{}

func(s*SearchService)Search(ctxcontext.Context,r*pb.SearchRequest)(*pb.SearchResponse,error){

fori:=0;ii++{

ifctx.Err()==context.Canceled{

returnnil,status.Errorf(codes.Canceled,"SearchService.Searchcanceled")

time.Sleep(1*time.Second)

returnpb.SearchResponse{Response:r.GetRequest()+"Server"},nil

funcmain(){

而在Server端,由于Client已經(jīng)設(shè)置了截止時(shí)間。Serve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論