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。
總結下,生產上如果應用小,嫌麻煩,出問題可接受,都放到一起也沒問題。如果佔用資源比較大,需要穩定性等,儘量獨立部署,開發環境就怎麼方便怎麼來。
原文釋出時間為:2018-11-7
本文作者:侯樹成
本文來自雲棲社群合作伙伴“Java後端技術”,瞭解相關資訊可以關注“Java後端技術”。
相關文章
- 《保衛蘿蔔4》僅用一個月完成鴻蒙原生應用開發鴻蒙
- 小蘿蔔1號和小蘿蔔2號(四元數範圍)
- 如何打包部署一個tomcat專案Tomcat
- kubernetes部署第一個應用案例
- 帶你理解Kubernetes,部署一個Node應用
- nginx + 一個埠 部署多個單頁應用(history模式)Nginx模式
- 一鍵將BigQuant選出的股票池放入蘿蔔投研中
- Knative 實戰:一個微服務應用的部署微服務
- Flutter入坑指南:編寫第一個Flutter應用Flutter
- Python爬蟲實戰之蘿蔔投研Python爬蟲
- Azure DevOps (十二) 通過Azure Devops部署一個SpringBoot應用devSpring Boot
- Dubbo 入門系列之快速部署一個微服務應用微服務
- 【Azure 應用服務】一個 App Service 同時部署執行兩個及多個 Java 應用程式(Jar包)APPJavaJAR
- 是否可以考慮做一個dotnet應用的效能診斷工具
- 《自然》:蘿蔔“清肺”有了科學依據!
- 如何將應用一鍵部署至多個環境?丨Walrus教程
- 分享一個 ElementUI 應用框架UI框架
- 第一個 Angular 應用程式Angular
- 【轉】Docker部署Tomcat及Web應用DockerTomcatWeb
- Azure DevOps (十三) 通過Azure Devops部署一個Go的Web應用devGoWeb
- 部署了一個ChatGPTChatGPT
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- 分享一個composer的坑
- 用 python 寫一個自動化部署工具Python
- 如何把Electron做成一個Runtime,讓多個應用共享同一個Electron
- 如果精確判斷一個IP是否被佔用
- 一個Tomcat 如何部署多個專案?附多種解決方案及詳細步驟!Tomcat
- 實現一個簡單的TomcatTomcat
- 開發一個React + Electron應用React
- 如何Docker化任意一個應用Docker
- [part 3] 第一個 Django 應用Django
- 開發第一個Flink應用
- 初見React,一步一個坑React
- Docker compose 部署前後端-----採用nginx代理,支援一個埠部署多個前端Docker後端Nginx前端
- 雲原生系列2 部署你的第一個k8s應用K8S
- Java應用伺服器之tomcat部署Java伺服器Tomcat
- 用nodejs寫一個命令列應用-前言NodeJS命令列
- PHP Composer 的一個小坑PHP