簡體   English   中英

Java Grpc:使 dns 緩存無效

[英]Java Grpc: invalidate dns cache

我有一個 grpc 客戶端指向一個解析為 2 個 IP 地址的 URL。 問題是當一個服務器節點出現故障然后又恢復時,grpc 客戶端不會選擇它,並且所有負載都轉到單個節點。

我嘗試建議更改networkaddress.cache.ttl屬性,但沒有幫助。 我的代碼(在 Scala 中)

java.security.Security.setProperty("networkaddress.cache.ttl", "30")
System.setProperty("networkaddress.cache.ttl", "30")
val channel = NettyChannelBuilder.forAddress(host, port).nameResolverFactory(
      new DnsNameResolverProvider).usePlaintext().build
val client = MyServiceGrpc.newStub(channel)

grpc 版本:1.32.1

假設 DNS 一直返回兩個 IP(可能是 shuffled),那么問題不在於 DNS 緩存。 問題是 gRPC 有一個工作連接,所以不會選擇重新連接,也不會執行 DNS 查詢。

您應該使用MAX_CONNECTION_AGE配置您的服務器以強制客戶端偶爾重新連接以重新平衡負載。 當客戶端與服務器斷開連接時,它們會觸發新的 DNS 解析,因此這也可用於查找新地址(盡管重新連接不會等待 DNS 解析完成)。

在 Java 中, MAX_CONNECTION_AGE可通過NettyServerBuilder.maxConnectionAge()

NettyServerBuilder.forPort(yourPort)
    .maxConnectionAge(30, TimeUnit.MINUTES)
    ....

您想使用盡可能大的年齡。 如果時間為 30 分鍾,那么每個客戶端將每 30 分鍾重新平衡一次。 因此,在服務器重新啟動 15 分鍾后,該服務器將有 1/4 的負載,而在 30 分鍾后,它將有大約 ½。

似乎配置負載平衡策略可以完成這項工作:

NettyChannelBuilder.forAddress(host, port).defaultLoadBalancingPolicy("round_robin").usePlaintext().build()

暫無
暫無

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

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