2009-01-05 89 views
1

我正在編寫一些客戶端/服務器軟件,而且我正面臨以下設計問題。通常,我非常自由地使用VERIFY宏 - 如果用戶機器中出現錯誤,我希望軟件失敗並記錄錯誤,以便修復錯誤。我從來不會忽視任何錯誤。活服務器中的致命錯誤

但是,我現在正在寫一個服務器。如果服務器死亡,許多客戶端就會關閉,所以服務器應儘可能少地死機。因此,我不知道如何處理一些我認爲是致命的例外情況。

例如,我從未登錄的用戶那裏收到一個網絡數據包。即使不應該發生這種情況,但我有足夠的經驗知道不時發生「不可能」的錯誤。所以我很確定,如果我在這些情況下發生致命錯誤,服務器將最終崩潰。另一方面,我可以登錄並忽略錯誤並繼續,但是恐怕有些錯誤可能以這種方式未被發現。

你會在這樣的情況下做什麼?

回答

3

如果你能從錯誤中恢復,顯然它不是致命的。如果您可以記錄錯誤並繼續執行,我看不出失敗的好處 - 最重要的是您已記錄日誌中的錯誤。如果你能恢復並繼續正常運作,那就是最好的方法。

您應該另外實施一個通知系統(server monitoring),根據錯誤級別的不同,它會通知您不同程度的緊急程度,因此您會盡快選擇時間緊迫的事情。有類似於服務器的通用系統,如NagiosMunin。你應該看看他們做了什麼,看看你是否可以從他們那裏拿出一些東西,並將其實施/整合到你的系統中。

無論如何,您應該儘量確保客戶端實例儘可能使用沙箱。客戶端線程不應該關閉整個服務器 - 至少在理論上是這樣。