婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang在GRPC中設置client的超時時間

golang在GRPC中設置client的超時時間

熱門標簽:外呼系統顯本地手機號 阿克蘇地圖標注 百度地圖標注后傳給手機 外呼系統用什么卡 壽光微信地圖標注 涿州代理外呼系統 評價高的400電話辦理 電話機器人軟件免費 excel地圖標注分布數據

超時

建立連接

主要就2函數Dail和DialContext。

// Dial creates a client connection to the given target.
func Dial(target string, opts ...DialOption) (*ClientConn, error) {
    return DialContext(context.Background(), target, opts...)
}
func DialContext(ctx context.Context, target string, opts ...DialOption) (conn *ClientConn, err error){...}

DialContext 太長了不帖了.看Dial實際上也是調用DialContext來實現的.如果你想在建立連接的時候使用超時控制.就使用

DialContext傳入一個Timeout的context,就像下面的例子

ctx1, cel := context.WithTimeout(context.Background(), time.Second*3)
defer cel()
conn, err := grpc.DialContext(ctx1, address, grpc.WithBlock(), grpc.WithInsecure())

另外調用Dial建立連接默認只是返回一個ClientConn的指針,相當于new了一個ClientConn 把指針返回給你。并不是一定要建立真實的h2連接.至于真實的連接建立實際上是一個異步的過程。

當然了如果你想等真實的鏈接完全建立再返回ClientConn可以通過WithBlock傳入Options來實現,當然了這樣的話鏈接如果建立不成功就會一直阻塞直到Contex超時。

真正的建立鏈接的代碼后面介紹重試的時候會再詳細介紹。

調用超時

這個比較簡單

ctx, cancel := context.WithTimeout(context.TODO(), time.Second*3)
defer cancel()
 r, err := c.SayHello(ctx, pb.HelloRequest{Name: name})

如上代碼傳入一個timeout context就可以。

Server

type SearchService struct{}
 
func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) {
    for i := 0; i  5; i++  {
        if ctx.Err() == context.Canceled {
            return nil, status.Errorf(codes.Canceled, "SearchService.Search canceled")
        }
 
        time.Sleep(1 * time.Second)
    }
 
    return pb.SearchResponse{Response: r.GetRequest() + " Server"}, nil
}
 
func main() {
    ...
}

而在 Server 端,由于 Client 已經設置了截止時間。Server 勢必要去檢測它

否則如果 Client 已經結束掉了,Server 還傻傻的在那執行,這對資源是一種極大的浪費

因此在這里需要用 ctx.Err() == context.Canceled 進行判斷,為了模擬場景我們加了循環和睡眠 ?

驗證

重新啟動 server.go 和 client.go,得到結果:

$ go run client.go
2018/10/06 17:45:55 client.Search err: deadline
exit status 1

總結

本章節比較簡單,你需要知道以下知識點:

怎么設置 Deadlines

為什么要設置 Deadlines

你要清楚地明白到,gRPC Deadlines 是很重要的,否則這小小的功能點就會要了你生產的命。

補充:golang使用grpc超時控制和對沖策略

超時控制

grcp超時控制設置在客戶端調用服務時,如果設定了超時時間,客戶端會立即返回超時。超時控制一般有三個因素:鏈路超時:上有調用端通過協議字段把自己允許的超時時間傳給當前服務,表示在該時間內返回數據,超時返回已無意義。流程如下圖A調用B的總超時情況。

消息超時:服務端收到請求消息到返回響應數據的最長消息處理時間。下圖的B內部的當前請求整體超時時間。調用超時:當前服務調用下游服務設置的每一個rpc請求的超時時間。如下圖B調用C的單個超時時間。通常一次請求會連續調用多次rpc,這個調用超時控制的是每個rpc的獨立超時時間。

發起rpc調用請求時,需要計算此次rpc調用的超時時間。真正生效的超時時間是通過以上三個因素實時計算的最小值,計算過程

如下:

