Netty.writeAndFlush with future成功杀死主机



我们有一个在Ubuntu v10上运行的基于Netty(4.0.15)的Websocket服务器,在弹性测试期间,我们做了:

  1. kill-9服务器
  2. 从客户端发送一些数据
  3. 预期客户端出现writeAndFlush故障

由于某些原因有时我们看到:

  1. writeAndFlush成功,然后
  2. java.io.IOException:对等方重置连接

那么,writeAndFlush有时是否可能成功完成,即使服务器不在,而其他时候则会失败?

也许这是因为操作系统套接字清理机制对终止进程的时间表而发生的?

客户端测试代码:

channel.writeAndFlush(new TextWebSocketFrame("blah blah")).addListeners(
<snip>
public void operationComplete(ChannelFuture future) {
assert future.isSuccess() == false;  <-- sometimes this is not triggered
}
</snip>

谢谢你的任何想法,

这是一个简单的竞赛条件,您必须接受的事情可能会发生。您只能通过不从远程主机接收数据来确定远程主机已经消失。通常情况下,这是通过设置计时器并假设如果没有接收到数据(可能是为了响应保活消息),则远程主机已死亡来实现的。

从本质上讲,如果远程主机尝试在没有收到确认的情况下重新传输某些数据一定次数,或者没有收到保持活动的响应(默认情况下通常关闭),则TCP会假设远程主机已关闭。但是,假设主机的发送缓冲区中有空间,您可以继续成功调用writeAndFlush,因为它只会在网络缓冲区中排队。一旦Netty将数据写入内核发送缓冲区,WriteAndFlush就被认为是成功的。如果没有应用程序级别的确认,就无法确定数据是否到达远程主机。因此,您可能正在调用writeAndFlush,而TCP正在确定远程主机已死亡,因此writeAndFluh成功,但数据未发送。或者,您可以在TCP确定远程主机已关闭并因此引发错误的同时调用writeAndFlush。

这里有更多关于TCP重传和保持活跃的信息

相关内容

最新更新