写大型数据

网络存在饱和的可能性,如何在异步框架中高效地写大块数据是一个特殊的问题。由于写操作是非阻塞的,所以即使没有写出所有的数据,写操作也会在完成时返回并通知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,它支持异步写大型数据流,而又不会导致大量的内存消耗。