應用架構模式之單片架構
阿新 • • 發佈:2018-12-19
背景
您正在開發伺服器端企業應用程式。它必須支援各種不同的客戶端,包括桌面瀏覽器,移動瀏覽器和本機移動應用程式。該應用程式還可能會公開供第三方使用的API。它還可以通過Web服務或訊息代理與其他應用程式整合。應用程式通過執行業務邏輯來處理請求(HTTP請求和訊息);訪問資料庫;與其他系統交換訊息;並返回HTML / JSON / XML響應。存在與應用程式的不同功能區域相對應的邏輯元件。
問題
應用程式的部署架構是什麼?
現狀與訴求
- 有一組開發人員正在處理該應用程式
- 新團隊成員必須迅速提高工作效率
- 應用程式必須易於理解和修改
- 您希望實踐應用程式的持續部署
- 您必須在多臺計算機上執行該應用程式的多個副本,以滿足可伸縮性和可用性要求
- 您想利用新興技術(框架,程式語言等)
解決辦法
使用單一體系結構構建應用程式。例如:
- 單個Java WAR檔案。
- Rails或NodeJS程式碼的單個目錄層次結構
例子
讓我們假設您正在構建一個電子商務應用程式,該應用程式接收來自客戶的訂單,驗證庫存和可用信用,並運送它們。該應用程式包含幾個元件,包括實現使用者介面的StoreFrontUI,以及用於檢查信用,維護庫存和裝運訂單的一些後端服務。
該應用程式部署為單個整體應用程式。例如,Java Web應用程式由在Web容器(如Tomcat)上執行的單個WAR檔案組成。 Rails應用程式由單個目錄層次結構組成,例如,使用Apache / Nginx上的Phusion Passenger或Tomcat上的JRuby。您可以在負載均衡器後面執行應用程式的多個例項,以便擴充套件和提高可用性。
方案優缺點
該解決方案具有許多優點:
- 易於開發 - 當前開發工具和IDE的目標是支援單片應用程式的開發
- 易於部署 - 您只需在適當的執行時上部署WAR檔案(或目錄層次結構)
- 易於擴充套件 - 您可以通過在負載均衡器後面執行應用程式的多個副本來擴充套件應用程式
但是,一旦應用程式變得龐大且團隊規模不斷擴大,這種方法就會有許多缺點,這些缺點變得越來越重要:
- 龐大的整體程式碼庫威脅開發人員,尤其是那些不熟悉團隊的人。應用程式可能難以理解和修改。因此,開發通常會放慢速度。此外,由於沒有硬模組邊界,模組化隨著時間的推移而崩潰。此外,由於可能難以理解如何正確實現更改,因此程式碼質量會隨著時間的推移而下降。這是一個向下螺旋。
- 過載的IDE - 程式碼庫越大,IDE越慢,開發人員的工作效率越低。
- Web容器過載 - 應用程式越大,啟動時間越長。由於浪費時間等待容器啟動,這對開發人員的工作效率產生了巨大影響。它也會影響部署。
- 持續部署很困難 - 大型單片應用程式也是頻繁部署的障礙。要更新一個元件,您必須重新部署整個應用程式。這將中斷後臺任務(例如Java應用程式中的Quartz作業),無論它們是否受到更改的影響,並可能導致問題。還有可能未更新的元件無法正確啟動。結果,與重新部署相關的風險增加,這阻礙了頻繁的更新。這對於使用者介面開發人員來說尤其是一個問題,因為他們通常需要快速迭代並經常重新部署。
- 擴充套件應用程式可能很困難 - 單片架構只能在一個維度上擴充套件。一方面,它可以通過執行更多應用程式副本來擴充套件事務量。有些雲甚至可以根據負載動態調整例項數。但另一方面,這種架構無法隨著資料量的增加而擴充套件。應用程式例項的每個副本都將訪問所有資料,這使快取效率降低,並增加記憶體消耗和I / O流量。此外,不同的應用程式元件具有不同的資源要求 - 一個可能是CPU密集型而另一個可能是記憶體密集使用單片架構,我們無法獨立擴充套件每個元件
- 擴充套件開發的障礙 - 單片應用程式也是擴充套件開發的障礙。一旦應用程式達到一定規模,就可以將工程組織劃分為專注於特定功能區域的團隊。例如,我們可能希望擁有UI團隊,會計團隊,庫存團隊等。單一應用程式的問題在於它會阻止團隊獨立工作。團隊必須協調他們的開發工作和重新部署。團隊進行更改和更新生產要困難得多。
- 需要對技術堆疊做出長期承諾 - 整體架構迫使您與開發時選擇的技術堆疊(在某些情況下,與特定版本的技術)結合。使用單片應用程式,可能難以逐步採用更新的技術。例如,讓我們假設您選擇了JVM。您有一些語言選擇,因為除了Java之外,您還可以使用其他與Java很好地互動的JVM語言,例如Groovy和Scala。但是,使用非JVM語言編寫的元件在單片體系結構中沒有位置。此外,如果您的應用程式使用隨後變得過時的平臺框架,那麼將應用程式逐步遷移到更新更好的框架可能具有挑戰性。為了採用更新的平臺框架,您可能需要重寫整個應用程式,這是一項冒險的任務。
相關模式
微服務架構是一種替代模式,可解決單片架構的侷限性。
已知用途
眾所周知的網際網路服務,如Netflix,Amazon.com和eBay最初都有一個單一的架構。作者開發的大多數Web應用程式都具有單一的體系結構。