通过 nginx 的 grpc_pass 并发请求失败

问题描述

通过Nginx并发发送grpc请求时,在客户端收到:

Caused by: io.netty.handler.codec.http2.Http2Exception$StreamException: Cannot create stream 2015 greater than Last-Stream-ID 2001 from GOAWAY.
    at io.netty.handler.codec.http2.Http2Exception.streamError(Http2Exception.java:147)
    at io.netty.handler.codec.http2.DefaultHttp2Connection$DefaultEndpoint.checkNewStreamAllowed(DefaultHttp2Connection.java:874)
    at io.netty.handler.codec.http2.DefaultHttp2Connection$DefaultEndpoint.createStream(DefaultHttp2Connection.java:748)
    at io.netty.handler.codec.http2.DefaultHttp2Connection$DefaultEndpoint.createStream(DefaultHttp2Connection.java:668)
    at io.netty.handler.codec.http2.DefaultHttp2ConnectionEncoder.writeHeaders0(DefaultHttp2ConnectionEncoder.java:201)
    at io.netty.handler.codec.http2.DefaultHttp2ConnectionEncoder.writeHeaders(DefaultHttp2ConnectionEncoder.java:167)
    at io.netty.handler.codec.http2.DecoratingHttp2FrameWriter.writeHeaders(DecoratingHttp2FrameWriter.java:53)
    at io.netty.handler.codec.http2.StreamBufferingEncoder.writeHeaders(StreamBufferingEncoder.java:153)
    at io.netty.handler.codec.http2.StreamBufferingEncoder.writeHeaders(StreamBufferingEncoder.java:141)
    at io.grpc.netty.NettyClientHandler.createStreamTraced(NettyClientHandler.java:579)
    at io.grpc.netty.NettyClientHandler.createStream(NettyClientHandler.java:562)
    at io.grpc.netty.NettyClientHandler.write(NettyClientHandler.java:323)

不使用Nginx直接请求grpc服务器时,没有报错。

解决方法

http://nginx.org/en/docs/http/ngx_http_v2_module.html

行为由 http2 模块控制,而不是由 grpc 模块控制:

    http2_recv_buffer_size 1024k;
    http2_max_requests 2147483647;
    http2_max_concurrent_streams 200;