我們正在嘗試爲Windows編寫服務,並且需要提供冗餘計劃,以便在應用程序中的某些內容失敗時重新啓動。我想知道如果我可以使用多線程來實現這一點。帶多線程的應用程序冗餘
我的想法是創建兩個線程,每個線程處理單獨的任務。我希望每個線程都監視另一個線程以確保它仍然在運行,如果沒有,那麼它應該啓動該線程的一個新實例。 這聽起來可行嗎?我將使用什麼線程技術:互斥鎖,共享內存,信號量等? 如果這不是正確的方法,那麼可能是什麼,只寫兩個單獨的服務並使用IPC?
我們正在嘗試爲Windows編寫服務,並且需要提供冗餘計劃,以便在應用程序中的某些內容失敗時重新啓動。我想知道如果我可以使用多線程來實現這一點。帶多線程的應用程序冗餘
我的想法是創建兩個線程,每個線程處理單獨的任務。我希望每個線程都監視另一個線程以確保它仍然在運行,如果沒有,那麼它應該啓動該線程的一個新實例。 這聽起來可行嗎?我將使用什麼線程技術:互斥鎖,共享內存,信號量等? 如果這不是正確的方法,那麼可能是什麼,只寫兩個單獨的服務並使用IPC?
那麼讓服務在失敗時重新啓動的最簡單方法就是讓Windows執行此操作。您只需將服務配置爲自動重新啓動,這非常簡單。您也可以在服務安裝程序中以編程方式執行此操作。有關如何執行此操作的指南,請參閱此文章:Building a Windows Service – Part 4: Extending the Service Installer。
至於這提供「冗餘」,這不。冗餘的正確定義意味着你有不止一個。這可能會使用多個服務,或者更有可能在多個主機上使用多個服務。在單個主機上擁有多個服務比較容易,因爲如果需要可以使用互斥鎖進行同步。
真正的問題是這個服務在做什麼?
如果您的服務正在輪詢任務,比如說從數據庫或消息隊列中進行輪詢,那麼您的同步就會得到照顧。只需對數據庫建模即可使多個服務都能獨立運行並獨立處理工作而無需重複工作。現在你有冗餘。
只是讓窗戶處理它將是最好的我猜。我並不是在尋找一種方法來讓服務「在離開的地方繼續」。我只是想,既然服務需要多線程(出於其他設計原因),讓他們互相觀看將是一個很好的補充。現在我意識到,如果一個線程崩潰,那麼整個應用程序會崩潰並殺死兩個線程。 –
是的,這聽起來像一個可行的解決方案。雙線程唯一的問題是,如果應用程序崩潰,那麼兩個線程都會死掉(如果它們是後臺線程) 我發現這個問題有用的解決方案是有一個看門狗進程。每當工作進程崩潰時,看門狗就會啓動並創建一個新實例並運行它。
您可以簡單地將應用程序編寫爲Windows服務使用的類庫(Visual Studio中的模板,您需要添加安裝程序)。 如果你以這種方式運行你的應用程序,你可以隨時選擇設置行爲,如果有什麼應該失敗,即總是重新啓動,重新啓動幾次,之後給別人發送電子郵件或運行這個其他應用程序等。
它是內置於任何Windows框中,您擁有憑據,所有的辛苦工作都爲您完成。對於我需要始終保持正常運行的服務而言,始終沒有任何問題。
要做到這一點,只需將服務類型設置爲自動(如果您的盒子重新啓動,這將重新啓動它),然後有前三次重新啓動的選項,您可以根據需要設置任何內容management window在服務部分。
我發現它涵蓋了各種情況下的最強大的解決方案是有一個監視進程能夠啓動和停止工作進程。您將使用WCF在進程之間來回發送信號(或其他信息)。這個想法是保持看門狗過程的簡單,以便在執行有限的一組任務時幾乎沒有機會出現故障。然後將所有有風險的邏輯放在工作進程中。
想出一個協議,用於將故障或工作進程的健康狀況傳遞給看門狗進程。這裏有一些想法。這個清單絕不是一個詳盡的清單。
除了最後一項Windows服務控制管理器無法處理其他3種情況。這是我喜歡看門狗流程理念的原因之一。另一個原因是因爲你的主要邏輯可能會阻塞呼叫。由於Thread.Abort
不推薦使用,因爲它損壞了狀態,除了殺死工作進程之外,你真的沒有什麼選擇。
另外,儘量讓您的主邏輯儘可能容錯。這樣,如果你確實需要強制終止它,那麼恢復和清理它留下的混亂就容易多了。這可能意味着使用諸如數據庫事務或聰明文件操作之類的原子操作。
這真的取決於你的意思是「應用程序中的某些內容失敗」。你能舉出一些你想要恢復的故障的例子嗎? – dlev
困難的部分將找出另一個線程從哪裏離開,並確保你不會一直打到相同的錯誤,並且一遍又一遍(永遠)重新啓動。這將消耗很多系統資源。 – Servy