訪問量大了,理論上不會崩潰,只是理論上。
訪問量大了,你的記憶體滿了、TCP連線到頂了(比如time_wait太多,無法接受新連線)、CPU已經忙不過來了——這一切的理論後果是處理速度慢了,或者直接拒絕新的服務請求。
但如果你的伺服器程式碼有缺陷,比如記憶體無法分配,丟擲異常,而你沒有處理這異常(大家都知道,一些情況下處理各種錯誤的程式碼甚至可能會佔你程式碼量的一半,非常繁瑣),會造成程序的退出——崩潰;或者無法建立新的TCP連線,你又沒有處理這種異常——崩潰;磁碟滿了——崩潰……程式一大這種細小的問題會多如牛毛。甚至你依賴的基礎軟體,如JVM,記憶體不足也可能導致崩潰。雖然有交換分割槽的存在,但也只是延遲了記憶體分配失敗的時間,但此時效能已經急劇下降,與崩潰無異——完全沒響應了。
所以,始於Erlang的“就讓它崩潰”思路,在這是有用的。它不會因為一些事情導致你的整個程式退出,而是某個“程序”(erlang的“程序”你可以粗略理解為一個執行緒)退出,並讓父“程序”捕獲到這個錯誤。等這些破事過去,你的伺服器就又像以前一樣歡快了。
那麼,如何防止這些崩潰?一方面你的程式要健壯,不會因為這些錯誤而導致整個程式的退出,將錯誤限制在工作執行緒或子程序裡。另一方面,你的系統要做限流。
訪問量大了,理論上不會崩潰,只是理論上。
訪問量大了,你的記憶體滿了、TCP連線到頂了(比如time_wait太多,無法接受新連線)、CPU已經忙不過來了——這一切的理論後果是處理速度慢了,或者直接拒絕新的服務請求。
但如果你的伺服器程式碼有缺陷,比如記憶體無法分配,丟擲異常,而你沒有處理這異常(大家都知道,一些情況下處理各種錯誤的程式碼甚至可能會佔你程式碼量的一半,非常繁瑣),會造成程序的退出——崩潰;或者無法建立新的TCP連線,你又沒有處理這種異常——崩潰;磁碟滿了——崩潰……程式一大這種細小的問題會多如牛毛。甚至你依賴的基礎軟體,如JVM,記憶體不足也可能導致崩潰。雖然有交換分割槽的存在,但也只是延遲了記憶體分配失敗的時間,但此時效能已經急劇下降,與崩潰無異——完全沒響應了。
所以,始於Erlang的“就讓它崩潰”思路,在這是有用的。它不會因為一些事情導致你的整個程式退出,而是某個“程序”(erlang的“程序”你可以粗略理解為一個執行緒)退出,並讓父“程序”捕獲到這個錯誤。等這些破事過去,你的伺服器就又像以前一樣歡快了。
那麼,如何防止這些崩潰?一方面你的程式要健壯,不會因為這些錯誤而導致整個程式的退出,將錯誤限制在工作執行緒或子程序裡。另一方面,你的系統要做限流。