1. 簡介
微服務架構(MSA)承諾提升軟體開發的敏捷性,這在一個需要快速適應新興需求(例如由物聯網驅動的需求)的時代尤為關鍵。本文探討一個關鍵的架構權衡:微服務粒度(單一服務的功能範圍)與其對應用程式效能(特別是延遲)的影響之間的關係。作者模擬了兩種部署策略——將微服務整合在單一容器內與將其分散在多個容器中——以量化此影響。
2. 微服務架構中的粒度
粒度指的是單一微服務所封裝的功能複雜度。粒度更細的服務實現較少的使用案例,從而促進可重用性並與特定業務能力保持一致。
2.1. 定義服務粒度
這是衡量服務功能範圍的指標,通常與其處理的職責或使用案例數量相關。這是一個平衡模組化與協調開銷的關鍵設計決策。
2.2. 通訊開銷
隨著服務變得更加細粒度,完成一個業務工作流程所需的服務間通訊(遠端程序呼叫、訊息傳遞)次數會增加。這種網路通訊是延遲的主要來源。
3. 實驗方法與模擬
本研究採用模擬來分析效能,使用一個大學入學系統作為具代表性的企業應用模型。
3.1. 部署模型
- 模型 A(單一容器): 所有微服務都打包並部署在單一執行時期容器(例如 Docker)內。通訊主要是程序內通訊。
- 模型 B(多容器): 每個微服務部署在各自獨立的容器中。通訊透過網路進行(例如透過 REST API 或 gRPC)。
3.2. 效能指標
主要指標是端到端服務延遲,衡量從客戶端請求到收到完整業務交易最終回應的時間。
4. 結果與分析
模擬得出了一個關於分解效能成本的關鍵且可能反直覺的發現。
4.1. 延遲比較
關鍵結果
觀察到的多容器部署(模型 B)相較於單一容器部署(模型 A)的服務延遲增加是微不足道的。
圖表描述(模擬): 一個長條圖,比較兩種部署模型下複合服務呼叫的平均延遲(以毫秒為單位)。「單一容器」和「多容器」的長條高度幾乎相同,微小的差異透過一個插圖或標註框視覺化強調,上面寫著「約增加 1-2%」。
4.2. 主要發現
- 在現代、優化的容器編排和網路堆疊(例如 Kubernetes 與 Istio 等服務網格)下,將細粒度微服務部署在獨立容器中所帶來的效能損失微乎其微。
- 多容器 MSA 所提供的獨立部署、擴展和技術異質性優勢,在許多情境下可能超過了微不足道的延遲成本。
- 這挑戰了傳統假設,即網路開銷使得分散式微服務天生就慢得多。
5. 對物聯網架構的啟示
這些發現對物聯網尤其相關,因為邊緣運算典範通常涉及在受限裝置和邊緣節點上執行的分散式微服務。最小的延遲開銷支援了在邊緣部署敏捷、細粒度服務以本地處理資料的可行性,從而減少對雲端的依賴,並改善對時間敏感的應用程式的回應時間。
6. 核心洞察與分析師觀點
核心洞察: 本文以有力的、數據支持的論點,挑戰了微服務討論中一個普遍的迷思:分散化天生就會嚴重損害效能。其核心發現——容器化開銷現在「微不足道」——是一個改變遊戲規則的觀點。它將粒度辯論從一個以效能為中心的恐懼,轉變為一個聚焦於組織敏捷性和領域對齊的策略性設計選擇。這與 Martin Fowler 等先驅和 Netflix 思想領袖所描述的 MSA 基礎哲學一致,其驅動力是獨立部署能力和團隊自主權,而非原始速度。
邏輯流程: 論證清晰進行:1) 承認因網路躍點增加而產生的理論延遲擔憂。2) 使用一個真實世界系統(大學入學)的受控模擬來實證測試它。3) 呈現令人驚訝的結果——開銷極小。4) 推論其對一個高成長領域(物聯網)的啟示。邏輯是合理的,儘管模擬的簡化(未詳細說明網路條件、序列化格式或編排層)是其主要弱點。
優點與缺點: 優點在於其清晰、聚焦的實證測試,突破了教條。它為擔心過度分解的架構師提供了一個具體的起點。缺點(作者已承認)是模擬的抽象性。真實世界的延遲受到多種因素影響,例如網路壅塞、服務網格代理(如 Istio 文件中討論的)、負載大小以及序列化/反序列化成本(例如 Protocol Buffers 與 JSON)。研究的「微不足道」結果可能在優化的、低延遲的資料中心網路中成立,但可能無法直接套用到物聯網中常見的廣域或不可靠的邊緣網路。
可執行的見解: 對於技術長和架構師而言,本文是一個許可,允許他們優先考慮領域驅動設計,而非過早的效能優化。停止害怕細粒度服務。相反地,投資於底層平台:一個穩健的容器編排器(Kubernetes)、一個用於可觀測性和韌性通訊的服務網格,以及高效的序列化。微服務的真正成本不是延遲;而是運營複雜度。本文的啟示是,如果你透過良好的平台工程解決了複雜度問題,那麼效能代價實際上為零,從而讓你得以收穫模組化的長期效益。對於物聯網,這意味著首先為功能內聚性設計邊緣微服務,相信現代邊緣堆疊能夠處理分散化。
7. 技術細節與數學模型
由 $n$ 個微服務組成的工作流程的總延遲 $L_{total}$ 可以建模為:
$L_{total} = \sum_{i=1}^{n} (P_i + S_i) + \sum_{j=1}^{m} N_j$
其中:
- $P_i$ = 服務 $i$ 的處理時間。
- $S_i$ = 服務 $i$ 介面的序列化/反序列化時間。
- $N_j$ = 服務間呼叫 $j$ 的網路延遲(其中 $m \ge n-1$)。
在單一容器模型中,$N_j \approx 0$(程序內呼叫)。在多容器模型中,$N_j$ 為正值。本文的發現表明,在現代容器化環境中,對於許多工作負載而言,$\sum N_j$ 相對於 $\sum (P_i + S_i)$ 已經變得很小,使得整體差異微不足道。關鍵因素在於容器執行時期網路層的效率以及輕量級 RPC 機制的使用。
8. 分析框架與案例範例
框架:粒度決策矩陣
在分解單體應用或設計新的 MSA 時,根據本文見解,沿兩個軸線評估每個候選服務:
- 功能內聚性與變更頻率: 這組操作是否會一起變更?(高內聚性 = 良好的服務邊界)。
- 預期通訊密集度: 此服務在核心工作流程中需要與其他服務同步呼叫或被呼叫的頻率有多高?
案例範例:電子商務結帳(無程式碼)
考慮一個電子商務單體應用。傳統的恐懼可能會將「庫存」、「定價」和「支付」合併成一個粗粒度的「訂單服務」,以避免網路呼叫。運用本文的見解和框架:
- 庫存服務: 高內聚性(庫存水平、預留)。很少與定價邏輯一起變更。與結帳流程的通訊密集度中等。→ 獨立的微服務。 微不足道的網路成本值得在促銷期間獨立擴展。
- 定價引擎: 高內聚性(折扣、促銷)。經常且獨立地變更。高通訊密集度。→ 可以作為「訂單」服務的一部分開始,但如果邏輯變得複雜,稍後再拆分。本文建議稍後拆分的成本很低。
- 支付服務: 極高的內聚性,受監管,使用外部閘道。低通訊密集度(每次結帳一次呼叫)。→ 明確的獨立微服務。 安全性和合規性隔離勝過任何微小的延遲擔憂。
決策是由領域和組織因素驅動,而非對延遲的過度恐懼。
9. 未來應用與研究方向
- 自主粒度調整: 未來的系統可以根據即時延遲指標和工作負載模式,在執行時期動態合併或拆分微服務,這是「自適應微服務」研究中探索的概念。
- 量子安全服務網格: 隨著量子計算的發展,保護服務間通訊將至關重要。將後量子密碼學整合到服務網格資料平面的研究是一個關鍵的未來方向。
- 機器學習驅動的部署編排: 機器學習模型可以根據資料特性、網路條件和能源限制,預測物聯網微服務管道的最佳放置位置(邊緣 vs. 雲端)和粒度,針對比單純延遲更複雜的目標進行優化。
- 無伺服器微服務: MSA 與無伺服器函式(FaaS)的融合。「微不足道的開銷」發現支援了細粒度 FaaS 組合,推動朝向事件驅動架構發展,其中每個函式都是一個超細粒度的微服務。
10. 參考文獻
- Fowler, M., & Lewis, J. (2014). Microservices. MartinFowler.com.
- Newman, S. (2015). Building Microservices. O'Reilly Media.
- Zhu, L., Bass, L., & Champlin-Scharff, G. (2016). DevOps and Its Practices. IEEE Software.
- Istio Documentation. (2023). Architecture. https://istio.io/latest/docs/ops/deployment/architecture/
- Richardson, C. (2018). Microservices Patterns. Manning Publications.
- Bala, K., et al. (2020). "Adaptive Microservice Scaling for Elastic Applications." IEEE Transactions on Cloud Computing.
- W3C Web Services Architecture. (2004). https://www.w3.org/TR/ws-arch/
- Shadija, D., Rezai, M., & Hill, R. (2017). Microservices: Granularity vs. Performance. In Proceedings of September (Preprint). ACM.