分散式事務(五)之最大努力通知

御狐神發表於2021-11-09

最大努力通知型( Best-effort delivery)是最簡單的一種柔性事務,適用於一些最終一致性時間敏感度低的業務,且被動方處理結果不影響主動方的處理結果。典型的使用場景:如銀行通知、商戶通知等。

最大努力通知

最大努力通知型( Best-effort delivery)是最簡單的一種柔性事務,適用於一些最終一致性時間敏感度低的業務,且被動方處理結果 不影響主動方的處理結果。典型的使用場景:如銀行通知、商戶通知等。最大努力通知型的實現方案,一般符合以下特點:

  1. 不可靠訊息:業務活動主動方,在完成業務處理之後,向業務活動的被動方傳送訊息,直到通知N次後不再通知,允許訊息丟失(不可靠訊息)。
  2. 定期校對:業務活動的被動方,根據定時策略,向業務活動主動方查詢(主動方提供查詢介面),恢復丟失的業務訊息。

最大努力通知示例

舉例來說:筆者曾經做過一個簡訊傳送平臺,背景是公司內部有多個業務都有傳送簡訊的需求,如果每個業務獨立實現簡訊傳送功能,存在功能實現上的重複。因此專門做了一個簡訊平臺專案,所有的業務方都接入這個簡訊平臺,來實現傳送簡訊的功能。簡化後的架構如下所示:

最大努力通知

簡訊傳送流程

業務方傳送一次簡訊的流程包含如下步驟:

  1. 業務方將簡訊傳送請求提交給簡訊平臺;
  2. 簡訊平臺接收到要傳送的簡訊,記錄到資料庫中,並標記其狀態為”已接收";
  3. 簡訊平臺呼叫外部簡訊傳送供應商的介面,傳送簡訊。外部供應商的介面也是非同步將簡訊傳送到使用者手機上,因此這個介面呼叫後,立即返回,進入第4步;
  4. 更新簡訊傳送狀態為"已傳送";
  5. 簡訊傳送供應商非同步通知簡訊平臺簡訊傳送結果。而通知可能失敗,因此最多隻會通知N次。;
  6. 簡訊平臺接收到簡訊傳送結果後,更新簡訊傳送狀態,可能是成功,也可能失敗(如手機欠費)。到底是成功還是失敗並不重要,重要的是我們知道了這調簡訊傳送的最終結果;
  7. 如果最多隻通知N次,如果都失敗了的話,那麼簡訊平臺將不知道簡訊到底有沒有成功傳送。因此簡訊傳送供應商需要提供一個查詢介面,以方便簡訊平臺驅動的去查詢,進行定期校對。

在這個案例中,簡訊傳送供應商通知簡訊平臺簡訊傳送結果的過程中,就是最典型的最大努力通知型方案,通知了N次就不再通知。通過提供一個簡訊結果查詢介面,讓簡訊平臺可以進行定期的校對。而由於簡訊傳送業務的時間敏感度並不高,比較適合採用這個方案。

需要注意的是,簡訊結果查詢介面很重要,必須要進行定期校對。因為後期要進行對賬,筆者在做這個專案的時候,一個月的簡訊傳送總量在高峰期可以達到1億條左右,即使一條簡訊只要5分錢,一個月就有500W。

參考文件

柔性事務:最大努力通知

本文最先發布至微信公眾號,版權所有,禁止轉載!

相關文章