Microservice transaction - The first sight
Transaction across Microservices
- 盡可能避免 transactions 在多個 microservices
- 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 或個環境、編寫橋接服務的邏輯
- 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:
留言
張貼留言