网络存在饱和的可能性,如何在异步框架中高效地写大块数据是一个特殊的问题。由于写操作是非阻塞的,所以即使没有写出所有的数据,写操作也会在完成时返回并通知ChannelFuture。当这种情况发生时,如果仍然不停额写入,就有内存耗尽的风险。所以在写大型数据时,需要准备好处理到远程节点的链接速度是慢速的情况,这种情况会导致内存释放的延迟。
(额,不是十分理解这个写操作是非阻塞的说法)
零拷贝发生在Netty的核心中,应用程序需要做的就是使用一个FileRegion的接口实现。
1
2
3
4
5
6
7
8
9
10
11
12
|
FileInputStream in = new FileInputStream(file);
FileRegion region = new DefaultFileRegion(in.getChannel(), 0, file.length());
channel.writeAndFlush(region).addListener(new ChannelFutureListener(){
@Override
public void operationComplete(ChannelFuture future) throws Exception{
if(!future.isSuccess()) {
// do something
}
}
})
|
在需要将数据从文件系统复制到用户内存中时,可以使用ChunkedWriterHandler,它支持异步写大型数据流,而又不会导致大量的内存消耗。