1、首先計算鏈路超時和消息超時的最小值,如鏈路超時2s,消息超時1s,則當前消息的最長處理時間為1s。

2、發起rpc調用時,再次計算當前消息最長處理時間和單個超時時間的最小值,比如:上圖的B->C設置的單個超時時間為5s,則實際上B調用C的真實超時仍然是1s,其實只要超時時間大于當前最長處理時間都是無效的,都會取最小值。再比如B->C單個超時時間為500ms,這種情況B調用C的真實超時即為500ms,此時500ms這個值也會通過協議字段傳給C,在服務端C的視角來看就是他的鏈路超時時間。鏈路超時時間會在整個rpc調用鏈上一直傳遞下去,并逐漸減少,直至為0,這樣避免出現死循環調用的問題。

3、因為每一次rpc調用都會實際消耗一部分時間,所以當前消息最長處理時間需要實時計算剩余時間,比如上面B調用C真實耗時200ms,此時最長處理時間就只剩下800ms了。此時發起第二次rpc調用時,則需要計算此時剩余的消息超時時間和單個調用時間的最小值。如上圖的B->D設置的單個超時時間為1s,則實際生效的超時時間仍然為800ms。鏈路超時設置:golang的context.Context根據協議里面的timeout字段和框架配置的timeout字段。設置好當前請求的最長處理時間,然后交給用戶使用,并在處理函數結束時會立馬cancel掉當前context。所以在創建新的goroutine時,需要重新設定新的context。

對沖策略

對沖策略不是被動的等待上一次請求超時或者失敗,在對沖延時時間內(或小于超時時間)如果沒有收到回復的包就會再觸發一個請求。

與重試策略不同的是同一時間內in-fliaght可能有多個,當接收到第一回復時,其他的回復會被忽略。

一、重試策略:

對失敗的請求,進行重新請求。

由圖中可以看出,client一共進行了三次請求,前兩次均失敗,并且在重新請求時都會隨機避段時間,防止請求毛刺,第三次請求成功,返回給應用層。對于每次嘗試,我們都會盡可能地將請求發往不同的節點。

通常重試策略有三種配置:

1、失敗重新請求的最大次數,達到最大次數仍然失敗,不再進行重試;

2、退避時間:退避時間取的是 random(0, delay);

3、可重試錯誤碼:設置可錯誤碼,對于不可重試的,立即停止重試并將錯誤返回應用層。

二、對沖策略

上圖中client一共進行了4次,橙、藍、綠、紫

橙色是第一次嘗試。在由 client 發起后,server2 很快便收到了。但是 server2 的因為網絡等問題,直到綠色請求成功,并返回給應用層后,它的正確回包才姍姍來遲。盡管它成功了,但我們必須丟棄它,因為我們已經將另一個成功的回包返回給應用層了。

藍色是第二次嘗試。因為橙色請求在對沖時延(hedging delay)后還沒有回包,因此我們發起了一次新的嘗試。這次嘗試選擇了 server1(我們會盡可能地為每次嘗試選擇不同的節點)。藍色嘗試的回包比較快,在對沖時延之前便返回了。但是卻失敗了。我們立刻發起了新一次嘗試。

綠色是第三次嘗試。盡管它的回包可能有點慢(超過了對沖時延,因此又觸發了一次新的嘗試),但是它成功了!一旦我們收到第一個成功的回包,便立刻將它返回給了應用層。

紫色是第四次嘗試。剛發起后,我們便收到了綠色成功的回包。對紫色來說,它可能處于很多狀態:請求還在 client gRPC 內,這時,我們有機會取消它;請求已經進入了 client 的內核或者已經由網卡發出,無論如何,我們已經沒有機會取消它了。紫色請求上的 ✘ 表示我們會盡可能地取消紫色請求。注意,即使紫色請求最終成功地到達了 server2,它的回包也會像橙色一樣被丟棄。

由以上可知對沖策略更像是添加了等待時間的重試,但是他沒有退避機制,一旦收到錯誤的包,立刻發起重試。這種對于需要解決長尾問題時推薦使用,一般情況建議使用重試策略。

