2016-11-14 96 views
0

我有一個多線程的perl腳本執行以下操作:在外部服務器上通過文件夾結構同步項目列表,跨服務器

1)一位老闆線程搜索。對於找到的每個文件,它都會將其路徑/名稱添加到線程隊列中。如果路徑/文件已經在隊列中,或者正在被工作線程處理,則排隊被跳過。

2)十幾個工作線程從上述隊列中出列,處理這些文件並將它們從硬盤中刪除。

它運行在一臺物理服務器上,並且一切正常。

現在我想添加第二個服務器,它將與第一個服務器同時工作,搜索相同的文件夾結構,查找要排隊/處理的文件。我需要一種方法讓兩臺服務器知道每個人在做什麼,以便他們不會處理相同的文件。隊列最小,範圍從20到100個項目。該列表非常具有動態性,並且每秒都會發生多次更改。

我是否只需寫入/讀取常規文件以使其保持與當前項目列表同步?有任何想法嗎?

回答

0

我會對使用常規文件非常謹慎 - 這將很難管理鎖定和緩存語義。

IPC是一個很大而且很難的話題,當你在服務器到服務器時,它確實會變得非常混亂。你需要考慮更復雜的場景,比如'如果主機A出現局部處理崩潰'。

所以首先我建議你需要(如果可能的話)使你的過程冪等。具體來說 - 設置它,以便如果兩臺服務器最終都處理相同的事情,則不會造成任何損害 - 這只是「低效率」。

我不能告訴你如何做到這一點,但一般是允許(並放棄)重複的努力。

在不同服務器上同步你的兩個進程的方面 - 我不認爲一個文件可以做到這一點 - 共享文件系統IPC由於緩存而不適合近乎實時的操作。 NFS上的默認緩存滯後大約在60秒左右。

我建議你根據sockets來思考 - 它們是一種相當標準的服務器到服務器IPC的方式。由於您已經檢查隊列中的「待處理」項目,因此在入隊之前將其擴展爲查詢其他主機(請注意 - 如果它處於脫機狀態或其他情況,請執行此操作)。

這裏的警告是並行性越好IPC越少。通過網絡聊天通常比談論磁盤快一點,但是它比處理器運行的速度慢得多。所以如果你可以制定某種緩存/鎖定機制,那麼你不需要更新每一個文件 - 那麼它會運行得更好。

+0

幸運的是,系統(Linux上的ffmpeg)似乎是「自我冪等」,因爲當兩個進程接管同一個文件時,它不會損害文件:它只是兩次相同的工作。 我非常喜歡套接字解決方案,可能偏向於我的網絡背景(我不是專業程序員)。我甚至可以看到它與UDP信令協同工作,其中一個服務器詢問是否有其他人持有下一個要入隊的文件,而不是TCP連接讀取整個列表。 無論如何,我會考慮一段時間,並報告回來,如果我得到這個工作(仍然是一個原型項目)。 –