現代應用的定義

我們談論的現代應用到底是什麼? 本文描述了現代應用必須具備的四個關鍵特徵(可擴展性、移轉性、彈性和敏捷性)以及指導開發現代應用的六個原則。

經過與開發人員、架構師和DevOps 工程師的持續溝通,我們了解到他們對目前應用程式的設計和建立現狀感到不滿。他們厭倦了在不同雲端之間費力地遷移應用,不停地快速新增額外的運算基礎架構來滿足不期而至的需求,或在遭受重大故障或中斷後努力恢復運作。從根本上來說,傳統應用架構所帶來的壓力和麻煩令他們筋疲力盡。

我們的客戶和社群成員再三表示,他們希望建構「現代應用」。「現代應用」的含義十分寬泛,不同的人有著不同的看法,所以我們詢問了我們的開發和DevOps同事他們眼中的現代應用是什麼樣的。我們想要為「現代應用」下一個明確的定義(其中包含現代應用所需的所有關鍵要素),以便在未來的應用開發和設計工作中用作檢查清單和參考點。

本文從某種程度上是Thomas Wiggins 開創性文章「十二要素應用宣言(The Twelve Factor App)」的延伸。事實上,Wiggins 提出的幾乎所有觀點仍然以某種形式適用於當今環境。但應用環境經過發展,已包含容器、API 和真正的分散式運算等新技術。雲端原生運算基金會(CNCF) 也制定了宏偉的應用願景,包括極為實用的Trail Map路線圖。此路線圖概述了雲端原生應用(包括容器、CI/CD、service mesh、可觀察性和分散式資料庫)的各個層面和一些架構考量。

我們希望在這些強大的基礎之上進行定義,為開發人員、架構師和DevOps 工程師提供應用程式設計和部署基準。我們在建立該定義之前對應用程式開發模式進行了長達數月的內部討論,並在定義之後繼續與我們的客戶和社群成員進行討論(在建立該定義之前,我們對應用程式開發模式進行了長達數月的內部討論;並且,在建立定義之後,我們仍繼續與我們的客戶和社群成員進行討論)我們認為,「現代應用」的定義分為兩部分:四個高層概念以及支援這些概念的六大原則。

現代應用的四大要素


在我們的研究過程中,許多人都表示,現代應用必須具備可擴展性、移轉性、彈性和敏捷性等關鍵屬性,我們稱之為「現代應用的四大要素」。這些術語很常見,而且很流行。我們需要針對當前雲端運算日益盛行,客戶連結無所不在的現實,從應用設計的脈絡來定義這些術語。

1. 可擴展性

可擴展性包含兩個要素:計算容量的擴展和速度的擴展。這兩個要素可能相互依賴,並且解決相同的問題。我們在「快速擴展」和「長期擴展」的脈絡下來認識這兩個要素:

• 快速擴展- 能夠在5分鐘內將應用容量增加一倍。能夠在如此短的時間內將容量翻倍意味著應用可以快速擴展容量,以滿足大多數不可預見的需求成長。大多數雲端實例及其組件工作負載的啟動時間約為5 分鐘或更短。因此,5分鐘意味著現代應用在設計上支援立即擴展,並考慮了基礎架構層的限制。

• 長期擴展- 能夠在一年或更長時間內將應用容量擴大10倍,而無需對程式碼進行重大重構或對基礎架構進行重大調整。支援「長期擴展」的現代應用是簡潔設計的產物,與基礎架構元件保持鬆散依賴和鬆散耦合。簡而言之,現代應用的大規模可擴展性是內建而不是附加的。

2. 移轉性

在當今“雲端時代”,企業一直夢想著DevOps 團隊能夠輕鬆地在不同的雲端之間移轉應用,並期望應用程式能夠平穩地運行。而現實與夢想之間有著很大的差距。雖然容器在當今得到了廣泛使用,但由於各個雲端之間的差異(依賴關係、工具、配置細微差異等),企業無法在向混合多雲架構移轉時實現即時可移植性。例如,GCP 的負載平衡器和資料儲存特性可能不同於亞馬遜雲端科技或Azure 的特性。在此,我們提供了一個更現實、更合適的移轉定義。

