使用dokan实现一个虚拟映射盘?来我们聊聊

缘起:

项目组一直在做网盘客户端(同步协作盘)的开发,产品进入市场,用户使用以后出现了很多问题。其中一个最大的问题就是,用户数据量很大(有很多公共库共享文档,部分用户数据量超百万),首次登陆要同步很长时间,且共享文档库文档变化时,所有用户都要同步,实时占用用户的资源,严重影响用户体验。(ps:我们使用精益项目管理,产品基本功能稳定以后,就给用户使用,不断优化迭代)

解决:问题来了,肿么办?一看是性能问题,项目组就排了前端后端性能测试和性能优化的计划,顺便说,客户端的性能优化是我做的。优化以后我们的性能提升了很多(优化后客户端性能提升10倍+),那么问题来了!行不行呢?产品再次给用户体验时,用户根本就不满意,没有解决根本问题。结果就是回退到旧产品,新产品用不起来。

其实这个问题一开始就偏离的方向,问题的根本不在性能,因为用户要的即时访问,即用即取,不管怎么优化,同步大批量文件还是需要一段时间的。

这个时候讨论以后,成立的项目攻关小组,决定用dokan做虚拟映射盘。

dokan是什么?

dokan是一个用户态的文件系统驱动,可以称之为fuse for windows。

我就不当拷贝机了,更详细介绍请戳这里吧:

http://dokan-dev.net/en/about/(官方文档)

技术分享

这个图清晰的反应出了dokan的框架模型,文档中也有详细的解释。

预研:

我们先写了一下简单的demo,演示demo,做了一份测试报告,分析这个项目的可行性/对比同步盘的优缺点/风险。结论就是最大的风险就是蓝屏问题,网上有反馈蓝屏问题。但是我们还暂时没遇到。另外还没有一个成熟的产品使用dokan做开发,有点心悬悬的赶脚!但是做好了,体验是非常好的,有点期待+鸡冻。

1.how to build dokan? 

<1>github下载代码:

https://github.com/clone/dokan

<2>how to build

http://www.kissthink.com/archive/4307.html

<3>编译环境(由于win8下面需要WDK8.1来编译,还需要安装vs2013,安装这个就可以把xp/win7/win8都编译出来,具体请参考微软的官网说明)

https://msdn.microsoft.com/en-US/windows/hardware/gg454513

技术分享

<4>安装卸载驱动

http://blog.csdn.net/kecise/article/details/7043403

2.开始开发:

进入项目开发,计划先实现雏形,后续做重构。

有一天项目组的小伙伴在测试的时候反馈,一个几乎必现蓝屏的操作--在虚拟盘explorer的右上角搜索xx*,就会蓝屏。然后我们拿到蓝屏后的crash dump文件,用winDbg查看分析,发现是一个多线程访问控制的问题,然后修改了代码,针对搜索这个场景进行测试,发现不再蓝屏。

随着项目的推进,我们的基本雏形出来了,然后用我们修改过的代码bulid dokan,打包安装以后,进行测试发现,很容易出现卡死和蓝屏的情况,说明改动的地方有问题,然后我们就回退了改动的代码。

3.继续还是终止?

这时项目进展了一个半月的样子,客户催得很急,项目组鸭梨山大!项目组的相关人员开会进行了讨论。用dokan开发虚拟映射盘是否继续?前期预研时判断,这个开发的难度是不大的,只需要实现dokan预留的接口就可以了,但是随着实际深入,发现了很多问题。我们对这些问题进行了一个总结。结论就是深入去做都可以解决,但是需要时间,可是当前最要紧就是时间。最大的问题就是都看本身的蓝屏问题,最终项目组决定终止项目。

ps:后来我们考虑了其他办法,优化改良同步盘,解决了用户的问题。

4.使用dokan开发虚拟映射盘的问题汇总。

一方面是dokan本身的问题。

<1>dokan官方早已经不再更新维护。

<2>dokan的稳定性存在问题,还有对windows不同版本系统的兼容性,意味着如果你在用它开发一个稳定的商用项目,那么需要专业的驱动层的开发攻城狮熟悉dokan的源码,进行维护。

另一方面是开发虚拟盘的一些问题。

<1>explorer很多操作会频繁浏览文档,大并发的情况,对后端系统实时响应要求较高,所以可以考虑本地cache做优化,牺牲一定的一致性。

<2>大多数应用都是随机读,随机写,所以要么后端支持随机读写,要么自己本地一些处理支持。

随机写:由于我们的后端是分布式多版本系统,支持随机写风险和难度都很大,所以后端不支持随机写,使用先写本地,再上传的方案。

随机读:后端支持随机读,但是很多应用单次读的数据都很小,所以需要模拟操作系统的预读机制做cache优化。

<3>支持office和wps在线编辑。office读写文件时操作都很复杂,很多人都反馈说支持了读写等等接口,但是编辑office保存时常常会报错。这是一个很纠结的问题。我们也遇到了这个问题,进行系统的分析发现,office软件打开时回去设置文件的最后修改时间、安全属性等等一些文件属性,然后保存时会先去读这些自己设置过的属性进行检查,如果不匹配就会报错。

推荐使用ProcessMonitor和ProcessExplorer另个神器对office进行系统分析分别分析office和wps各个版本进行哪些操作,然后针对这些操作给出相应的方案。因为当时我们只分析了一下,还没解决,就决定停掉项目了,所以还没考虑详细的解决方案。

<4>剪切movefile实际是个移动,后端支持数据移动操作。

<5>office/wps等文件编辑时通常以下方式  生成临时文件x1->将原文件f重名为x2->将x1重命名为f->删除临时文件x2,所以需要考虑过滤校正方案。

<6>还需要严格的测试一些常用的应用,有些应用类似Adobe/wps/office等等都有一些特殊复杂的操作过程,需一次测试,给出测试兼容性的报告,针对有问题的,挨个进行系统分析,给出解决方案,并备案记录。

5.结论:

使用dokan开发出来的虚拟映射盘相比同步盘有很多的优点,如虚拟盘原生支持在线播放,按需取数据等等优点,这些都是同步盘很难解决甚至无法解决的,所以国内市场的大多数网盘都是做一个简单的同步盘+富客户端。但是在用户文档协作+大量共享数据+原生explorer体验用户场景下,怎样给予用户更好的体验?虚拟映射盘的体验是同步盘等无法比拟的。我们的项目因为因为各种原因最终流产了,但是还是很看好虚拟映射盘带来的体验。dokan最大的问题就稳定性和系统兼容性。另外和各类应用各个版本强关联,需要一一兼容支持,也是件很蛋疼的事情。


因个人水平有限,如有笔误、讲解不清楚、探究的不清楚的地方。还请各位路过的小伙伴们海涵,并指出问题,帮助我干掉它。转载请注明出处。


本文出自 “来去匆匆” 博客,请务必保留此出处http://linzimo777.blog.51cto.com/5334766/1613382

文章来自:http://linzimo777.blog.51cto.com/5334766/1613382
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3