這是為我們網站解決南北電信網通互聯互通問題而寫的一個程序。
優游中國(www.yooyocn.com)是一個大型旅游門戶網站,提供了資訊,視頻,圖片,博客,論壇等大數據量的業務內容。
為了使全國各地的網友都能夠快速訪問我們的網站,我們部署了三臺服務器,一臺雙線主服務器,一臺網通專線服務器,一臺電信專線服務器。通過智能DNS解析,使網通的用戶訪問網通服務器,電信用戶訪問電信服務器。
而雙線位于我們所在的城市,僅供我們網站編輯人員使用。因為我們的現狀,雙線就是雙慢。所以,只只我們的編輯人員操作它上面的內容管理系統(CMS),把資訊,視頻,圖片上傳到這臺服務器上。然后,需要一個方法把雙線主服務上新增加或修改的內容分發(也就是復制)到網通和電信的服務器,使網通電信用戶都能看到同樣的內容。
這就出來兩個問題,一是同步,是增量同步,二是實時。
我花了很多時間尋找滿足需求的工具。我記得在兩年以前,鏡像服務器應該是一個熱門話題吧。這樣的工具應該不少。但出乎意料,都是一些定時全部復制的軟件。沒有說是網站增加修改文件了,馬上就可以同步到其它服務器上。例如,當初很流行的Update Now! ,2000年的東西,至今還有很多人在用。CuteFTP 8的文件同步功能,最少是每天運行一次,并且是遍歷所有文件后把不同的文件FTP過去。
晚上和朋友郁悶地談起這個事,他主要是做WinForm的,立馬說.NET里有文件監控的類。可以實時獲取增加或變更的文件。我大笑,好啊,正發愁呢!.NET的FTP類也很強,那就不如自己搞!第二天花一個上午,研究FileSystemWatcher。下午出個了DEMO,果然很強,就決定做。實現流程代碼量并不多,一天半時間就搞定了,剩下三天都在解決其中的各種問題。在服務器上運行時,問題一個一個出現,被自以為完美地解決,高興一會后,發現有更棘手問題出現…
程序主要實現了如下功能:
通過FileSystemWatcher實時監控指定的文件夾,取得文件夾下增加或修改的文件名,通過“NotifyFilters.Size”屬性實現。它有很多屬性,LastAccess,LastWrite,測試時把我搞得很糊涂,往這個文件夾下粘貼一個文件,會引發好幾次這個事件。查了好久才明白,COPY操作確實是這樣。但具體為啥,MSDN上也沒說清。好在服務器上運行時沒出現這個現象,也放過了。
捕獲文件名后沒有立即FTP,把文件信息放在了XML中,FTP從XML文件中讀取文件名并上傳,上傳成功的信息移到另外的XML中。以上過程中的出現的異常也放在日志XML中。這個處理流程,也是我花了一晚上才想起來的。
所以,這個程序代碼主要有三大塊,一是監控,二是讀寫XML,三是FTP。
實現這些功能的代碼并不多,不復雜,但我的收獲不是程序本身,而是又一次體會到了編碼時的快樂和樂趣。
在寫這個程序時,參考了很多資料,很多網友寫的代碼。所以,當我也做出一些東西時,我把它開源出來,希望能讓更多的人受益。
最后,這個程序到現在為止,雖然能運行,但它并未真正部署。因為,我們選擇了更好的服務器架構解決方案,具體請看我的另一篇文章。
另外,這個程序還有很多遺憾沒有解決,希望能夠以此拋磚引玉,更多的人,做出更優秀的程序。
??? 源碼下載:/Files/xtigmh/FileSystemWatcher200801141016.rar?