Microservice transaction - The first sight

Transaction across Microservices

  1. 盡可能避免 transactions 在多個 microservices
  2. Two-phase commit protocol 兩階段提交協議,用於跨不同software components (databases, message queues...)的transaction
    • Architecture of 2PC
      • transaction coordinator 調節器包含兩個部分
        • 準備階段 prepare phrase
        • Commit and rollback phrase
      • 會拖垮操作service的速度,例如 A -> B , A 先設定成prepare,等待 B執行結束返回,A才update成 commit/rollback
    • XA standard (Open XA, (XA stands for extended Architecture) based on 2PC, 目標是保證執行在全域性transaction的原子性. 定義global transaction manager 以及special application,做交易都須透過此library,讓transaction manager track每筆交易。XA maintain logs 去決定是否要commit/rollback)
      • 優點是cross service transaction 可以使用各自的技術去實作,包含各自有各自的database
      • 缺點就會在transaction manager  有 bottle neck on 處理大量請求,必須保持service always alive
    • Rest-AT Standard  Draft
      • Standard 允許 application server as a transaction coordinator, 用rest API建立分散式 transaction
      • 最終還是要要部署到local 或個環境、編寫橋接服務的邏輯
  3. Eventual Consistency and Compensation (最終一致性跟補償)
    此模型不強制跨維服務執行分散式的ACID行為,而是運用些機制:狀態、flag、batch process來確保系統在未來的某個時間點資料最終一致性。
    • 在眾多可行性分析中眾多可行性分析中能夠達到跨microservices是eventual consistency最終一致性
      假設有以下服務:
      • user microservice 用於註冊使用者
      • validation microservice 用於 backgrand check
      • message platform 處理資料持久層
    • 快樂案例
      • 當註冊使用者,就會在先建立使用者在資料庫並給個flag 等待validation
      • 傳送註冊成功訊息但提醒使用者尚未驗證完畢。
      • validation 成功則 unblock user, 否則block user
      • 結論:雖然沒能及時同步,但至少最終是一致的
    • 失敗案例
      • 假設validation掛掉,message platform 保留待驗證的user請求,等上線後再次call validation
      • 假設 message platform 掛掉,也可用batch-process去把該需被處理的資料挑出並在修復後再送一次

Microservice Design Pattern

為了保持service的彈性,來面對非預期性的硬體、網路、service performance,等問題,並且有能力從failure中recover來保持service運作,實踐pattern能預防一連串的錯誤。

Timeout pattern:

最簡單的模型,利用設定timeout設定讓request處理有問題或效能過慢的服務直接回傳失敗結果。但缺點就是在down stream service掛掉後,接下來的每個request都需要等待到timeout才會回response。

Retry pattern:

完整的microservice架構都是HA, 若down stream service response很慢超過timeout,可以藉由retry機制再次訪問service, 確保連線到其他正常的instance進而讓整個e2e process順利進行。但缺點就在retry也是會增加overall response time.

Bulkhead Pattern:

Bulkhead字面上的意思就是船艙的隔間,預防一個艙隔破了就導致船底都進水。運用Bulkhead pattern, 安排資源給特定component來讓application不至於資源耗盡,若超過上限,則觸發callbackMethod做處理。

circuit breaker pattern:

當down stream service出現問題,並回應callback method/default value時,表示不能再對下游service打入更多的request,則會根據臨界值(如預設request的一半)去控制打開阻斷器,並返回call back method的內容。

Rate limit pattern:

Rate limit 在控制突發大量throughput,藉由設定concurrent上限以及不同request queuing演算法,可以防止資源受到惡意攻擊造成停擺。 可參考 Rate limiting with NGINX - The first sight 這篇介紹。


references:

留言

這個網誌中的熱門文章

[專案] 銀行端末系統

如何在MacOS 中自由切換不同Python版本 - pyenv + virtualenv

用 C# 控制 Win7 輸入法