使用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最大的问题就稳定性和系统兼容性。另外和各类应用各个版本强关联,需要一一兼容支持,也是件很蛋疼的事情。

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

时间: 2024-10-12 17:40:56

使用dokan实现一个虚拟映射盘?来我们聊聊的相关文章

Tomcat 配置WEB虚拟映射 及 配置虚拟主机

Tomcat  配置WEB虚拟映射 及 配置虚拟主机 配置WEB虚拟映射文件夹有三种方法例如以下: 第一(要重新启动server的): 打开路径 Tomcat 6.0\conf 下的 server.xml文件, 在文件内容的</Host>的上面一行加入?一条语句:<Context path="" docBase="这里指向你要映射的文件夹比方(E:\code\news)" reloadable="true" />, 注意改

[转载]Windows下的分页模式- 页目录和页表从物理内存到虚拟映射求值

标 题: [原创]Windows下的分页模式-  页目录和页表从物理内存到虚拟映射求值 作 者: hrpirip 时 间: 2012-12-06,12:45:36 链 接: http://bbs.pediy.com/showthread.php?t=159554 昨天在网上看到一段代码令大为不解,大家都知道一个虚拟地址到物理地址的转换伪公式为:*(*(*PD[(VirtualAddress>>22)] & FFFFF000) [(VirtualAddress & 3FF000)

ASP.NET访问网络映射盘&amp;实现文件上传读取功能

最近在改Web的时候,遇到一个问题,要跨机器访问共享文件夹,以实现文件正常上传下载功能. 要实现该功能,可以采用HTTP的方式,也可以使用网络映射磁盘的方式,今天主要给大家分享一下使用网络映射磁盘的方式,来跨机器访问共享文件夹. 解决方案:   本以为只要在Web服务器做一下磁盘映射,然后把该映射盘符当做本地磁盘来使用就可以了,但是却一直有问题,查找了一下资料,是因为IIS默认账户为NETWORK_SERVICE,该账户是没权限访问共享目录的,所以当我们把站点部署到IIS上的时候,再访问映射磁盘

使用Three.js绘制一个虚拟城市

这篇文章解释了如何使用代码来编写一座3D立体“城市”.这个代码是由@ mrdoob最新发布的演示Demo.我发现这个演示的算法很优雅,是一个简单而有效的解决方案,所以我发了一个帖子解释它. 关于算法的一些评论 在我们将关注焦点置于问题的细节之前,把握下问题的整体和全局是很有帮助的.这个3D虚拟城市所使用的算法是完全由程序所生成的,这意味着整个城市 是动态建立,而不参考任何模板.这个算法相当优雅,且不超过100行javascript代码.这个算法的原理是怎么样的呢?简而言之,每一个建筑是一个 立方

Win 7映射盘问题

公司一同事说了一个问题,他的CAD打开很多图纸,早上打开就有问题.平时打开很少有问题 问题如下: cad里面有面有些图纸是连接到其它网络映射盘里开启时只显示了个连接 网络也正常,到了上午时候就很少有此问题. 后观察家了一下,得出原因如下: 网络盘如果是 打开时就是一个连接(网络是通的盘也可以进去)进去后盘就会变成 这样子了.此时打开的图纸就是正常的. 这就是早上打开正常,平时很少见,因为早上刚开电脑,映射盘还是没有主动去保持发现的. 这样有助于开机进入桌面或打开我的电脑时的响应速度. 如果想解决

SQL Server 备份到网络盘网络映射盘

declare @DBName nvarchar(max)declare @BakName nvarchar(max)--在这里修改数据库名称select @DBName='[LFBMP.PO]'--指定保存路径\\192.168.100.2\d$\DBBakselect @BakName='\\192.168.100.2\d$\DBBak\aa'+REPLACE(@DBName,'.','_')+Convert(char(10),getdate(),120)+'.bak'--启用网络映射盘--

非Linux的开源软件:一个虚拟的Cisco架构?

翻译至:http://www.linuxjournal.com/content/non-linux-foss-virtualized-cisco-infrastructure 我们都熟知虚拟机的理念,它们不仅仅是利用服务器空间资源的一种非常好的方式,它们也允许你瞬间创建和删除服务器.这对一个实验室和培训环境而言简直完美极了.但不幸的是,给Cisco硬件创建培训实验总是令人痛苦不堪.感谢GNS3(图形化网络模拟器3),这已经不再是问题了. 工具的快照 GNS3是一个开源的应用用于创建一个虚拟的Ci

一个虚拟社交公司的融资历程

让我们先看一个虚拟的社交类企业的融资历程: 天使轮:公司由一个连续创业者创办,创办之初获得了天使投资. A轮:1年后公司获得A轮,此时公司MAU(月活)达到50万人,ARPU(单用户贡献)为0元,收入为0. A+轮:A轮后公司用户数发展迅猛,半年后公司获得A+轮,此时公司MAU达到500万人,ARPU为1元.公司开始有一定的收入(500万元),是因为开始通过广告手段获得少量的流量变现. B轮:1年后公司再次获得B轮,此时公司MAU已经达到1500万人,ARPU为5元,公司收入已经达到7500万元

用代码写一个虚拟摇杆

找到一个以前跟老师学时,写的一个虚拟摇杆脚本,希望可以对大家有所借鉴. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class Joystick : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IDrag