gpt4 book ai didi

java - ISTIO sidecar导致Java grpc客户端高并发负载下抛出 "UNAVAILABLE: upstream connect error or disconnect/reset before headers"

转载 作者:行者123 更新时间:2023-12-02 01:43:20 25 4
gpt4 key购买 nike

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

正常负载下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)

同时,服务器端没有异常,客户端 pod 的 istio-proxy 容器也没有错误。但是,如果我禁用 istio sidecar 注入(inject),以便这两个服务直接相互通信,则不会出现此类错误。

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

非常感谢。

最佳答案

终于找到原因了,是envoy sidecar默认的CircuitBeakers设置造成的,默认设置了max_pending_requestsmax_requests选项为1024,默认的connecTimeout1s,所以在高并发负载情况下,当服务器端有太多pending请求等待时服务后,sidecar CircuitBreaker 将介入并告诉客户端服务器端上游不可用

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

关于java - ISTIO sidecar导致Java grpc客户端高并发负载下抛出 "UNAVAILABLE: upstream connect error or disconnect/reset before headers",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54104809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com