2012-03-13 100 views
2

我有一個在Windows服務中運行的類庫。這個庫有很長的運行線程來輪詢電子郵件(可以分解成任務),處理消息等,並運行良好。分佈式窗口服務

這是需要通過添加節點向外擴展的產品的一部分。我目前定義了哪些客戶是由單個節點處理的。

如果該節點出現故障或需要維護,則需要手動干預,並且在停機期間數據丟失。我想提出一個解決方案,使其能夠像負載平衡的Web服務器一樣工作。如果一個節點出現故障,應用程序可以看到並正確執行。

這是建立在C#/ .NET和MS SQL Server上,並希望堅持這些技術。

我意識到這可能不像我的問題那麼直截了當,但我正在尋找任何設計模式或最佳實踐,可能會幫助我構建出解決方案。

回答

3

1)讓每個安裝的windows服務在數據庫中註冊本身,其中unique id

2)當你的服務還活着時,發送一個心跳。這種心跳可以與上次登錄服務時更新DateTime字段一樣簡單。您可以直接在數據庫中更新字段,也可以通過Web服務。

3)創建一個表,用於定義一組任務以及執行該任務的計算機的分配unique_id。這可以先到先得。一臺機器可以選擇它所選擇的任何任務,並且它通過在該表中註冊自己獲得該任務的獨佔權。我更喜歡這種方法,而不是集中控制,因爲當您的集中控制器關閉時,您不必擔心任務不會運行。

4)定義心跳的超時值。您的每個分佈式服務都將檢查未被拾取或超時的任務。任何執行任務的機器的心跳維持不應取決於任務需要多長時間。也就是說,如果任務A需要5分鐘,則machineA應該在5分鐘內更新其心跳,以便machineB不會將其標記爲關閉。

5)根據您的任務有多複雜,您可能需要工作人員更新的狀態列。

0

我的設計將是一箇中央服務,它將維護和分配工作以及實際處理工作的其他工作服務。所以當有一些工作需要完成時,他們會被添加到中央服務隊列中,服務會通知工作人員的服務。接下來,每個工人都會嘗試找到一份工作來執行。如果工作分配給工作人員,工作人員將根據工作是否成功或未完成工作來更新工作狀態。通過使用這種設計,您可以輕鬆地擴展到任意數量的工人服務,並且如果一兩名工作人員因爲工作未完成而不影響其他工作人員,則其他工作人員可以接受並處理它。

+0

感謝您的想法,我想遠離中央服務器部分,它仍然保持我的單點故障。 – 2012-03-14 12:23:59

0

我的方法是將該服務分發給多臺計算機,並通過PAXOS或類似算法協調服務以處理領導者選舉。因此,當一個節點中的服務停止時,其他服務器中的服務可以佔據該位置。 以更實用的方式,我肯定會使用Apache Zookeeper來協調領導人選舉。