下面我們來看,在這些步驟中,會有哪些失敗場景和各自特點:本地 DB 的 SQL 執步驟 3:發送 MQ 通知下遊賬務系統入賬:如果失敗的話,和上一步類似,需要日志表 + 定時任務補償。步驟 4/5:更新 DB 的還款記錄狀態爲“扣款成功”或“扣款失敗”:如果更新 DB 操作出現了失敗,則需要定時任務,重試補償,這需要借助日志表來恢複,後台定時任務去掃描該日志表,以從之前失敗的步驟,繼續執行下去,類似于“斷點續傳”,這裏我們暫不詳述; 步驟 5:發送 MQ 通知下遊賬務系統入賬:如果發送失敗的話,和上一步類似,需要日志表 + 定時任務補償;步驟 6:賬務系統入賬:由于通常的 MQ(我們用的是 RocketMQ)本身有 at-least-once 的重試機制,這就保證了消息必須被正確消費(只要賬務系統程序不會主動 ignore 掉)才會被 ack,所以這個地方的最終成功,就由消息中間件來保證了;如果使用的 MQ 組件沒有這種重試機制,則需要在賬務系統端建立日志表,來補償(如果 MQ 有丟失消息的風險,那仍然可能不一致)。行:SQL 錯誤、與 DB 網絡中斷或者 DB 不可用的時候,會失敗,但這種失敗可補償,且概率很低;遠程調用:在本例中是“同步調用第三方支付渠道扣款”,因爲這是網絡調用,最複雜的一種,可能會超時、也可能會連接中斷或其他錯誤原因中斷,這裏的失敗是有無法補償的可能的,尤其是業務類錯誤——用戶不良人第5季全集免費觀看余額不足、用戶銀行卡狀態不對等,都可能導致業務終止而無法繼續下去;發送 MQ 和本地 DB 的 SQL 執行類似,是可補償的失敗,從可用性的角度來看,比 SQL 執行免費能收黃台的直播APP的失敗概率略高一些,在我們實際場景中,就有發送失敗的情況(我們使用的是 RocketMQ,曾經出現過幾次 broker 刷盤緩慢導致流控的發送失敗);異步系統執行:我們這裏是觸發賬務系統入賬,是 RPC 類(我們用的 Dubbo)操作,有一定的失敗可能性(賬務系統壓力過大、內存溢出、磁盤占滿等都可能導致其不能或部分服務器不能提供服務),但又因爲它在業務上是肯定能成功的記賬操作,所以即使失敗,也是可以補償的; 綜合上面這些分析,考慮到步驟 2“同步調用第三方支付渠道扣款”是唯一一種無法補償的業務,且處于流程鏈最靠前的地方,所以整個業務流,我們是向著可補償的方式,即保證最終都會成功的最終一致性的方向去做。
而吴国(guó)国主孙皓(hào)荒淫无度,滥杀(shā)贤能之(zhī)才(cái)。两相对比(bǐ),灭吴根本不(bù)需要费多(duō)大力啊。”司马炎(yán)当即拍(pāi)板,定下
04高靜終于心灰意冷,也終于明白,她放低了自己去愛一個人,根本得不到同等的愛和回報。有時候對一個人太好,他就會更不懂得珍惜你了。離婚辦的很