第三章、 系統設計與架構
4、 檔案與資料夾同步
檔案監控模組監聽到事件觸發後,會依據 producer-consumer pattern,檔案監 控模組作為 producer,其會把每次產生的異動事件儲存進 Queue 資料結構,而同 步模組作為 consumer,會不斷從該 Queue 資料結構把事件抓出來,再進行同步 工 作 。 其 中 , 檔 案 和 資 料 夾 異 動 事 件 會 轉 為 物 件 並 以𝑂𝑏𝑗𝑒𝑐𝑡𝑠𝑦𝑛𝑐𝑄𝑢𝑒𝑢𝑒= {𝑂𝐼𝐷, 𝑂𝐶ℎ𝑎𝑛𝑔𝑒𝑇𝑦𝑝𝑒, 𝑂𝑃𝑎𝑡ℎ, 𝑂𝑂𝑙𝑑𝑃𝑎𝑡ℎ, 𝑂𝐿𝑎𝑠𝑡𝑀𝑜𝑑𝑖𝑓𝑖𝑒𝑑𝑇𝑖𝑚𝑒, 𝑂𝑆𝑖𝑧𝑒, 𝑂𝑇𝑦𝑝𝑒}存進 Queue。
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
4.2 同步機制設計
同步機制的設計分為,客戶端和網站 Portal 對同步伺服器之間的同步訊息溝 通以及檔案和資料夾的同步,如下所述。
( 1 ). 同步訊息溝通
同步模組從 Queue 把使用者異動事件取出來,接著判斷操作行為和類型是 檔案或資料夾以及其相關資料後,不會馬上就開始進行檔案同步工作,而是會先 和同步伺服器進行檔案同步要求,得到同步許可後,才會開始進行檔案或資料夾 同步,完成後會再告知同步伺服器,同步訊息的溝通是透過通訊伺服器上的 RabbitMQ 來進行處理,此三次訊息溝通的詳細順序圖如圖十八。
圖 十八:三次同步訊息溝通順序圖
此 三 次 同 步 訊 息 : 請 求 同 步 , 其 資 料 內 容 為 𝑂𝑏𝑗𝑒𝑐𝑡𝑠𝑦𝑛𝑐𝑅𝑒𝑞𝑢𝑒𝑠𝑡= {𝑂𝑈𝐼𝐷, 𝑂𝐼𝑡𝑒𝑚𝐼𝐷, 𝑂𝑂𝑙𝑑𝐼𝑡𝑒𝑚𝐼𝐷, 𝑂𝑃𝑎𝑡ℎ, 𝑂𝑂𝑙𝑑𝑃𝑎𝑡ℎ, 𝑂𝐶𝑙𝑖𝑒𝑛𝑡𝐾𝑒𝑦, 𝑂𝐶ℎ𝑎𝑛𝑔𝑒𝑇𝑦𝑝𝑒, 𝑂𝑇𝑜𝑘𝑒𝑛, 𝑂𝐸𝑚𝑎𝑖𝑙, 𝑂𝑇𝑦𝑝𝑒, 𝑂𝐻𝑎𝑠ℎ}、回應同步請求,其 內 容 為𝑂𝑏𝑗𝑒𝑐𝑡𝑠𝑦𝑛𝑐𝑅𝑒𝑠𝑝𝑜𝑛𝑠𝑒= {𝑂𝐼𝑡𝑒𝑚𝐼𝐷, 𝐼𝐶ℎ𝑎𝑛𝑔𝑒𝑇𝑦𝑝𝑒, 𝑂𝐼𝑡𝑒𝑚𝑅𝑜𝑙𝑒, 𝑂𝑃𝑎𝑡ℎ, 𝑂𝑆𝑡𝑎𝑡𝑢𝑠, 𝑂𝐴𝑢𝑡ℎ}和 同步完 成, 其內 容為
,
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
皆會轉成 JSON 資料格式並以字串型態,來進行訊息傳遞和交換。
( 2 ). 檔案與資料夾兩階段同步
當第二次同步訊息溝通結束,同步伺服器允許客戶端開始進行同步,客戶端 應用程式、網站 Portal 會把檔案或資料夾,以 OpenStack Swift 所提供的 REST API 同步到儲存伺服器,此為第一階段同步。同步完成後,客戶端應用程式、網 站 Portal 會向同步伺服器送出第三次同步完成訊息,當同步伺服器收到同步完成 訊息,此時就會再把該檔案或資料夾,以 REST API 從 OpenStack Swift 取得,再 透過要同步的雲端儲存服務所提供的 API,把檔案和資料夾同步到對應的資料夾,
此為第二階段同步。從客戶端和網站 Portal 到同步伺服器,而同步伺服器再同步 到公、私有雲端儲存服務,此兩階段的同步順序如圖十九。
圖 十九:兩階段同步順序圖
本系統檔案和資料夾同步,透過先同步到 OpenStack Swift 之上,在轉而同 步到公有雲和其他私有雲上,這樣的做法可以確保使用者每一份同步到雲端的檔 案和資料夾,在私有雲內部都將會有一份備份。
4.3 雲端檔案與資料夾異動偵測
使用者進行檔案和資料夾異動操作,除了在本系統的客戶端和網站 Portal 上 操作之外,也有可能是直接在已連結的雲端儲存服務,利用其所提供的介面,進
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
行檔案異動操作。本系統為了達到雲端和本地端以及不同裝置之間的檔案一致性,
會採用主動通知(Push)和被動掃描(Polling)混合的方式,以下將針對此兩種操作 情境和機制詳細說明。
( 1 ). 本系統上操作
使用者在本系統客戶端和網站 Portal 上,進行檔案異動操作,當同步伺服器 開始進行第二階段的同步時,如果該使用者還有其他裝置,也安裝了客戶端應用 程式並且是啟動狀態,為了維持不同裝置上的檔案一致性,同步伺服器會採用主 動通知(Push)該使用者其他客戶端應用程式,使其來進行檔案同步,詳細流程如 圖二十。
圖 二十:客戶端應用程式更新本地端順序圖
該通知同步訊息內容為,𝑂𝑏𝑗𝑒𝑐𝑡𝑠𝑦𝑛𝑐𝑁𝑜𝑡𝑖𝑓𝑖𝑐𝑎𝑡𝑖𝑜𝑛= {𝑂𝑇𝑦𝑝𝑒, 𝐼𝐶ℎ𝑎𝑛𝑔𝑒𝑇𝑦𝑝𝑒, 𝑂𝑠𝑒𝑟𝑣𝑒𝑟𝑃𝑎𝑡ℎ, 𝑂𝑠𝑒𝑟𝑣𝑒𝑟𝑁𝑒𝑤𝑃𝑎𝑡ℎ},也 會轉成 JSON 資料格式並以字串型態,來進行訊息傳遞。
( 2 ). 雲端儲存服務上操作
使用者直接在已和本系統連結的雲端儲存服務,例如:Google、Dropbox、
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
Microsoft 以及 Amazon,上面系統對應的資料夾進行檔案異動,客戶端應用程式 會採用定期抓取(Polling)雲端服務上的檔案清單,和本地端檔案清單進行比對,
有異動則會直接對本地端檔案進行異動,比對沒有變化則不進行動作,詳細如圖 二十一。
圖 二十一:客戶端應用程式檢查雲端儲存順序圖
當檔案從雲端同步到本地端完成後,客戶端應用程式會偵測到檔案系統異動 事件,則會依照兩階段同步流程,進行後續同步工作。
4.4 檔案清單一致性
為了要確保使用者在各裝置上的檔案清單的一致性,本系統在伺服器端 MongoDB 資料庫會儲存使用者的完整檔案清單,除此之外,在客戶端應用程式 和伺服器端還會有維護清單一致性的處理機制,詳細的設計如下所述。
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
( 1 ). 客戶端應用程式
客戶端應用程式在啟動和恢復網路連線狀態時,皆會和同步伺服器要求登入 使用者的完整檔案清單,並檢查在監控資料夾內的檔案清單是否符合。如果有不 相同或不存在檔案、資料夾,則依據其建立時間,檢查是否大於檔案清單的最後 修改時間,來判斷要新建或移除。
( 2 ). 同步伺服器
同步伺服器在每次第一階段同步完成,都會把此次同步的檔案或資料夾的完 整路徑,來更新 MongoDB 的使用者檔案清單,儲存的 JSON 結構如圖二十二。
圖 二十二:MongoDB 檔案清單 Files Collection 的 JSON 結構
儲存的每一筆資料都是以使用者為單位,並且以其 UID 作為唯一識別,當 使用者進行檔案同步,系統會解析檔案的完整路徑,分為根資料夾和其餘路徑來 作為儲存的依據。其中,根資料夾,例如:Google Drive、Microsoft OneDrive、
Dropbox、Amazon S3 各自會作為儲存 JSON 資料 list 陣列裡面的一筆資料,代 表該雲端儲存服務的最上層目錄,而 sub 陣列則存有根資料夾之下每一個資料夾 路徑,並記錄其內所有檔案的資訊,此外會根據該目錄隸屬於的雲端儲存服務,
額外儲存相關屬性。
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
4.5 檔案與資料夾同步 API
系統對內除了使用 OpenStack Swift 所提供的 REST API 之外,對外還會額 外提供檔案同步的 API,功能包含檔案和資料夾的新增、刪除、修改以及查詢,
提供網站 Portal 程式和擁有存取權限的用戶使用,此 API 介面的同步功能如表 六。
表 六:檔案與資料夾同步 API 介面
類型 API 參數 功能描述
檔案 POST (token,path,content) 建立或更新檔案資料 PUT (token,path,newPath) 更名檔案
GET (token,path) 取得檔案資料 DELETE (token,path) 刪除檔案資料 資料夾 POST (token,path) 建立資料夾
PUT (token,path,newPath) 更名資料夾 GET (token,path) 下載整個資料夾 DELETE (token,path) 刪除整個資料夾
其他 LIST (token,path) 取得檔案和資料夾清單 資料夾下載 API,會提存取的資料夾內所有檔案打包成壓縮檔(.zip),供介接 的程式或使用者取得;資料夾刪除 API,則是會把刪除的資料夾內,包含檔案以 及子資料夾,直到最後一層全部進行刪除。
‧
使用者經本系統同步到雲端的檔案,在權限管理平台(網站 Portal)上都可以 進行權限管理,其包含設定檔案狀態為私密或公開。使用者可以直接從客戶端應 用程式進行檔案公開設定,便可以獲得存取網址,而網站 Portal 上將會提供一個 彙整了登入使用者自己的公開檔案列表,方便使用者去做管理,使用者可以把檔 案狀態重新設定為私密,檔案對應的存取網址就會失效,不再提供功能。