天天看點

grpc health check

Health checks用于探測伺服器是否能夠處理rpc請求。用戶端到伺服器的運作狀況檢查可以通過點對點或某些控制系統進行。伺服器可能未準備好接受請求,正在關閉或其他原因,這時他會選擇答複“unhealthy”。如果在某個時間段内未收到響應或響應說不健康,則用戶端可以采取相應的措施。

GRPC服務可以用作簡單的用戶端到伺服器方案和其他控制系統(例如負載平衡)的運作狀況檢查機制。grpc作為一個進階服務有這麼些優點:第一,由于它本身是GRPC服務,是以進行健康檢查的格式與普通rpc相同。第二,它具有豐富的語義,例如每個服務的健康狀态。第三,作為GRPC服務,it is able reuse all the existing billing, quota infrastructure, 是以伺服器可以完全控制運作狀況檢查服務的通路。

服務定義

server端定義類似以下proto:

syntax = "proto3";

package grpc.health.v1;

message HealthCheckRequest {
  string service = 1;
}

message HealthCheckResponse {
  enum ServingStatus {
    UNKNOWN = 0;
    SERVING = 1;
    NOT_SERVING = 2;
  }
  ServingStatus status = 1;
}

service Health {
  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);

  rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
}
           

用戶端可以通過調用Check方法來查詢伺服器的運作狀況,并且應該給這個rpc上設定deadline。用戶端可以自己選擇設定要查詢的健康狀态的服務名稱。建議的服務名稱格式為package_names.ServiceName,例如grpc.health.v1.Health。

伺服器應手動注冊所有服務并為他們設定單獨的狀态,包括空服務名稱及其狀态。對于收到的每個請求,如果可以在系統資料庫中找到服務名稱,則必須以OK狀态(200)将響應發送回去,并且相應地将status字段設定為SERVING或NOT_SERVING。如果未注冊服務名稱,則伺服器将傳回NOT_FOUND GRPC狀态。

伺服器應使用空字元串作為伺服器總體運作狀況的鍵,以便用戶端對特定服務不感興趣時可以使用空請求查詢伺服器的狀态。伺服器可以對服務名稱進行精确比對,而無需任何通配符比對。但是,服務所有者可以自由地實作用戶端和伺服器都确認的更複雜的比對語義。

如果rpc在一段時間後未完成,則用戶端可以将伺服器聲明為不正常。用戶端應該能夠處理伺服器沒有運作狀況服務的情況。

用戶端可以調用Watch方法執行流健康檢查。伺服器将立即發回一條消息,訓示目前服務狀态。随後,隻要服務的服務狀态發生變化,它将随後發送新消息。