Microservices

Microservices(微服務) 是什麼

此篇文章為 What are microservices? 的筆記

1 Microservices 的重點

Microservices 是一種建立 Application 的方法,將程式碼拆分成 能互動服務

有以下特質

  • 所有的 Application 都是由許多能互動的 服務 架構而成,服務 例如有 Databases, API endpoints, Frontend

  • 通常,這些服務會在 (1)同個 infrastructure (2) 同一個 Codebase 上同時運作

  • 在 Microservices 架構上,服務會被「拆分」成多個小單位獨立運作

  • 優點: 容易規模化、能避免服務斷線 ; 缺點: 複雜度提升

多數的大型公司 (例如 Google, Uber, Facebook) 都會以 Microservices 的架構來建立 Application。

2 服務是什麼

服務是「任何能獨立運作的 Application」,通常用在 Backend、但 Frontend 也有服務。

有可能

  • pricing endpoint: 在 Uber machine learning model 中提供

  • match endpoint: 可能是某種演算法或 if/else 判斷式

  • available drives: 可能是內部資料庫的資料

但細節不重要。重要的是每一個 endpoint 都是一個服務,在 backend 扮演他的角色。(ps. 前端現在也有 services,像是 micro-frontend 就可以當成一個 service)

3 單體式架構 (Monolithic Architecture)

單體式架構指「把 services, database, frontend...etc 全部部屬在同個 infratructure 上,都在同個程式檔案中」。

單體式架構

  • 很簡單而且 make sense,因為不用去想要如何拆分 code

  • 不會影響到 performance 太多

那為什麼大型科技公司不採取單體式架構呢?

因為隨著公司長大,有愈來愈多的 request (例如愈來愈多人叫車),公司發現了一些問題

  • Scale: 每個 Application 的使用頻率都不相同,如果所有的服務都放在同一個 infrastructure 上,那會非常難規模化。

  • Uptime (正常運行時間): 如果一個服務有問題掛了,整個 Server 都會掛掉

  • Specialized Infrastructure: 一些特殊的服務如 machine learning, 影片處理服務需要高強度的 GPU。如果把所有服務都放在同個 infrastructure 上,會非常不符合成本。

  • Developer experience

    • 如果把所有服務都放在同一台 Server 上,如果工程師需要微調其中一個服務時,需要重新部屬、重新啟動 Server/Application。

    • 所有的服務都要使用同樣的程式開發語言

使用 Microservices 後

  • Scale: 可以單獨地規模化任何服務

  • Uptime (正常運行時間): 如果一個服務有問題掛了,不會讓整個產品停止運作

  • Specialized Infrastructure: 可以對特殊的服務如 machine learning, 影片處理服務實行客製化需求,例如需要高強度的 GPU。

  • Developer experience

    • 每個服務可以各別微調

    • 不同服務可以使用不同的程式開發語言

可以形象化的比喻是貨櫃運輸,例如有以下 4 種貨物

  • 火柴: 易燃

  • 毛衣: 輕、怕水

  • 米: 重、容易腐爛

  • 食物處理器: 重、怕水、脆弱

如果全部包裝在一個貨櫃運送將會是一場災難,如果分不同貨櫃包裝則可以客製化。

4 Microservices 不是唯一解答,必須考量整個系統需求

Microservices 聽起來好處多多,但致命缺點就是: 非常複雜。

必須考慮

  • 服務間要如何取授權驗證 (authenticate) 彼此?

  • 服務間要如何知道彼此的存在?

  • 如何確保不同服務間的協定(SLA, Service-level Agreement)? 例如靠文件嗎

  • 如果一個語言是用 GO 寫的,但團隊成員只會 Javascript,怎麼辦?

目前已經有公司在試著解決這樣的困難,例如 Service mesh 服務、Optic 工具。

Last updated