Tomcat應用部署是否要一個蘿蔔一個坑?
經常有讀者在後臺向我提問,一些個性化的問題就直接在後臺回覆了。也有些比較普遍的問題,比如下面這個:
自己的專案有多個應用,這些應用是要部署到同一個 Tomcat 裡好,還是多個應用分別部署到不同的 Tomcat 裡,每個裡面只部署一個應用好呢?
最近在 Tomcat 官方的「郵件組」裡也看到類似的問題,可能這個問題不分國界。一些 Tomcat 的 commiter 也給出了自己的看法,大家看法都不一樣,正好咱們一起來看看,兩種情況相比較,到底怎樣使用適合。
首先我們自己先想一下,如果多個應用部署到一個 Tomcat 例項中,優劣分別有哪些呢?
優勢 :
安裝管理、監控都方便,只需要安裝一個 Tomcat,所有的操作都指向同一個例項即可。
劣勢:
多個應用共用 Tomcat 的記憶體,容易互相影響。如果有一個應用佔用堆太多,頻繁的 GC 也會使其他應用跟著暫停。
每個 Tomcat 例項部署一個應用呢?
優勢 :
多個應用之間 Tomcat 的記憶體互相隔離,互相之間無影響。一個應用crash,頻繁 GC,都隻影響其自己,影響面縮小。
劣勢:
相比一個例項,安裝管理、監控都較繁瑣一些。可以通過安裝一個例項,設定不同的CATALINA_HOME來簡化一些操作。
郵件組裡的問題描述比上面的更詳細一些。並且羅列了自己認為的優劣。
郵件內容較多,我選其中關鍵的幾段翻譯如下,其中描述意見分歧在開發人員和運維人員之間:
運維認為一個 Tomcat 部署多個應用,原因如下:
省記憶體 (每個 Tomcat 都會有記憶體的 footprint,即使沒有應用部署執行)
省去額外的檔案系統 (logs, tomcat installation, temp directory)
省去 nagios 監控配置
省去不少獨立的埠 (security considerations)
省去每個都打安全補丁
開發人員認為應該一個 Tomcat裡只部署一個應用,理由如下:
多個應用部署在一起,啟動時間太長
多個應用部署在一起,一個出了問題,會影響到其他的應用 (OOM, 執行緒數打滿 等等)
如果你需要在線上進行應用heap, 執行緒的dump, cpu使用等診斷分析,獨立部署則不會影響到其他應用
郵件組裡的回覆,大部分傾向於一個應用部署一個Tomcat:
這樣概念上最簡單,應用之間不會互相影響。同時呢,可以使用不同的JVM,不同的環境,不同的庫,不會互相限制,也不用測試這些應用間的相容性。
多個應用部在一起,如果都是佔用記憶體比較大的,比如佔用Heap 較多,如果趕上一次Full GC,就會導致暫停時間較長,這樣多個應用的執行緒都受影響。
Tomcat 的核心開發人員 Mark 認為這兩種情況應該視情況而定。如果你的一個應用需要特別多的資源,這樣儘量一個應用部署到一個Tomcat中以滿足企業的要求。否則,傾向於多個應用共用同一個 Tomcat ,這樣方便管理和運維。
我個人傾向於生產環境每個應用獨立部署,每個應用獨立監控,資源管理也互相隔離。在開發的時候,可以只設置一個 Tomcat 例項,部署多個應用到一個Tomct也更快捷,沒那麼多個性化要求,不需要再配置一堆的埠。當然,如果線上也都是各種小應用,沒什麼要求,部署到一起也OK。
總結下,生產上如果應用小,嫌麻煩,出問題可接受,都放到一起也沒問題。如果佔用資源比較大,需要穩定性等,儘量獨立部署,開發環境就怎麼方便怎麼來。
歡迎工作一到五年的Java工程師朋友們加入Java填坑之路:860113481
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!