如何编写一个 SendFile 服务器
前言
之前讨论零拷贝的时候,我们知道,两台机器之间传输文件,最快的方式就是 send file,众所周知,在 Java 中,该技术对应的则是 FileChannel 类的 transferTo 和 transferFrom 方法。
在平时使用服务器的时候,比如 nginx ,tomcat ,都有 send file 的选项,利用此技术,可大大提高文件传输效能。
另外,可能也有人谈论 send file 的缺点,例如不能利用 gzip 压缩,不能加密。这里本文不做探讨。
纸上得来终觉浅,绝知此事要躬行。
那么,如何使用这两个 api 实现一个 send file 服务器和客户端呢?
想象一下,你写的 send file 服务器利用 send file 技术,利用万兆网卡,从各个 client 端 copy 海量文件,瞬间打爆你那 1TB 的磁盘和 48核的 CPU。并且,注意:只需很小的 JVM 内存就可以实现这样一台强悍的服务器。为什么?如果你知道 send file 的原理,就会知道,使用 send file 技术时, 在用户态中,是不需要多少内存的,数据都在内核态。
是不是很有成就感?什么?没有?那打扰了 ?。
另外,关于 send file,我们都知道,由于是直接从内核缓冲区进入到网卡驱动,我们几乎可以称之为 “零拷贝”,他的性能十分强劲。
但是。