爲什麼選擇幾個線程的幾個進程來實現Java應用程序?何時通過Java中的線程選擇多個進程?
我正在重構一個較老的java應用程序,它現在被分成幾個運行在同一個多核心機器上的小應用程序(進程),通過套接字相互通信。
我個人認爲這應該使用線程而不是進程來完成,但是哪些論據會捍衛原始設計?
爲什麼選擇幾個線程的幾個進程來實現Java應用程序?何時通過Java中的線程選擇多個進程?
我正在重構一個較老的java應用程序,它現在被分成幾個運行在同一個多核心機器上的小應用程序(進程),通過套接字相互通信。
我個人認爲這應該使用線程而不是進程來完成,但是哪些論據會捍衛原始設計?
我(和其他人,見下面的歸屬),可以認爲有幾個原因的:
歷史原因
魯棒性和容錯
您使用的不是線程安全的組成部分,所以你不能並行withough訴諸多個進程。
某些組件有問題,您不希望它們能夠影響多個進程。假設一個組件有內存或資源泄漏,最終可能會強制進程重啓,那麼只有使用該組件的進程會受到影響。
正確的多線程仍然很難做到。取決於你的設計比多處理更難。然而,後者可以說也不是太容易。
您可以擁有一個模型,讓您擁有一個可以主動監視(並最終重新啓動)崩潰的工作進程的看門狗進程。這也可能包括暫停/恢復進程,這對線程不安全(感謝@Jayan指出)。
OS資源限制&治理
如果這個過程中,使用一個線程,已經使用所有可用的地址空間(例如,在Windows 2GB的32位應用程序),你可能需要在流程中分配工作。
限制資源(CPU,內存等)的使用通常只能在每個進程的基礎上進行(例如在Windows上可以創建「作業」對象,這需要單獨的進程)。
安全考慮
兼容性問題
位置透明
如果您決定使用線程,您將限制您的應用程序在單臺計算機上運行。此解決方案不會擴展(或在某種程度上擴展) - 總是存在硬件限制。
通過套接字進行通信的不同進程可以在機器之間分配,以便您可以添加幾乎無限的數量或它們。這可以在進程間通信緩慢的代價下更好地擴展。
確定哪種方法更適合本身是一項非常有趣的任務。一旦你做出決定,不能保證在需求改變或有新硬件可用時,在幾年後你的繼任者會看起來很愚蠢。
非常真實。在這種情況下,應用程序應該始終在一臺機器上運行,但通常是一個非常有效的考慮點。 – wannabeartist 2012-02-18 09:01:19
優秀列表或論點,謝謝! – wannabeartist 2012-02-18 08:59:30
+1涵蓋我可能列出的所有內容。 (我會強調資源管理和特權分離項目;它們是你不可能在沒有單獨進程的情況下完成的工作,儘管有時候這些時間超出了分離虛擬機的範圍。) – 2012-02-18 09:04:40
+1健壯性包括'容錯'就像一些進程啓動並觀察其他進程一樣(postgres做了一些類似的事情)。 – Jayan 2012-02-18 09:13:47