簡體   English   中英

為什么grpc中的“healthCheckConfig”必須使用“loadBalancingPolicy”

[英]why the "loadBalancingPolicy“ must be used when "healthCheckConfig" in grpc

代碼文件為: client and server

可疑代碼:

var serviceConfig = `{
    "loadBalancingPolicy": "round_robin",
    "healthCheckConfig": {
        "serviceName": ""
    }
}`

測試步驟:

1.只運行一台服務器和一個客戶端

2.當使用"loadBalancingPolicy": "round_robin"時,客戶端可以檢測到服務器的"status=NOT_SERVING"

3.刪除"loadBalancingPolicy": "round_robin",或者使用"pick_first"時,客戶端檢測不到服務端的"status=NOT_SERVING"

當有多個服務器地址時健康檢查有意義。 如果只有一個地址,則無需檢查健康狀況。 所以負載均衡策略round_robin是和健康檢查一起工作的。

round_robin會檢查健康狀態,所以它會一個接一個地向READY地址發送請求。

pick_first策略不支持健康檢查,因此它將使用第一個成功連接的服務器。 因此,任何請求都只會使用指定地址。

您可以在LB Policies Can Disable Health Checking When Needed中閱讀健康檢查和負載均衡策略的文檔。

為了調試客戶端和服務器,您可以添加環境變量GRPC_GO_LOG_SEVERITY_LEVEL=infoGRPC_GO_LOG_VERBOSITY_LEVEL=99以獲得傳輸和連接事件的更多詳細信息。

仔細閱讀源碼后,我明白了內部實現。

  1. pick_first
  • 它自己實現了“balancer.Builder”和“balancer.Balancer”。
  • “ResolverState.Addresses”只會創建一個SubConn,SubConn中有一個addrConn,用第一個addr創建ClientTransport。
  • 每次調用 Pick() 時返回一個固定的“balancer.PickResult”。
  1. 循環法
  • 傳入參數“HealthCheck: true”,通過“base.NewBalancerBuilder()”將baseBuilder作為Builder返回。
  • “ResolverState.Addresses”的每個addr都會創建一個對應的SubConn。
  • 每次調用 Pick() 時,更改內部 next 值,從“[]balancer.SubConn”獲取它,並返回一個新的“balancer.PickResult”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM