为啥 gRPC 仅在 Windows 上每秒抛出“已建立的连接被主机中的软件中止”?

Posted

技术标签:

【中文标题】为啥 gRPC 仅在 Windows 上每秒抛出“已建立的连接被主机中的软件中止”?【英文标题】:Why does gRPC throw an "established connection was aborted by the software in your host machine" every second on windows only?为什么 gRPC 仅在 Windows 上每秒抛出“已建立的连接被主机中的软件中止”? 【发布时间】:2017-10-10 03:23:54 【问题描述】:

仅在 Windows 上,我有一个 grpc 服务器每秒抛出此 INFO 级堆栈跟踪:

2017-10-09T20:11:00,366 - INFO  - [grpc-default-worker-ELG-1-13:io.grpc.netty.NettyServerTransport:grpc.netty.NettyServerTransport@159] -  - Transport failed
java.io.IOException: An established connection was aborted by the software in your host machine
    at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.8.0_131]
    at sun.nio.ch.SocketDispatcher.read(Unknown Source) ~[?:1.8.0_131]
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) ~[?:1.8.0_131]
    at sun.nio.ch.IOUtil.read(Unknown Source) ~[?:1.8.0_131]
    at sun.nio.ch.SocketChannelImpl.read(Unknown Source) ~[?:1.8.0_131]
    at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) ~[    ]
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1106) ~[netty-buffer-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.channel.socket.nio.NiosocketChannel.doReadBytes(NioSocketChannel.java:372) ~[netty-transport-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123) [netty-transport-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) [netty-transport-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) [netty-transport-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) [netty-transport-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) [netty-transport-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [netty-common-4.1.14.Final.jar:4.1.14.Final]
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) [netty-common-4.1.14.Final.jar:4.1.14.Final]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_131]

这可能是在https://github.com/grpc/grpc-java/issues/1768登录的同一件事

再一次,我只在 Windows 上收到此错误!

无论此问题如何,该应用程序似乎都能正常运行。

当我使用 io.grpc.Server 启动一个简单的“hello world”应用程序时,我看不到这个 INFO 堆栈跟踪。

但是当我使用我的真实应用程序时,该应用程序在 grpc 服务器和在应用程序期间保持打开状态的码头服务器之间打开双向 http2 流连接...我每秒收到此消息泛滥我的日志。

NettyServerTransport 日志转为WARN 级别是否安全?还是我应该担心这条消息的频率?

【问题讨论】:

【参考方案1】:

我发现这条消息的出现是因为第三方 Java 应用程序上的 tcp 心跳检查器,我们使用它来监视我的服务是否启动。

它发出InetSocketAddress(ip, port) 请求以检查http2 端口是否仍在响应。

每次执行此操作(仅在 Windows 上)时,它都会输出烦人的堆栈跟踪。调查原因。

已创建问题:https://github.com/nddipiazza/grpc-java-bidirectional-streaming-example

【讨论】:

以上是关于为啥 gRPC 仅在 Windows 上每秒抛出“已建立的连接被主机中的软件中止”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 HTML5 地理定位代码不能仅在 iOS 上获取用户的位置?

为啥 LWJGL 仅在 Windows 上在以前和当前的游戏状态之间闪烁?

仅在刷新页面时令牌过期时注销?为啥?

仅在 Windows 10 中,Java Keyevent 不起作用..在 Windows 7 和 8 中它运行良好..我不知道为啥

无法仅在特定系统上加载 DLL

为啥 Nginx 会截断 gRPC 流式响应?