2008-10-21 126 views
2

我有一個應用程序運行在多個IIS服務器上,這些服務器需要解析放置在通用網絡驅動器上的CSV文件。如果我使用System.IO.FileSystemWatcher Created event在文件可用時通知事件,我如何確保只有一臺服務器解析文件?如果所有服務器都收到此更改的通知,則所有服務器都會嘗試解析該更改。第一臺服務器是否應該在本地複製並解析它?這會在其他服務器上導致錯誤嗎?我應該將遠程目錄訪問設置爲只允許一個服務器讀取訪問權限嗎?只允許一個服務器訪問網絡驅動器上的文件

該文件包含需要插入共享數據庫的記錄,但沒有記錄的唯一鍵。因此,如果多個服務器同時抓取文件並插入記錄,則數據庫中將存在重複項。

+0

也許改變標題可以幫助問題得到更多關注? IIS和FileSystemWatcher實際上與核心問題無關,我建議將它們排除在外。 – Tomalak 2008-10-22 06:54:32

回答

2

關鍵問題是:當所有人都大致同時嘗試並解析文件時會發生什麼不好的事情?基本上在文件系統級別允許多個讀取訪問,所以這個事實本身不一定會破壞任何東西。

我可能會嘗試在首次訪問文件時創建鎖定文件的方法,並使服務器在訪問文件之前查找鎖定文件。完成後刪除鎖定文件。

您也可以在文件上放置一個排它鎖,一次只有一臺服務器可以做到這一點。其他人將嘗試失敗:

FileStream fs = new FileStream(
    FilePath, 
    FileMode.Open, 
    FileAccess.ReadWrite, 
    FileShare.None 
); 
0

另一種選擇,而不是鎖是將文件重命名爲目錄。爲每個服務器創建一個子目錄,然後讓服務器嘗試將該文件重命名爲其目錄(重命名爲原子操作)。成功的人得到解析文件。

鎖定問題很棘手,因爲每個服務器仍然可以看到該文件,他們可能會嘗試打開該文件,然後重複出錯。對於文件的所有者,重命名將是絕對的。

另外請記住,無論您使用哪種解決方案,都會有「丟失文件」的可能性。如果服務器停止處理文件(錯誤,異常,重新啓動...),它可能會被放棄。這些類型的問題的典型解決方案是,除了諸如文件監視器之類的服務器之外,您還有服務器不時地進行輪詢。

將文件複製到服務器目錄將有助於此。如果一臺服務器完全脫機,那麼它的一個缺點就是它的文件將被放置在一個目錄中,直到服務器重新聯機爲止。

相關問題