對沖策略一般有三種配置

1、對沖延時:在對對沖時延內沒有收到回包時便會立刻發起新的嘗試;

2、最大請求次數:一旦耗盡,便等待并返回最后一個回包,無論它是否成功或失敗;

3、非致命錯誤:返回致命錯誤會立刻中止對沖,等待并返回最后一個回包,無論它是否成功或失敗。返回非致命錯誤會立刻觸發一次新的嘗試(對沖時延計時器會被重置)。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 解決golang時間字符串轉time.Time的坑
  • golang時間處理工具箱now的使用詳解
  • golang time包做時間轉換操作
  • golang時間字符串和時間戳轉換的案例
  • golang 實現tcp server端和client端,并計算RTT時間操作
  • golang 實現時間戳和時間的轉化

標簽:蘭州 欽州 汕頭 雞西 吐魯番 銅川 重慶 梅河口

巨人網絡通訊聲明:本文標題《golang在GRPC中設置client的超時時間》,本文關鍵詞  golang,在,GRPC,中,設置,client,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang在GRPC中設置client的超時時間》相關的同類信息!
  • 本頁收集關于golang在GRPC中設置client的超時時間的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕一区二区日韩精品绯色| 在线观看一区不卡| 欧美tickling挠脚心丨vk| 色综合久久久久网| 国产成人av电影免费在线观看| 亚洲精品免费在线观看| 欧美成人video| 欧美一区三区四区| 欧美绝品在线观看成人午夜影视| 成av人片一区二区| 国产成人啪免费观看软件| 久久精品国产99| 日韩国产欧美在线播放| 一级做a爱片久久| 亚洲欧美国产高清| 一区二区三区在线免费观看 | 色综合中文字幕| 久久99国产乱子伦精品免费| 亚洲国产一区视频| 亚洲人午夜精品天堂一二香蕉| 日韩欧美精品三级| 日韩午夜av一区| 精品久久久网站| 精品1区2区在线观看| 日韩一区二区三区免费看 | 精品毛片乱码1区2区3区| 欧美日韩aaa| 欧美色网一区二区| 日本乱人伦aⅴ精品| 亚洲摸摸操操av| 欧美电影免费观看高清完整版在线| 色老头久久综合| 99久久综合99久久综合网站| 精品在线视频一区| 亚洲v日本v欧美v久久精品| 亚洲一区在线观看免费观看电影高清| 中文字幕日韩av资源站| 中文字幕中文字幕一区| 国产成人高清视频| 韩国欧美一区二区| 国产在线视频一区二区三区| 久久99久久精品| 激情综合色丁香一区二区| 日本不卡视频在线| 爽好多水快深点欧美视频| 亚洲成人动漫一区| 午夜精品久久久| 免费成人av在线播放| 精品亚洲国产成人av制服丝袜| 精品一区二区三区在线观看| 国产1区2区3区精品美女| 成人av午夜电影| 97久久精品人人澡人人爽| 不卡的av电影| 欧美精品1区2区| 日韩欧美激情一区| 国产精品久久久久久久久果冻传媒 | 精品日韩欧美一区二区| 欧美一区二区视频在线观看 | 日韩限制级电影在线观看| 国产精品色眯眯| 亚洲国产精品久久不卡毛片| 另类欧美日韩国产在线| 国产麻豆精品在线观看| 色综合久久久久综合体桃花网| 欧美日本乱大交xxxxx| 精品日韩在线一区| 亚洲色图视频网| 午夜激情综合网| 国产精品资源在线| 色婷婷久久久综合中文字幕| 欧美zozo另类异族| 国产丝袜在线精品| 亚洲美女少妇撒尿| 国产成人一区在线| 欧美日韩精品三区| 国产欧美日韩精品一区| 五月婷婷综合网| 91丨porny丨国产| 日本一区二区动态图| 午夜精品久久久久久久| 色诱视频网站一区| 国产清纯在线一区二区www| 91精品国产综合久久香蕉麻豆| 中文字幕av一区二区三区| 日韩黄色免费电影| 欧美日韩一区二区三区视频| 久久免费午夜影院| 免费国产亚洲视频| 91久久人澡人人添人人爽欧美| 欧美本精品男人aⅴ天堂| 中文字幕欧美区| 国产成人综合在线播放| 极品美女销魂一区二区三区| 国产婷婷色一区二区三区在线| 美国三级日本三级久久99| 亚洲欧洲一区二区三区| 老司机午夜精品| 欧美日韩国产另类一区| 日本免费新一区视频| 久久人人超碰精品| 国产精品国产三级国产aⅴ原创| 欧美日韩免费高清一区色橹橹 | 亚洲mv在线观看| 亚洲精品一区二区三区福利| 日本高清成人免费播放| 91国产成人在线| 成人午夜视频在线观看| 亚洲123区在线观看| 色诱视频网站一区| 国产欧美精品一区二区色综合| 紧缚捆绑精品一区二区| 亚洲欧美日韩一区二区| 国内偷窥港台综合视频在线播放| 99re在线精品| 国产精品美女一区二区| 国产很黄免费观看久久| 欧美亚洲动漫精品| 午夜久久久久久久久| 7777精品伊人久久久大香线蕉经典版下载| 久久日一线二线三线suv| 亚洲在线视频网站| 欧美日韩和欧美的一区二区| 日本伊人午夜精品| 欧美日本在线视频| 毛片不卡一区二区| 91在线云播放| 一区二区三区四区视频精品免费| 午夜精品免费在线| 欧美区一区二区三区| 亚洲欧美色图小说| 欧美三级电影精品| 国产又黄又大久久| 久久久久99精品国产片| 成人国产精品免费| 亚洲欧洲美洲综合色网| 91亚洲国产成人精品一区二三| 中文字幕+乱码+中文字幕一区| www.欧美日韩国产在线| 亚洲成人精品在线观看| 中文字幕不卡在线播放| 精品视频色一区| 男女男精品视频网| 日韩一区中文字幕| 91成人在线免费观看| 精品一区二区在线视频| 亚洲国产高清在线观看视频| 精品毛片乱码1区2区3区| 99久久久国产精品免费蜜臀| 日韩精品一二三四| 亚洲图片激情小说| 日韩一区二区三区视频在线观看| 91精品国产色综合久久| 色久优优欧美色久优优| 精品一区二区三区在线观看国产| 亚洲成在线观看| 日本一区二区成人| 欧美色图在线观看| 91丨porny丨户外露出| 免费观看在线色综合| 中文字幕日韩欧美一区二区三区| 久久亚洲综合色| 91丨porny丨户外露出| 国产一区二三区| 无码av中文一区二区三区桃花岛| 中文字幕免费在线观看视频一区| 91精品欧美福利在线观看| 成人久久18免费网站麻豆| 久久精品国产999大香线蕉| 亚洲综合丝袜美腿| 日本一区二区三区四区| 日韩三级免费观看| 99免费精品在线| 久久99精品久久久| 成人欧美一区二区三区在线播放| 精品成人私密视频| 欧美性生活久久| 日韩精品专区在线| 精品国产百合女同互慰| 色欲综合视频天天天| 一本久久综合亚洲鲁鲁五月天 | 99这里都是精品| 不卡一区二区三区四区| 成人丝袜高跟foot| 亚洲午夜久久久久久久久电影院 | 精品蜜桃在线看| 91精品国产综合久久久久| 欧美在线观看一区| 日本精品视频一区二区| 在线观看亚洲一区| 欧美羞羞免费网站| 欧美视频精品在线| 欧美一二三区在线| 91在线免费看| 91精品国产入口| 欧美丰满嫩嫩电影| 精品国产乱码久久久久久浪潮| 欧美色综合天天久久综合精品| 欧美精品v国产精品v日韩精品| 欧美高清视频www夜色资源网|