代码之家  ›  专栏  ›  技术社区  ›  Leo.W

关于gRPC容量/调整

  •  0
  • Leo.W  · 技术社区  · 6 年前

    我正在使用gRPC运行一个微服务,并在客户端从服务器得到了许多OneError()回调。

    t、 printStackTrace()显示:

    io.grpc.StatusRuntimeException: UNKNOWN
        at io.grpc.Status.asRuntimeException(Status.java:526)
        at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:385)
        at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:41)
        at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:339)
        at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:443)
        at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:63)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:525)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:446)
        at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:557)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:107)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    

    如果我关闭除测试客户端之外的所有连接,异常就会消失。

    因此,我想知道(在服务器端)的最大实例数是否有任何限制:

    io.grpc.ManagedChannel
    io.grpc.stub.StreamObserver 
    

    如果有,我如何调整/放大它们?

    任何帮助都将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Eric Anderson    6 年前

    UNKNOWN 状态通常表示服务器以某种方式出现故障。您可能需要检查服务器日志。

    服务器可以拥有的连接数和RPC数没有真正的限制。连接过多可能会耗尽文件描述符。有可能达到RPC限制,从而导致它们排队,直到可以发送为止。与任何事情一样,您可能会遇到内存使用和类似的限制。

        2
  •  0
  •   Leo.W    6 年前

    @埃里克是对的。 这里我只是展示我遇到的问题。希望这也能帮助其他遇到同样问题的人。

    在服务器端,我发现有许多异常,例如

    Apr 19, 2018 5:06:07 PM io.grpc.internal.SerializingExecutor run
    SEVERE: Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable@752265fc
    redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool
        at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:256)
        at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:16)
        at redis.clients.jedis.Jedis.close(Jedis.java:3409)
        ...
        at io.grpc.stub.ServerCalls$StreamingServerCallHandler$StreamingServerCallListener.onMessage(ServerCalls.java:251)
        at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.messagesAvailable(ServerCallImpl.java:251)
        at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable.runInContext(ServerImpl.java:592)
        at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
        at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:107)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
        at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
        at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
        at redis.clients.jedis.Protocol.process(Protocol.java:151)
        at redis.clients.jedis.Protocol.read(Protocol.java:215)
        at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
        at redis.clients.jedis.Connection.getAll(Connection.java:310)
        at redis.clients.jedis.Connection.getAll(Connection.java:302)
        at redis.clients.jedis.Pipeline.sync(Pipeline.java:99)
        at redis.clients.jedis.Pipeline.clear(Pipeline.java:85)
        at redis.clients.jedis.BinaryJedis.resetState(BinaryJedis.java:1781)
        at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:252)
        ... 13 more
    Caused by: java.net.SocketTimeoutException: Read timed out
    

    由于它提到了redis,我查看了相关代码,发现JedisPoolConfig可能没有足够的线程,默认超时时间可能太短。

    所以我把两者都放大了,问题就解决了。

    换句话说,服务器没有足够的资源在所需的时间内处理客户端请求。这导致gRPC服务器失败,因此调用了客户端onError()方法。

    谢谢你,埃里克。