我希望讀這篇文章的人都過得很好。這是我想知道的一個場景:有一個全局 ClientConn 用于對服務器的所有 grpc 請求。然后那個服務器宕機了。我想知道是否有一種方法可以等待此服務器超時,以便在這種情況下使用 grpc 對故障(瞬態故障或服務器停機)更具彈性。我在想,如果 clientConn 狀態正在連接或暫時性故障,并且如果在 clientConn 狀態是暫時性故障時發生超時,則繼續循環,然后返回錯誤,因為服務器可能已關閉。我想知道如果客戶端有多個請求需要這個 ClientConn 那么這是否可行,那么多個 go 例程將運行這個循環。將不勝感激任何其他選擇、建議或忠告。
1 回答

慕虎7371278
TA貢獻1802條經驗 獲得超4個贊
當您調用grpc.Dial
連接到服務器并收到一個grpc.ClientConn
時,它會自動為您處理重新連接。當您調用方法或請求流時,如果無法連接到服務器或處理請求時出錯,它將失敗。
如果錯誤表明是網絡問題,您可以重試幾次。您可以在此處查看 grpc 狀態代碼https://github.com/grpc/grpc-go/blob/master/codes/codes.go#L31并使用以下方法從返回的錯誤中提取它們status.FromError
:https://pkg.go .dev/google.golang.org/grpc/status#FromError
您還可以grpc.WaitForReady
選擇 ( https://pkg.go.dev/google.golang.org/grpc#WaitForReady ),如果它處于暫時性故障,可用于阻止 grpc 調用,直到服務器準備就緒。在那種情況下,您不需要重試,但您可能應該添加一個超時來取消上下文以控制您保持阻塞的時間。
如果您甚至想避免嘗試調用服務器,您可以使用ClientConn.WaitForStateChange
(這是實驗性的)來檢測任何狀態更改并調用ClientConn.GetState
以確定連接處于什么狀態,以了解何時可以安全地再次開始調用服務器。
- 1 回答
- 0 關注
- 287 瀏覽
添加回答
舉報
0/150
提交
取消