• 功能移轉性- 無論應用程式的運作環境為何,其核心功能元素、程式碼和邏輯必須保持不變。這意味著您的程式碼在容器內乾淨地運行,沒有與單一環境緊密耦合的外部相依性。透過這種設計,DevOps 團隊能夠更乾淨地行動應用程式或在多個雲端中啟動正在運行的應用程式的實例,而不必擔心核心應用的邏輯和要求。

• 管理移轉性- 應用的管理元素與環境無關,包括可觀察性、安全性和監控。無論運行環境如何,支援以相同的方式(使用相同的工具和相同的報告功能集)監控、保護和觀察應用。管理可攜性可能需要應用程式設計人員能夠清楚地劃分這些關鍵功能,以免利用公有雲的預設服務或產品。雖然最初會有所不便,但現代應用的管理可移植性設計對於實現其他三個要素是不可或缺的。

3. 彈性

彈性是一個通用術語,它描述了滿足嚴格停機時間SLA 要求的高可用性或更普遍的「可靠性」。在應用程式不需要線上時,彈性可為較長的停機時間或時間段留出了餘地,並且最終的一致性和服務交付是足夠可用的。為此我們提出了兩種類型的彈性,每個現代應用都必須適當地滿足彈性要求。

• 面向使用者的彈性- 應用程式使用者(無論是機器或人)不應注意到因現代應用程式本身或其所依賴的任何服務或基礎架構故障所引起的效能問題。當使用者發現某個應用程式無法正常運作時,使用者和應用程式團隊之間的隱性合約就被破壞了。現今的人類使用者希望其所存取和使用的任何服務或應用程式能夠近乎100% 地正常運作。機器可能更能接受內部自動化服務的中斷,但任何類型的故障都會不可避免地引發級聯反應,影響自動化服務和高度依賴的微服務。

• 故障轉移彈性- 現代應用能夠在5分鐘內將任何關鍵服務恢復到足以滿足處理平均工作負載的水平。這可能是一項艱鉅的任務;當Cloudflare 或AWS等主要服務供應商的儲存服務宕機時,整個網路可能會陷入停滯。也就是說,這裡的重點是鼓勵應用設計人員考慮作為應用設計的關鍵部分,故障轉移到未受影響的計算資源(在系統故障時將工作轉移到未受影響的計算資源上),這也是可自我修復的環境感知型現代應用的隱含要求。

4.敏捷性

敏捷性現在褪去了流行語的光環。在現代應用的脈絡中,敏捷性很重要,因為它描述了一種以最少的工作來快速而明確地移動的理想狀態。應用程式開發團隊可以快速輕鬆地存取測試和推送新功能所需的資源,從而從敏捷性中受益。而藉助敏捷性,DevOps 團隊可以簡化、自動化程式碼和基礎架構的檢查和部署。

• 程式碼敏捷性- 能夠根據應用程式開發團隊的需要頻繁地發布新程式碼。建立現代應用的高績效公司必須創建流程和環境以支援他們每天多次發布新程式碼。應用本身的設計必須支援不斷吸收新程式碼。在大多數情況下,這意味著應用程式由微服務組成並透過API 鏈接,以加強鬆散耦合並減少應用內部程式碼的依賴性和剛性。

• 基礎架構敏捷性- 能夠啟動或關閉基礎架構以滿足所有「客戶」(包括應用開發團隊、安全團隊和DevOps 團隊)的需求的能力。這一點是前面提到的可擴展性和可移植性支柱的基礎。為了實現和打造真正的敏捷開發和現代應用,企業必須為團隊提供某種類型的基礎架構自助服務以及現成的服務和應用目錄。

六大原則

為了支援現代應用的四大要素,大多數現代應用採用了(部分)遵循以下六大原則的架構:

