Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得GRPC';在Kubernetes集群中使用GRPCJava的重试机制如何工作?_Java_Kubernetes_Grpc_Grpc Java - Fatal编程技术网

如何获得GRPC';在Kubernetes集群中使用GRPCJava的重试机制如何工作?

如何获得GRPC';在Kubernetes集群中使用GRPCJava的重试机制如何工作?,java,kubernetes,grpc,grpc-java,Java,Kubernetes,Grpc,Grpc Java,我一直在尝试让GRPC的负载平衡在部署到Kubernetes集群的Java应用程序中工作,但没有取得太多成功。似乎没有太多关于这方面的文档,但从联机示例中我可以看出,我现在应该能够在设置ManagedChannel时使用“.defaultLoadBalancingPolicy(“round_robin”)(在GRPC Java lib的更高版本中) 更具体地说,我使用的是GRPCJava库的1.34.1版。我创建了两个Spring Boot(v2.3.4)应用程序,一个名为grpc sender

我一直在尝试让GRPC的负载平衡在部署到Kubernetes集群的Java应用程序中工作,但没有取得太多成功。似乎没有太多关于这方面的文档,但从联机示例中我可以看出,我现在应该能够在设置ManagedChannel时使用“.defaultLoadBalancingPolicy(“round_robin”)(在GRPC Java lib的更高版本中)

更具体地说,我使用的是GRPCJava库的1.34.1版。我创建了两个Spring Boot(v2.3.4)应用程序,一个名为grpc sender,另一个名为grpc receiver

grpc发送方充当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接收器充当grpc服务器:

Server server = ServerBuilder.forPort(6565)
        .addService(new GreetingServiceImpl()).build();
我正在将这些应用程序部署到Kubernetes群集(目前在minikube本地运行),并为grpc接收器应用程序创建了一个服务作为无头服务,以便实现grpc负载平衡

要测试失败的请求,我需要做两件事:

  • 在测试运行期间杀死一个grpc接收器吊舱-例如,当我请求grpc发送方向grpc接收器发送5000个请求时。Grpc发送方确实检测到pod已被杀死,并刷新其接收方pod列表,并将未来的请求路由到新的pod。正如预期的那样,在击落吊舱期间正在飞行的一些请求失败,GRPC状态不可用
  • 在grpc接收器中有一些简单的逻辑,生成一个随机数,如果该随机数低于0.2,则返回grpc内部状态,而不是OK
通过以上两种方法,我可以在测试运行期间获得一定比例的失败请求。现在我正试图让GRPC的重试机制工作。通过阅读稀疏文档,我做了以下工作:

return NettyChannelBuilder.forAddress(host, port)
        .defaultLoadBalancingPolicy("round_robin")
        .enableRetry()
        .maxRetryAttempts(10)
        .usePlaintext().build();
然而,这似乎没有任何效果,我看不出失败的请求会被重试

我看到这仍然被标记为@ExperimentalApi特性,那么它是否应该像预期的那样工作,并且已经实现了

如果是的话,我是否有明显的遗漏?我还需要做什么才能让重试正常进行

有没有更详细地说明如何执行此操作的文档


非常感谢…

ManagedChannel Builder.enableRetry()。maxRetryAttempts(10)不足以使重试发生。重试需要定义了RetryPolicy的服务配置。一种方法是使用RetryPolicy设置默认服务配置,请参见中的重试示例


maxRetryAttempts()的javadoc有一些混乱,在

中对此进行了澄清,非常感谢@user675693!这非常有效:)

maxRetryAttempts()的工作确实有点混乱

从文档中,我可以看到:

“必须指定maxAttempts,并且必须是大于1的JSON整数值。大于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。它有多成熟,是否适合用于生产?它可能会发生剧烈的变化吗