本周团队周会大家进行比赛demo的演示,各自都采用了非常好的方式来进行文件传输,比如xx 采用的rsocket实现,xxx 采用的chunked实现都耳目一新,整体而言大家底层都采用的Netty。个人采用的是Netty+Akka来实现,通过充分利用DefaultRegion和FileChannel的zerocopy + 分片传输的能力,最后跑分不错。其中需要分享的一个坑是:
进行分片传输是,在接收侧的文件需要提前设置一个最终的文件大小,通过RandomAccessFile.setLength实现,否则直接seek可能不能得到预期的结果。
进行分片传输时,如果使用的是DefaultFileRegion,则需要手动覆盖他的deallocate 方法,直接返回,不然在别的分片完成时,将会对底层的文件FIleChannel进行释放,造成其他相关分片失败。
在接收端FileChannel的write可以通过自己控制position来进行并发写入,但是如果position自己不记录和更新,则可能一直在同一个位置写数据,因为FileChannel的好几个write方法都不会改变文件当前写入的position,需要自己记录。
虽然是个小demo,但还是非常有意思。大家也都积极参与看到了同一个问题大家
Netty DefaultRegion和FileChannelden
最新推荐文章于 2024-04-16 14:59:14 发布