簡體   English   中英

在服務器之間的Perl腳本之間同步項目列表

[英]Sync item list between perl scripts, across servers

我有一個執行以下操作的多線程perl腳本:

1)一個老板線程在外部服務器上的文件夾結構中搜索。 對於找到的每個文件,它將其路徑/名稱添加到線程隊列中。 如果路徑/文件已經在隊列中,或者正在由工作線程處理,則跳過入隊。

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

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

現在,我想添加第二個服務器,該服務器將與第一個服務器同時工作,搜索相同的文件夾結構,查找要入隊/處理的文件。 我需要一種使兩個服務器都知道每個服務器正在做什么的方法,以便它們不會處理相同的文件。 隊列最小,范圍從20到100。 該列表非常動態,每秒變化多次。

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

我會非常警惕使用常規文件-很難管理鎖定和緩存語義。

IPC是一個大而艱巨的話題,當您在服務器之間做服務器時,確實會變得非常混亂。 您需要考慮更復雜的場景,例如“如果主機A在部分處理時崩潰了,該怎么辦”。

所以首先,我建議您(如果有可能)使您的過程成為冪等。 具體來說-進行設置,以便如果兩個服務器最終都處理相同的事情,那么就不會造成任何危害-這是“低效”的。

我無法告訴您如何執行此操作,但是一般的做法是允許(並放棄)重復工作。

就在不同服務器上同步兩個進程而言-我認為文件無法解決問題-共享文件系統IPC由於緩存而實際上不適合進行近實時操作。 NFS上的默認緩存滯后時間約為60秒。

我建議您從套接字的角度考慮-它們是服務器到服務器IPC的相當標准的方式。 由於您已經檢查了隊列中的“待定”項目,因此在入隊前將其擴展為查詢其他主機(注意-如果它離線或無法訪問,請考慮要做什么)。

需要注意的是,並行性在IPC進行得越少的情況下效果更好。 通過網絡進行通信通常比與磁盤進行通信要快一些,但是比處理器運行的速度要慢得多。 因此,如果您可以制定某種緩存/鎖定機制,而無需為每個文件進行更新-那么它將運行得更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM