天天看點

微服務跨服務事務的實作

微服務跨服務事務的實作

首先,實作主要業務的服務,必須保證具有事務一緻性的特性,比如依賴于普通的RDMS。這時候如果發生業務,則同時向消息隊列釋出一條事件消息,這樣其他的服務可以訂閱這個消息,并對這個消息進行處理,并産生自己業務的資料,保證到最後的一緻性。

這樣帶來一個問題,儲存到資料庫和向消息隊列釋出消息無法做到事務一緻性。比如你資料庫操作完成了,MQ連接配接不上怎麼辦?我們可以在操作資料庫的事務中,增加一個插入事件資料的任務,這個任務和主業務是同一個事務,保證一緻性。另外起一個定時任務,從資料庫讀取插入的事件資料,轉化成消息釋出到消息隊列,釋出成功後删除事件資料。

這樣帶來另外一種可能,比如消息釋出到消息隊列後,删除事件失敗,可能就會造成消息多發。這樣需要我們保證接受事件處理程式,需要保證幂等性或者具有去重的功能。這樣即使消息被重複發送,也最多是浪費一點資源重跑了一下。

在這種情況下,依然可能出現其他業務拿到消息後,無法執行本地業務成功。這時候可以讓其他業務把失敗的任務儲存下來,由一個專門的異常處理程式來集中起來人工處理。

這裡我們舉個會員注冊自動送積分的例子。我們這裡有兩個服務:會員管理、積分管理。會員在注冊後,根據一定條件産生一條送積分的記錄。首先使用者在會員管理中調用插入一條會員記錄,并同時插入一條事件是“新會員”這樣一條記錄。定時任務讀取到“新會員”的事件後,向MQ釋出一條“新會員”的消息。積分管理子產品訂閱了“新會員”的消息,收到後從會員管理服務查詢到會員狀态,經過計算後插入一條積分記錄。如果操作失敗,則發送一條消息處理失敗的消息到MQ,由專門的異常業務處理子產品記錄下來并通知到管理者。

最後,記錄好日志,極端情況實在不行可以根據日志進行人工操作。

資料整理

整理了一份java面試資料,包括:

  • ActiveMQ消息中間件面試專題
  • BAT80道面試題
  • BAT面試的Mysql面試55題
  • Dubbo面試專題
  • JVM面試專題
  • Kafka面試專題
  • Linux面試專題
  • memcached面試專題
  • MongoDB面試專題
  • MyBatis面試專題
  • mysql面試專題
  • Mysql性能優化面試專題
  • Netty面試專題
  • ……
微服務跨服務事務的實作

網盤位址:

【位址擷取:回複58】​