
後端架構的選擇往往決定了你的日常工作是痛苦還是愉快。隨著應用程式的增長,最初選擇的裂痕開始顯現,你被迫做出決定:是堅持使用可靠的單體架構,還是將所有內容拆分為微服務?
沒有銀彈。這兩種方法都有一席之地,「正確」的選擇往往更多地取決於你的團隊結構和業務階段,而不是純粹的技術優勢。讓我們來看看這兩個主要的競爭者,以及第三種通常最有效的務實中間路線。
微服務背後的想法很簡單:與其構建一個巨大的應用程式,不如構建一組小型、獨立的服務。每個服務都專注於做好一件事。
可以把它想像成一個去中心化的團隊。每個服務管理自己的資料庫,並且可以在準備好時隨時部署,無需徵求其他人的許可。如果計費團隊想使用 Go,而認證團隊喜歡 Rust,他們都可以按自己的方式行事。這種自主性促進了創新和速度——至少在理論上是這樣。
在實踐中,這對於擁有 500 名開發人員的大型組織來說非常棒,因為協調單個版本的發布簡直是一場噩夢。
單體架構是傳統的方法:一個程式碼庫,一個應用程式,一次部署。所有東西——從使用者介面到業務邏輯和資料存取——都生活在一起。
雖然「單體」在某些圈子裡幾乎成了一個髒話,但它具有不可否認的優勢。它很簡單。你不需要地圖就能找到函式定義的位置。部署只是一個腳本。對於中小型團隊來說,這種簡單性是一種超能力。它讓你能夠快速行動,而不會陷入基礎設施的複雜性中。
中小型公司中常見的一個反模式是,最終擁有的微服務數量超過了工程師的數量。我見過擁有 100 名工程師的組織試圖維護 300 多個服務,結果絕對是混亂的。
當你跨過這個門檻時,許多服務不再有明確的所有者,或者所有者繼承了服務卻因為組織重組而完全不了解上下文。你還會花費更多時間更新所有儲存庫中的依賴項以清除漏洞。為了有效地運行微服務,你需要一個專門的平台團隊和對工具的大量投資。大多數初創公司根本沒有資源來構建這種基礎設施,將他們的「敏捷」架構變成了一場維護噩夢。
不要因為流行而選擇某種架構。選擇它是為了解決你當前的問題。
選擇微服務,如果:
選擇單體架構,如果:
秘訣在於:你不必直接跳到微服務。事實上,你可能不應該這樣做。
模組化單體 (Modular Monolith) 是一個很好的中間地帶。你構建一個可部署單元,但在內部,你在模組之間強制執行嚴格的邊界。模組 A 中的程式碼不能直接匯入 模組 B 中的程式碼;它必須通過定義的公共介面。這為你提供了微服務的程式碼組織優勢,而沒有基礎設施的開銷。
隨著應用程式的增長,你可以剝離那些需要獨立的部分。
「微服務 vs 單體架構」的辯論往往抓不住重點。重點不在於哪種架構在理論上更優越,而在於你現在可以接受哪一組權衡。
從一個結構良好的單體應用開始。當你感到痛苦時再進行拆分,而不是在那之前。未來的你(以及你的 DevOps 團隊)會感謝你的。
© Melvin Laplanche - All rights reserved.