2009-09-14 61 views
1

展望未來,當一個Web農場將被創建以...Windows服務在Web場(如何防止併發衝突)

我們必須執行各種回地面任務的各種窗口服務應用程序:發送電子郵件,縮略圖/處理文件等。

在服務器場環境中,我們可以理論上在每臺計算機上安裝並運行每項服務,但由於基於業務對象的「首寫贏」或不合需要的重複任務例如:發送多次的相同電子郵件。

可以通過解決問題或跳過項目的代碼或邏輯來克服「首寫」方案。 (如果它的基本排隊機制(查詢列表和過程記錄),它只會再次嘗試)

對於任務重複,可以在事務中執行任務以防止其他進程獲取相同的資源,但是我猜他們會等待,我們需要根據事情再次處理一些登錄?情況會是這樣嗎?

爲了防止重複的任務,我想建立一些機制,將一個「鎖定標誌」寫入數據庫,該數據庫將由啓動的第一個服務設置。該標誌將會註明日期並引用該服務的實例。 「擁有」標誌的服務將運行任務並定期更新此日期。在服務不擁有該標誌的情況下,每個服務也會有超時/容限設置,它將檢查容差並在需要時接管。

這聽起來像一個合理的解決方案還是一個應該去一個更好的消息,在這個階段(排隊基礎的解決方案還不能確定,將如何在農場工作environement

TECNOLOGIES:C#/ ASP.NET/SQL Server的

+0

如果某個服務在鎖定某些記錄後出現故障並完成了任務,但在寫入之前會發生什麼? – 2009-09-14 09:48:45

+0

這個想法是記錄不會被鎖定,它只是一個標誌,表明哪個服務正在做這項工作。日期標記將向其他服務表明某些失敗。在這種情況下,另一項服務將接管(類似於在同一臺機器上重新啓動一項服務)超時/容忍時間將需要超過任務(或多項任務)需要完成的預期時間長度。 – 2009-09-14 09:57:05

回答

2

我能想到的兩種機制。

  1. 如果所有的任務是從數據庫導出activites你可以創建一個新的「任務」表,並設置觸發的活動,讓一個新紀錄任務信息不存在特德。然後,您的Windows服務可以輪詢「任務」表並使用原子選擇和刪除事務來確保只有一個服務執行它。

  2. 您可以使用消息隊列並在其上放置任務,然後讓Windows服務輪詢隊列。每個排隊的消息只能通過一個服務進行排隊,因此您可以確保每個任務只進行一次。當然,你必須擔心消息隊列的負載。根據您的應用程序,您可以使用像亞馬遜的簡單隊列服務這樣可以減輕您不必擔心可靠性和可伸縮性的問題。

+0

投票支持第二種解決方案 – 2009-09-14 10:06:05

+0

第二種解決方案的確證實了我的想法,即更多的企業消息傳遞排隊系統是最佳選擇。 – 2009-09-14 10:08:57

相關問題