2012-05-03 49 views
1

可以說我有每運行一個後臺程序100個服務器 - 允許調用它server - 服務器是負責產生線程此特定服務的每一個用戶(可以說每個服務器1000個線程)。每N秒每個線程做東西並獲取特定用戶(這個請求/響應模式不能改變)的信息。我有一個問題有時是一個線程掛起,並停止做東西。我需要一些方法來知道用戶數據已過時,需要刷新。分佈式服務器模式

我唯一的想法是每個5N秒紛紛跟帖更新與用戶(users表中的一個last_scanned列)相關的MySQL的記錄,並檢查表中的每一15N秒另一個過程中,如果last_scanned列不是最新的,重新啓動線程。

+0

當線程停止執行某些操作時,是預期的行爲還是由於錯誤? – Jordan

+0

由於錯誤 - 我應該指定線程掛起(是的,我也應該修復錯誤,所以這不會發生在第一位,但讓我們忽略) – v0idless

回答

1

來處理這種情況的一般方法是讓線程報告其狀態回服務器守護程序。如果你在最近5秒鐘內沒有看到狀態更新,那麼你殺死線程並開始另一個線程。

您可以跟蹤你已經在列表中紡起來,然後就循環通過他們偶爾來確定狀態當前活動的線程。

當然也應該修復你的程序是導致線程過早退出的錯誤你。

過早退出,殺死一個線程也可能讓你的程序在一個意想不到的,非原子狀態。您應該也可以讓服務器守護進程運行一個清理過程,以確保隊列中的任何項目或您用來確定工作負載的任何項目,在一段時間不活動後重置。

+0

這當然是一個更好的模型,但什麼會如果服務器守護程序死亡(停電,硬件故障等),會發生?我仍然覺得需要有某種持久性存儲,所以如果服務器守護進程死亡,它會知道它所持有的用戶或需要掃描的用戶。 – v0idless

+0

我認爲你已經有某種持久性存儲來完成這項工作。一般人們會用這樣的排隊。你可以看看RabbitMQ。 – Jordan