
後端的架構,往往決定你一天的工作會有多辛苦。隨著應用程式成長,最初選擇留下的裂痕會慢慢浮現。總有一天你得做出決定。要守住可靠的單體架構,還是把一切都拆成微服務?
沒有銀彈。兩種做法都有它們的位置。正確的選擇,往往更取決於你的團隊結構和事業階段,而不是純粹的技術優劣。這篇文章會談兩個主要選項,再加上一個實際上很常管用的務實中間路線。
微服務的想法很簡單。與其建一個巨大的應用程式,不如建一群小而獨立的服務。每個服務把一件事做好。
把它想成一個去中心化的團隊。每個服務各自管理自己的資料庫,準備好了就能部署,不用問別人准不准。帳務團隊想用 Go,認證團隊喜歡 Rust,兩邊都不用讓步。這種自由讓團隊跑得快。至少理論上是這樣。
在實務上,這很適合大型組織,那種要協調 500 個開發者一起發布一次的場面,對他們來說是惡夢。
單體架構是傳統做法。一個程式碼庫、一個應用程式、一次部署。從使用者介面到商業邏輯再到資料存取,全部住在一起。
「單體」這個詞在某些圈子裡已經快要變成髒話了。但它仍然有實實在在的優點。它簡單。你不需要地圖就能找到函式定義在哪裡。部署就是一支 script。對小型和中型團隊來說,這種簡單就是超能力。它能讓你在不被基礎設施的複雜度拖累的情況下快速前進。
中小型公司常見的反模式,就是最後微服務比工程師還多。我看過 100 個工程師想維護 300 多個服務的組織,結果是一片混亂。
一旦跨越那條線,很多服務就沒有清楚的負責人,或是負責人因為組織重整,接手了他們完全沒有脈絡的服務。你也會花更多時間在更新所有 repo 的相依套件,好清掉漏洞。要把微服務做好,你需要一個專責的平台團隊,以及對工具的大量投資。多數新創根本沒有資源去建那套基礎設施,於是號稱「敏捷」的架構,變成了維護的惡夢。
別因為流行就選某種架構。要因為它能解決你當前的問題才選。趨勢不該進到決定裡。
符合以下情況,選微服務:
符合以下情況,選單體架構:
這裡有個祕密。你不必直接跳到微服務。很可能也不該跳。
模組化單體是很棒的折衷。你建一個可部署的單元,但內部在模組之間設下嚴格的界線。Module A 的程式碼不能直接 import Module B 的程式碼,必須透過定義好的公開介面。這樣你得到微服務的程式碼組織好處,卻沒有基礎設施的開銷。
隨著應用程式成長,你可以把需要獨立的部份剝下來。
微服務對單體架構的辯論,常常抓錯重點。重點不是哪種架構在理論上比較優越,而是你現在能忍受哪一組取捨。
從結構良好的單體開始。等痛感出現再拆,別提早動手。未來的你,還有你的 DevOps 團隊,都會感謝你。
© Melvin Laplanche - All rights reserved.