GRPc-netty 上游连接错误或在标头之前断开/重置

Ива*_*душ 6 java netty kubernetes grpc

我正在尝试在我的服务之间使用 GRPC。我只有三项服务。其中两个在 k8s 中运行。GCP 中的一员。我从 GCP 中的服务调用其他服务。我对我的存根使用相同的 NettyChannelBuilder。客户端具有相同的每秒请求率。我在构建器中设置了 keepAliveWithoutCalls=true、keepAliveTime、idleTimeout 。不幸的是,我定期只从一个客户端收到此错误?

io.grpc.StatusRuntimeException: UNAVAILABLE: upstream connect error or disconnect/reset before headers. reset reason: connection failure
    at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:233)
    at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:214)
Run Code Online (Sandbox Code Playgroud)

有人可以帮我找到解决方案吗?我已经在 github 上阅读了很多问题。现在,我要为呼叫设置重试策略,但这不是最好的解决方案。

小智 2

来自github

我们遇到了同样的错误。我们的原因是因为 tcp_keepalive 对于我们的上游服务设置得太高。我们将 keepalive_time 更改为 300 秒,问题就消失了。

这在我们的例子中是有意义的,因为我们让 Envoy 指向一个具有 350 秒空闲超时的网络负载均衡器 (aws)。

我们将其添加到我们的 Envoy 配置中。

clusters:
    - name: grpc-service
      connect_timeout: 0.25s
      http2_protocol_options: {}
      upstream_connection_options:
        tcp_keepalive:
          keepalive_time: 300
Run Code Online (Sandbox Code Playgroud)