代码之家  ›  专栏  ›  技术社区  ›  Dmitriy Dumanskiy

如何处理Netty“上次写入尝试超时;强制关闭连接”例外

  •  0
  • Dmitriy Dumanskiy  · 技术社区  · 7 年前

    在最近的部署之后,我在生产服务器上发现了许多类似的错误:

    上次写入尝试超时;强制关闭连接。

    目前,我每小时从不同的主机上收到大约5个这样的错误。 我在Netty中查看了代码 SslHandler 并确保当 close_notify 事件未完全发送给接收者(根据评论)。

    然而,我以前从未见过这个错误。这让我觉得这可能是某种错误的管道配置问题。所以目前,我不确定这是我的错误还是网络问题。

    Netty版本4.1.22。最终的

    使用netty tcnative boringssl static 2.0.7启用Epoll和ssl。最终的

    我做了一些单元测试,但没有任何运气。

    有人有什么线索吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Norman Maurer    7 年前

    除了更高的超时时间外,您没有什么可做的。这意味着您无法以足够快的速度将数据写入远程对等方,这很可能意味着远程对等方的读取速度不够快。另一个原因可能是您阻止了EventLoop,因此它无法及时取得任何进展。

        2
  •  0
  •   Dmitriy Dumanskiy    7 年前

    经过一些调查,我解决了这个问题。似乎问题出在管道配置上。

    存在错误的管道:

    .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 . 至少这是我首先想到的。我仍然不确定-这是一个棘手的问题还是错误的管道配置?无论如何,我无法在本地重现该问题。