使用dokan實現一個虛擬映射盤?來我們聊聊

緣起:

項目組一直在做網盤客戶端(同步協作盤)的開發,產品進入市場,用戶使用以後出現了很多問題。其中一個最大的問題就是,用戶數據量很大(有很多公共庫共享文檔,部分用戶數據量超百萬),首次登陸要同步很長時間,且共享文檔庫文檔變化時,所有用戶都要同步,實時佔用用戶的資源,嚴重影響用戶體驗。(ps:我們使用精益項目管理,產品基本功能穩定以後,就給用戶使用,不斷優化迭代)

解決:問題來了,腫麼辦?一看是性能問題,項目組就排了前端後端性能測試和性能優化的計劃,順便說,客戶端的性能優化是我做的。優化以後我們的性能提升了很多(優化後客戶端性能提升10倍+),那麼問題來了!行不行呢?產品再次給用戶體驗時,用戶根本就不滿意,沒有解決根本問題。結果就是回退到舊產品,新產品用不起來。

其實這個問題一開始就偏離的方向,問題的根本不在性能,因爲用戶要的即時訪問,即用即取,不管怎麼優化,同步大批量文件還是需要一段時間的。

這個時候討論以後,成立的項目攻關小組,決定用dokan做虛擬映射盤。

dokan是什麼?

dokan是一個用戶態的文件系統驅動,可以稱之爲fuse for windows。

我就不當拷貝機了,更詳細介紹請戳這裏吧:

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

wKioL1Tat0LhRPonAACDsuWehBA445.jpg

這個圖清晰的反應出了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

spacer.gif

<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最大的問題就穩定性和系統兼容性。另外和各類應用各個版本強關聯,需要一一兼容支持,也是件很蛋疼的事情。


因個人水平有限,如有筆誤、講解不清楚、探究的不清楚的地方。還請各位路過的小夥伴們海涵,並指出問題,幫助我幹掉它。轉載請註明出處。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章