1. 不受平台限制 — 這與可移植性有關但不完全相同。「不受平台限制」意味著應用程式為運行而建立,並不考慮運行平台或環境。容器已成為與平台無關運行時的事實標準,但應用不一定需要進行容器化才可以稱為現代應用。重要的是在應用程式開發開始時便遵循此原則,以免日後再被迫針對平台進行程式碼抽象化。

2. 優先考慮開源軟體 — 開源軟體(OSS) 正在迅速發展。現代應用程式要求團隊能夠深入了解程式碼,以進行可移植性和可擴展性設計,因此盡可能使用OSS 對於打造現代應用至關重要。

3. 一切即程式碼(盡可能) —— 現代應用程式必須以比人類操作更快的速度運作。現代應用要求和屬性的各個方面的自動化和程式化定義現在都不能確定。當然,目前還沒有可完全自動化的應用,因此人類必須參與關鍵決策和解決異常問題。但現代應用應透過穩定、持續地將更多定義和功能融於程式碼中並遠離「部落知識(tribal knowledge)」或運作手冊來朝這個方向邁進。

4. 使用自動化CI/CD 作為本地/預設狀態進行設計— 在大多數情況下,應用建置完成之後便提交到CI/CD 管線。現代應用從頭開始設計,考慮了CI/CD 自動化的最終要求(現代應用從開始設計,就考慮了CI/CD 自動化的最終要求),包括程式碼推送、基礎架構部署,甚至安全要求。

5. 實踐安全開發- 儘管每個人都同意這很重要,但鮮有人真正做到這一點。這意味著在應用程式開發過程中儘早使用軟體組合分析(SCA)、靜態應用安全測試(SAST)、動態程式碼分析(DCA)及格式檢查器測試所有程式碼,同時也意味著在部署之前測試所有程式碼。在即時部署之前,CI/CD 管線必須需要一個「測試完成」標誌。對於DevOps 團隊來說,這也意味著確保遵循安全最佳實踐,例如加密內部微服務流量,在WAF 啟動和運行之後部署應用,以及自動更新和輪換數位憑證。

6. 廣泛分散的儲存和基礎架構- 現代應用的最終使用者無所不在。這意味著他們可能不僅在家中、公司或購物途中,也可能在世界的任何地方,甚至在提供WiFi的飛機上!現代應用必須承認這一點,並進行全球分散式交付和儲存功能設計。此外,現代應用應利用分散式運算的優勢來提高彈性、效能和可擴展性。真正的分散式(不僅僅是分片)儲存能夠確保資料的一致性和始終可用性,從而顯著提高四大要素的交付能力。真正的分散式基礎架構(不僅僅是在單一地理位置)對於滿足四大要素的要求也至關重要。將儲存和運算資源遷移到離客戶(無論他們身在何處)更近的地方可提高儲存和運算效能。跨多個區域、雲端或混合部署複製儲存和運算資源可確保提供更高的彈性和可擴充性。

結論:現代應用定義既是清單又是一種思維

就像薛丁格的貓一樣,現代應用的開發將同時存在兩種狀態,包括當前雲端環境和混合環境的真實世界,以及我們開發和交付應用所面臨的時間和預算限制。完全自動化、高度安全、完全不受限、可即時擴展的完美的現代應用是一種理想的狀態。而現實情況中,應用是雜亂無章的。您可能正在運行一個不在容器中的單體應用,它無法在五分鐘內將容量翻倍,並且無法在不重構程式碼的情況下輕鬆遷移到其他環境。但這並不意味著本文列出的現代應用的支柱和原則無法幫助您或引導您進入更好的狀態。

此外,我們預計,隨著技術世界的變化和擴展,我們將不得不修改我們的定義。目前有一些軟體模型並不完全符合定義:無伺服器運算、日益複雜的低程式碼/無程式碼應用平台和人工智慧驅動的安全應用、具有邊緣節點運算能力的CDN 等等。因此,這份定義將隨著技術的擴展而演變。正如「十二要素應用宣言」 在今天仍然適用一樣,我們希望現代應用的定義在未來也仍然能夠適用。在當前狀態下,我們希望它可以指導您以最佳的方式為使用者、開發人員及所有其他利害關係人建立應用程式。

查看原文:NGINX