程式守護系統,你懂嗎?

zhuweisky發表於2016-11-01

1.什麼是程式守護系統?  

  程式守護系統,用於監控指定的程式,當發現目標程式不再正常工作時,就關閉該程式,並重啟它。

  在什麼情況下使用程式守護系統了?比如說,我們的某個伺服器軟體,在上線後出現一個嚴重的bug,該bug雖然很難出現,但是隻要一出現,整個服務都會停掉(程式沒有崩潰,只是不再提供服務)。此時,重啟服務軟體,又會開始正常工作。

  對於這樣嚴重的bug,必須要查清楚並解決掉的。但是,基於以下兩個原因:

(1)系統已經對使用者開放,服務不能停。不可能說系統先下線,直到bug被解決掉後再重新上線。

(2)bug很難重現,可能需要加日誌,不斷地跟蹤排查,這很可能是一場持久戰。

   為了讓系統繼續線上執行,在bug解決之前,必須要保證系統停止服務之後,能迅速重新啟動恢復服務。此時,使用程式守護系統是最恰當不過的了。

   OrayGuard就是為達到這一目的,實現了一個程式守護系統。一個守護者程式,可以守護同一臺機器上的多個程式。

  

 

2.程式守護系統的實現及使用

   OrayGuard守護者對被守護程式的管理使用的是心跳機制,其原理描述如下:

(1)被守護程式定時向守護者報告(傳送心跳),以表明自己是在正常提供服務。

(2)如果守護者發現某個被守護程式連續一段時間都沒有心跳過來,就關閉對應的程式,然後再啟動對應的程式。

  在OrayGuard系統中,為了方便使用,已經做了很多工作,直接提供如下設施給使用者。

(1)在守護者這一方:提供了可直接執行的exe,雙擊即可執行起來。

(2)在被守護程式這一方:提供了OrayGuard.Core.dll,使用者只要呼叫其中的GuardianProxy靜態類的幾個方法,即可完成所有工作。 

    /// <summary>
    /// 與守護服務進行通訊的Proxy,提供給被守護程式直接使用。
    /// </summary>
    public static class GuardianProxy
    {     /// <summary>
        /// 初始化Proxy,並向守護服務註冊當前程式。
        /// </summary>
        /// <param name="guardServerPort">守護程式提供服務的Port</param>
        /// <param name="timeoutInSecs">超時間隔。單位:秒</param>
        public static void Initialize(int guardServerPort, int timeoutInSecs);

        /// <summary>
        /// 向守護服務啟用當前程式一次。
        /// </summary>
        public static void Activate();

        /// <summary>
        /// 向守護服務登出當前程式。
        /// </summary>
        public static void Dispose();
    }

   在被守護方:

(1)程式啟動時,呼叫GuardianProxy的Initialize方法,即可向守護者註冊當前程式。(埠號就填守護者配置檔案中設定的埠)

(2)程式內需要定時(比如10秒一次)檢測自己是否仍在正常提供服務,如果是,則呼叫GuardianProxy的Activate方法,向守護者傳送心跳。

(3)當程式正常退出時,呼叫GuardianProxy的Dispose方法向守護者登出。

 

 3.Demo以及下載

  最後,我們編寫了一個用於演示的被守護程式的專案,整個系統執行起來後,效果如下:

      

   (注意:實際測試時,不要除錯,而是要雙擊演示專案debug目錄下的TestProcess.exe執行演示,否則,模擬故障後,演示程式會被關閉,但是無法被重啟。因為,除錯時,檢測到的是TestProcess.vshost.exe)

   下載 OrayGuard。壓縮包中包含如下內容:

(1)OrayGuard守護者:可直接執行的守護者程式。

(2)SDK:供被守護程式使用的SDK。

(3)TestProcess:用於演示的被守護程式的專案原始碼。

  

 更多分享:打通B/S與C/S !讓HTML5 WebSocket與.NET Socket公用同一個服務端!

 

相關文章