最近部署后,我在生产服务器上发现了很多这样的错误:
上次写入尝试超时;强制关闭连接。
目前我每小时从不同的主机收到约5个这样的错误。
我查看了Netty SslHandler
中的代码,看到当close_notify
事件没有完全发送到接收者时(根据评论),预计会出现此异常。
但是,我之前从未见过这个错误。这让我觉得它可能是某种错误的管道配置问题。所以目前,我不确定这是我的错误还是网络问题。
Netty版本4.1.22.Final
epoll和ssl启用了netty-tcnative-boringssl-static 2.0.7.Final
我做了很少的单元测试,但没有运气。
有人有线索吗?
答案 0 :(得分:1)
除了更高的超时之外,你无能为力。这意味着您无法足够快地将数据写入远程对等方,这很可能意味着远程对等方读取速度不够快。另一个原因可能是您阻止了EventLoop,因此无法及时取得任何进展。
答案 1 :(得分:0)
经过一番调查,我能够解决问题。似乎问题出在管道配置中。
有错误的管道:
.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(sslCtx.newHandler(ch.alloc()))
.addLast(appChannelStateHandler);
没有问题的管道:
.addLast(new IdleStateHandler(appIdleTimeout, 0, 0))
.addLast(appChannelStateHandler)
.addLast(sslCtx.newHandler(ch.alloc()))
appChannelStateHandler
ChannelInboundHandlerAdapter
的位置:
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
log.trace("State handler. App timeout disconnect. Event : {}. Closing.", ((IdleStateEvent) evt).state());
ctx.close();
} else {
ctx.fireUserEventTriggered(evt);
}
}
问题可能是ctx.close();
和SslHandler
都调用appChannelStateHandler
。至少这是首先想到的。我仍然不确定 - 是netty问题还是错误的管道配置?无论如何,我无法在本地重现这个问题。