[英]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.