ISTIO sidecar导致Java grpc客户端抛出;不可用:上游连接错误或在标头之前断开/重置“;在高并发负载下

ISTIO sidecar导致Java grpc客户端抛出;不可用:上游连接错误或在标头之前断开/重置“;在高并发负载下,java,grpc,istio,grpc-java,envoyproxy,Java,Grpc,Istio,Grpc Java,Envoyproxy,我有两个gRPC服务,其中一个将通过正常的gRPC方法调用另一个服务(两边都没有流),我使用istio作为服务网格,并将sidecar注入两个服务的kubernetes吊舱中 gRPC调用在正常负载下正常工作,但在高并发负载情况下,gRPC客户端继续抛出以下异常: <#bef7313d> i.g.StatusRuntimeException: UNAVAILABLE: upstream connect error or disconnect/reset before headers

我有两个gRPC服务,其中一个将通过正常的gRPC方法调用另一个服务(两边都没有流),我使用istio作为服务网格,并将sidecar注入两个服务的kubernetes吊舱中

gRPC调用在正常负载下正常工作,但在高并发负载情况下,gRPC客户端继续抛出以下异常:

<#bef7313d> i.g.StatusRuntimeException: UNAVAILABLE: upstream connect error or disconnect/reset before headers
    at io.grpc.Status.asRuntimeException(Status.java:526)
    at i.g.s.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:434)
    at i.g.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
    at i.g.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
    at i.g.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
    at i.g.i.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:678)
    at i.g.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
    at i.g.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
    at i.g.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
    at i.g.i.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:397)
    at i.g.i.ClientCallImpl.closeObserver(ClientCallImpl.java:459)
    at i.g.i.ClientCallImpl.access$300(ClientCallImpl.java:63)
    at i.g.i.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:546)
    at i.g.i.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:467)
    at i.g.i.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:584)
    at i.g.i.ContextRunnable.run(ContextRunnable.java:37)
    at i.g.i.SerializingExecutor.run(SerializingExecutor.java:123)
    at j.u.c.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at j.u.c.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
i.g.StatusRuntimeException:不可用:上游连接错误或在标头之前断开/重置
at io.grpc.Status.asRuntimeException(Status.java:526)
在i.g.s.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:434)
在i.g.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
位于i.g.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
位于i.g.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
位于i.g.i.CensusStatsModule$statclientreceptor$1$1.onClose(CensusStatsModule.java:678)
在i.g.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
位于i.g.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
位于i.g.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
在i.g.i.censturacingmodule$TracingClientInterceptor$1$1.onClose(censturacingmodule.java:397)
在i.g.i.ClientCallImpl.closeObserver(ClientCallImpl.java:459)
i.g.i.ClientCallImpl.access$300(ClientCallImpl.java:63)
在i.g.i.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:546)
位于i.g.i.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:467)
在i.g.i.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:584)
在i.g.i.ContextRunnable.run(ContextRunnable.java:37)
在i.g.i.SerializingExecutor.run(SerializingExecutor.java:123)
位于j.u.c.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在j.u.c.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
同时,服务器端没有异常,客户端pod的
istio proxy
容器也没有错误。但是,如果我禁用istio侧车注入,使这两个服务直接相互通信,就不会有这样的错误

有人能告诉我为什么,以及如何解决这个问题吗


非常感谢。

最后我找到了原因,这是由特使侧车的默认
电路烧杯设置造成的,默认情况下,
max_pending_requests
max_requests
选项设置为
1024
,默认的
connecTimeout
1s
,因此,在高并发负载情况下,当服务器端有太多待处理的请求等待服务时,sidecar断路器将介入并告诉客户端服务器端上游不可用


要解决此问题,您需要使用合理的
流量策略设置为目标服务应用
DestinationRule

最后我找到了原因,它是由特使侧车的默认
电路烧杯设置引起的,默认情况下,
max_pending_requests
max_requests
选项设置为
1024
,默认
connecTimeout
1s
,因此在高并发负载情况下,当服务器端有太多待处理的请求时,侧车断路器将介入并告知客户端上游服务器端不可用


要解决此问题,您需要使用合理的
trafficPolicy
设置为目标服务应用
DestinationRule

该错误消息不是由grpc java生成的。所以它可能是由istio生成的。@shizhz错误消息是由特使(入口网关或服务中的侧车)生成的,因为它无法到达上游,您可以发布清单吗?@rinormaloku,感谢您的回复,我找到了原因并将其作为答案发布,希望对其他面临同样问题的人有所帮助:-)错误消息不是由GRPCJava生成的。所以它可能是由istio生成的。@shizhz错误消息是由特使(入口网关或服务中的侧车)生成的,因为它无法到达上游,您可以发布清单吗?@rinormaloku,感谢您的回复,我已经找到了原因并将其作为答案发布,希望对其他面临同样问题的人有所帮助:-)