有时,当通过 SocketChannel.write() 发送大量数据时,底层 TCP 缓冲区被填满,我必须不断重试 write(),直到数据全部发送完毕。
所以,我可能有这样的事情:
public void send(ByteBuffer bb, SocketChannel sc){
sc.write(bb);
while (bb.remaining()>0){
Thread.sleep(10);
sc.write(bb);
}
}
问题是偶尔会出现大 ByteBuffer 和溢出的底层 TCP 缓冲区的问题,这意味着对 send() 的调用将阻塞一段意想不到的时间。在我的项目中,有数百个客户端同时连接,一个套接字连接引起的一次延迟可以让整个系统爬行,直到解决这个与一个 SocketChannel 的延迟。当延迟发生时,它可能会导致项目其他区域减速的连锁反应,并且低延迟很重要。
我需要一个解决方案,它可以透明地处理这个 TCP 缓冲区溢出问题,并且在需要多次调用 SocketChannel.write() 时不会导致一切阻塞。我已经考虑将 send() 放入一个扩展 Thread 的单独类中,以便它作为自己的线程运行并且不会阻塞调用代码。但是,我担心为我维护的每个套接字连接创建线程所需的开销,特别是当 99% 的时间 SocketChannel.write() 在第一次尝试时成功,这意味着不需要线程存在. (换句话说,只有在使用 while() 循环时才真正需要将 send() 放在单独的线程中——仅在存在缓冲区问题的情况下,可能有 1% 的时间)如果存在缓冲区问题只有 1% 的时间,我不会
我希望这是有道理的......我真的可以使用一些建议。谢谢!