重點摘要#

  • 現實世界不是二元的:客戶會下單後取消、支票會退票、付款會延遲
  • 分散式系統引入了全新的不一致性問題:服務可能無法到達、不保證交易語義
  • 架構師應該向現實世界學習解決方案,而非只抱怨它帶來的問題
  • 連 Starbucks 都不用 two-phase commit

詳細內容#

工程師喜歡精確,尤其是軟體工程師。他們習慣於二元決策:一或零、真或假、是或否。一切都由外鍵約束、原子交易和校驗碼保證清晰一致。

現實世界的混亂#

不幸的是,現實世界並非如此二元:

  • 客戶下單後又立刻取消
  • 支票退票、信件遺失、付款延遲、承諾被打破
  • 資料輸入錯誤時常發生
  • 使用者偏好「淺層」介面,能同時存取多個功能

在廣泛分散式系統中,失敗不是「如果」的問題,而是「何時」的問題。這些系統是鬆耦合、非同步、並行的,且不遵循傳統的交易語義。

因應之道#

告別傳統可預測的 call-stack 架構,轉向:

  • 事件驅動:隨時準備在任何順序回應事件
  • 非同步並行:同時發出非同步請求,而非逐一呼叫方法
  • 流程建模:使用事件驅動的流程鏈或狀態模型來避免完全混亂
  • 錯誤調和:透過補償(compensation)、重試(retry)或暫定操作(tentative operations)來處理錯誤

向現實世界取經#

現實世界長久以來都在處理相同的問題:延遲的信件、違背的承諾、寄錯帳戶的付款。相應地,人們發展出了重寄信件、沖銷壞帳、忽略重複付款提醒等機制。

不要只抱怨現實世界帶來的麻煩,也要把它當作尋找解決方案的靈感來源。畢竟,Starbucks 也不用 two-phase commit。歡迎來到現實世界。

— By Gregor Hohpe