站長阿川

站長阿川私房教材:
學 JavaScript 前端,帶作品集去面試!

站長精心設計,帶你實作 63 個小專案,得到作品集!

立即開始免費試讀!

放下技術焦慮:越來越多公司重回單體架構的真相

image

多年來,我們一直被灌輸「微服務是未來」。

「把所有東西拆分成小型獨立服務,」他們說,「讓團隊獨立擴展,部署更快,行動更敏捷。」

image

但最近出現了奇怪的現象。那些已經遷移到微服務的團隊,現在正重新回歸單體架構。

這不僅是小創業公司的選擇——亞馬遜、阿里、Basecamp、騰訊甚至谷歌都在這樣做。

是的。這些曾經引領微服務潮流的先驅們正在悄悄承認:

「我們當初走得太遠了。」

等等...微服務哪裡不好用了?

先別急著下結論,微服務的理念確實很有吸引力。它原本的設想是:

  • 每個功能可以單獨更新(改一處不影響其他地方)
  • 團隊能各管一攤(前端、後端、資料庫各搞各的)
  • 界限清晰(誰負責哪塊一目了然)

但真用起來,很多團隊發現事情沒那麼簡單。實際遇到的可能是:

  • 代碼像樂高散了一地——幾百個小部件,新人根本理不清誰管誰
  • 系統越跑越慢——服務之間來回傳資料,像快遞員跑斷腿也送不完貨
  • 天天修水管——工程師的時間全耗在維護伺服器、調試通信上
  • 查bug像破案——「這個報錯到底是從哪個環節冒出來的?!」

如果你是過來人,估計已經對著電腦嘆過氣:「說好的便利呢?怎麼越搞越複雜了?」

一個簡單例子

假設你要構建一個電商系統。

用微服務架構可能會這樣拆分:

  • 認證服務
  • 商品目錄服務
  • 購物車服務
  • 訂單服務
  • 通知服務

看起來很酷對吧?

但接下來...

  • 你需要用Kafka或RabbitMQ粘合所有服務
  • 要用Redis共享會話
  • 部署所有服務的CI/CD流程需要30分鐘
  • 你開始編寫「只是為了與其他代碼通信」的代碼

然後呢?

你想開發的那個「簡單」功能現在需要修改5個服務,提交3個PR,獲得2個團隊的批准。

現實中的微服務體驗

想像你在開發一個網上商店系統

採用微服務架構通常會把這些功能分開:

  1. 用戶登錄模塊
  2. 商品展示模塊
  3. 購物車功能
  4. 訂單處理系統
  5. 消息提醒功能

表面上看這樣分工很合理

但實際工作時你會發現:

  1. 需要用專門的工具把所有模塊連通(比如Kafka或RabbitMQ)
  2. 要額外配置資料共享系統(比如Redis)
  3. 每次更新全部模塊要花半小時以上(比如CI/CD流程)
  4. 要寫很多代碼只是為了讓模塊互相傳遞消息

更麻煩的是:

當你需要新增一個普通功能時,可能要改動5個模塊,提交多個修改申請,還得等不同團隊審批。

微服務的隱藏成本

你可能不知道的是:

微服務並沒有真正簡化系統——它們只是把難題轉移到了其他地方

當所有功能都打包在一個大應用中時:

  • 所有問題都集中在程式碼裡

採用微服務後:

  • 伺服器之間通信變慢
  • 接口定義要嚴格匹配
  • 資料同步出現問題
  • 每個功能單獨發布更麻煩
  • 要跟踪每個服務的位置
  • 需要額外工具來監控系統運行

經驗豐富的工程師都會告訴你:

管理50個分散的小服務,要比維護一個規劃完善的大程式困難得多。

為什麼大系統又變回整體了?

簡單就是好。整體式系統(單體架構)之所以重新流行,不是因為它「容易做」,而是因為它「結構清楚」。

在一個整體系統裡:

  • 所有功能都在同一個程式裡
  • 找問題就像查字典一樣直接
  • 改代碼就像修改文檔一樣簡單直接
  • 不需要處理不同服務之間的對接問題
  • 開發時不需要準備複雜的運行環境

現在的工具(比如Go、Rust等新語言)和部署方式(如容器化)已經讓整體系統也能很好地處理大量用戶訪問了。

真實企業的經歷:從微服務回到大系統

來看看這些知名公司的實際選擇:

  • Shopify:曾經把所有功能拆成小服務,現在正在重新整合成一個大系統
  • Segment:在使用微服務遇到運行緩慢、響應遲緩和開發效率下降後,專門發文《我們為什麼要放棄微服務》

就連最早採用微服務的亞馬遜也承認:這種架構方式要真正起作用,必須首先解決大量其他問題。

一種新的系統構建方式:整合的模塊化設計

現在很多公司都在嘗試這種方式。

它是這樣工作的:

  • 整個系統作為一個整體打包和運行
  • 內部各功能模塊界限分明
  • 借鑒了微服務的思想進行功能模塊劃分,但不需要額外網路傳輸

這樣你既能保持:

✔ 各功能分工明確
✔ 不必擔心跨服務通信問題
✔ 避免了複雜的部署流程

如果你用Java語言開發,可以這樣組織代碼結構:

/cart     # 購物車功能
/order    # 訂單管理 
/notification #消息通知

雖然看起來像獨立模塊,但它們其實屬於同一個完整的系統,能協同工作。

是不是應該完全放棄微服務?

不一定。微服務在特定情況下還是有它的用途:

適合考慮微服務的情況:

  • 服務數百萬以上用戶的大型平台
  • 公司有很多開發團隊需要同時快速更新不同功能
  • 已經熟練掌握系統監控和自動化部署等配套技術

但如果你的情況是:

  • 開發團隊規模小(不到50人)
  • 主要專注於一個核心產品
  • 花在技術維護上的時間比產品開發還多

那採用單體架構可能會讓你們的開發工作更順暢高效。

選擇合適的技術方案

技術的流行風向總是在變化。就像服裝潮流一樣,幾年前大家都推崇的「微服務」,現在人們發現它不一定適合所有情況。

重要的不是選擇最熱門的技術,而是選擇:

  • 能讓你團隊工作更順暢的方案
  • 不會增加不必要的工作量的方案
  • 能讓你們專注在業務功能開發的方案

(好的技術方案應該像一雙合腳的鞋——穿著舒服最重要,不是最新款就一定最好)


原文出處:https://juejin.cn/post/7543518344054898688


共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
站長阿川

站長阿川私房教材:
學 JavaScript 前端,帶作品集去面試!

站長精心設計,帶你實作 63 個小專案,得到作品集!

立即開始免費試讀!