![](/img/trans.png)
[英]How to get GRPC's round_robin load balancing to work using grpc-java in Kubernetes cluster?
[英]How to get GRPC's retry mechanism to work using grpc-java in Kubernetes cluster?
我一直在尝试让 GRPC 的负载平衡在部署到 Kubernetes 集群的 Java 应用程序中工作,但我并没有取得太大的成功。 似乎没有太多关于此的文档,但从在线示例中我可以看到我现在应该能够在设置 ManagedChannel 时使用 '.defaultLoadBalancingPolicy("round_robin")' (在 GRPC Java lib 的更高版本中) .
更具体地说,我使用的是 GRPC Java 库的 1.34.1 版本。 我创建了两个 Spring Boot (v2.3.4) 应用程序,一个称为 grpc-sender,一个称为 grpc-receiver。
grpc-sender 充当 GRPC 客户端并将(Netty)ManagedChannel 定义为:
@Bean
public ManagedChannel greetingServiceManagedChannel() {
String host = "grpc-receiver";
int port = 6565;
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext().build();
}
然后 grpc-receiver 充当 GRPC 服务器:
Server server = ServerBuilder.forPort(6565)
.addService(new GreetingServiceImpl()).build();
我正在将这些应用程序部署到一个Kubernetes集群(暂时在minikube本地运行),并且我已经为grpc-receiver应用程序创建了一个Service作为无头服务,这样就可以实现GRPC负载均衡。
为了测试失败的请求,我做了两件事:
通过以上两种方式,我可以在测试运行期间获得一定比例的请求失败。 现在我试图让 GRPC 的重试机制起作用。 通过阅读稀疏文档,我正在执行以下操作:
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.enableRetry()
.maxRetryAttempts(10)
.usePlaintext().build();
然而,这似乎没有效果,我看不到失败的请求被重试。
我看到这仍然被标记为@ExperimentalApi 功能,所以它应该按预期工作并且已经实现了吗?
如果是这样,我有什么明显的遗漏吗? 我还需要做什么才能使重试工作?
任何文档可以更详细地解释如何执行此操作?
首先十分感谢...
ManagedChannelBuilder.enableRetry().maxRetryAttempts(10) 不足以进行重试。 重试需要一个定义了 RetryPolicy 的服务配置。 一种方法是使用 RetryPolicy 设置默认服务配置,请参阅https://github.com/grpc/grpc-java/tree/v1.35.0/examples中的重试示例
maxRetryAttempts() 的 javadoc 存在一些混淆,并在https://github.com/grpc/grpc-java/pull/7803中进行了澄清
非常感谢@user675693:效果很好:)
maxRetryAttempts() 的工作确实有点令人困惑。
从文档中我可以看到:
“必须指定 maxAttempts 并且必须是 JSON integer 值大于 1。大于 5 的值被视为 5 而不会被视为验证错误。”
参考服务配置中的 maxAttempts。 如果我们想要超过 5 次尝试,我可以将其设置为 maxRetryAttempts(10),例如在我的 ManagedChannel 设置中:
return NettyChannelBuilder.forAddress(host, port)
.defaultLoadBalancingPolicy("round_robin")
.defaultServiceConfig(config)
.enableRetry()
.maxRetryAttempts(10)
.usePlaintext().build();
但是为了正确使用该设置,我需要在服务配置和 ManagedChannel 设置代码中将其设置为 10,否则只执行 5 次重试。 从 Javadoc 或文档中并不清楚,但这似乎是我的测试中发生的事情。
此外,此重试功能被标记为 @ExperimentalApi。 它有多成熟,是否适合在生产中使用? 有可能发生剧烈变化吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.