在微服務架構(Microservices Architecture)中,服務之間並不是孤立存在的。雖然我們強調「邊界清晰、獨立部署」,但一個業務流程往往需要多個服務協同運作。例如,當使用者在電商平台下單時,訂單服務需要與商品庫存服務、支付服務、通知服務等互動,最終才能完成一次完整的交易。
因此,「服務之間該如何通訊」是微服務設計的一個核心問題。在《Microservice Architecture Pattern》之中,常見的通訊模式包含以下四種:
本篇將逐一介紹這些模式,並搭配案例來說明其優缺點與適用場景。
RPI 模式指的是一種基於「請求/回應」的同步通訊方式。當一個服務需要另一個服務的資料或邏輯時,它會發送一個請求並等待回應,整個過程與呼叫函式非常類似,只不過跨越了服務邊界。
基本上,RPI 屬於我們最常見的一種服務互動模式,常見的技術實踐可以分成下列幾項:
【範例】
假設一個「會員註冊」的業務流程,會需要完成下列兩項動作:
在 RPI 模式下,UserService 會呼叫 EmailService 的 API 來觸發驗證信件發送。如果 EmailService 沒有回應,則 UserService 整個操作會失敗。
使用 Remote Procedure Invocation (RPI)的模式,好處是:
但是,在這個模式像如同我們在耦合那篇講的,這個屬於耦合性高的設計,呼叫端與被呼叫端必須同時可用。在這個情況下,跨多個服務的請求極有可能形成「雪崩效應」,服務之間互相影響逐一的崩潰。所以搭配 Service Discovery 與 Circuit Breaker 來提高其可用性可能是必備的設計。
Messaging 模式是一種 非同步通訊 的方式。服務透過訊息中介(Message Broker,如 Kafka、RabbitMQ)傳遞訊息,發送端只需把訊息交給中介即可,接收端在可用時再處理訊息。
【範例】
回到訂單管理系統的案例:
這樣的設計下,OrderService 並不需要知道有多少個服務會處理事件,降低了耦合度。
這個模式主要可以得到的好處「鬆散耦合」,訊息可先存放在 broker 中,即使消費者暫時不可用也不影響流程,支援多樣化的互動模式(pub/sub、async response 等)。
而缺點則是,系統複雜度上升,通常伴隨著中介軟體的維護作業,且為了確保訊息有送達,大多數會有「重送」的情況,所以在實作上還需要考慮去重。除此之外,因為低耦合的模式將造成問題追蹤困難,所以在設計上必須考量分散式追蹤的模式來進行錯誤盤查才可以滿足維運上的需求。
有時候,一般的 RPC 或 Messaging 並不足以滿足需求,特定領域會設計 專屬協議 來進行服務間通訊。例如:
【範例】
在醫療系統中,不同的醫院系統可能需要交換病歷資料。這時候,使用通用的 REST API 不一定能有效處理,反而會透過 FHIR(Fast Healthcare Interoperability Resources) 這類標準化協議進行交換。
這種是針對特定領域應用的最佳化,但通常都需要額外的學習成本。
在 Messaging 模式中,訊息傳遞往往採用 at-least-once delivery,這意味著某些訊息可能會被重送多次。如果消費者在處理訊息時不是冪等的,則可能產生錯誤。
所謂 Idempotent Consumer,就是確保同一筆訊息處理多次,結果仍然一致。
【範例】
假設有一個 AccountService 負責處理「扣款」訊息:
增加這個機制主要是為了確保資料正確性,減少重送帶來的副作用,但是也為設計帶來了複雜度,更需要考量各種資料的「一致性」。
模式 | 同步/非同步 | 優點 | 缺點 | 適用場景 |
---|---|---|---|---|
RPI | 同步 | 簡單、直覺,適合查詢即時資料 | 高耦合、降低可用性 | REST/gRPC 服務查詢 |
Messaging | 非同步 | 鬆耦合、高可用、支援多種互動模式 | 增加 broker 複雜度、需冪等性 | 訂單、事件流處理 |
Domain-specific protocol | 視情境 | 高效率、專屬領域最佳化 | 學習成本高、不通用 | 醫療資訊交換、影音串流 |
Idempotent Consumer | 非同步強化設計 | 確保正確性 | 增加檢查開銷 | 採用 Messaging 模式時 |
微服務架構的本質是「分散式系統」,因此通訊模式的選擇會直接影響到整體系統的可用性、效能與維護性。
最終的設計應該根據 業務需求、團隊能力、基礎設施成熟度 來決定,沒有一種模式可以解決所有問題。