04.其他方案

其他方案

1.事務狀態表+調??重試+接收?冪等

介紹

調??維護?張事務狀態表(或者說事務?志、?志流?),在每次調?之前,落盤?條事務流?,?成?個全局的事務ID

事務開始之前的狀態是Begin,全部結束之后的狀態是End。如果某個事務?直停留在Begin狀態,則說明該事務沒有執?完畢

然后有?個后臺任務,掃描狀態表,在過了某段時間后(假設1次事務執?成功通常最多花費30s),狀態沒有變為最終的狀態,說明這條事務沒有執?成功。于是重新調?系統的接口。保證這條流?的最終狀態是End狀態

事務狀態表

補充說明

  • 冪等問題:系統調用方和被調用方根據全局的事務ID做冪等操作,所以即使重復調?也沒有關系
  • 如果后臺任務重試多次仍然不能成功,要為狀態表加?個Error狀態,通過??介??預
  • 對于同步調?,調??調?A或B失敗的時候,可以重試三次。如果重試三次還不成功,則放棄操作,再交由后臺任務后續處理

2.對賬

介紹

所有的“過程”都必然產?“結果”,過程是我們所說的“事務”,結果就是業務數據。?個過程如果部分執?成功、部分執?失敗,則意味著結果是不完整的。從結果也可以反推出過程出了問題,從?對數據進?修補,這就是“對賬”的思路

分類

  • 全量對賬:?如每天晚上運作?個定時任務,對比兩個數據庫
  • 增量對賬:可以是?個定時任務,基于數據庫的更新時間;也可以基于消息中間件,每?次業務操作都拋出?個消息到消息中間件,然后由?個消費者消費這條消息,對兩個數據庫中的數據進??對(當然,消息可能丟失,?法百分之百地保證,還是需要全量對賬來兜底)

例子

案例1

電商?站的訂單履約系統。?張訂單從“已?付”,到“下發給倉庫”,到“出倉完成”。假定從“已?付”到“下發給倉庫”最多?1個?時;從“下發給倉庫”到“出倉完成”最多?8個?時。意味著只要發現1個訂單的狀態過了1個?時之后還處于“已?付”狀態,就認為訂單下發沒有成功,需要重新下發,也就是“重試”。同樣,只要發現訂單過了8個?時還未出倉,這時可能會發出報警,倉庫的作業系統是否出了問題……諸如此類

案例2

微博的關注關系。需要存兩張表,?張是關注表,?張是粉絲表,這兩張表各?都是分庫分表的。假設A關注了B,需要先以A為主鍵進?分庫,存?關注表;再以B為主鍵進?分庫,存?粉絲表。也就是說,?次業務操作,要向兩個數據庫中寫?兩條數據,如何保證原?性?

案例3

電商的訂單系統也是分庫分表的。訂單通常有兩個常?的查詢維度,?個是買家,?個是賣家。如果按買家分庫,按賣家查詢就不好做;如果按賣家分庫,按買家查詢就不好做。這種通常會把訂單數據冗余?份,按買家進?分庫分表存?份,按賣家再分庫分表存?份。和案例2存在同樣的問題:?個訂單要向兩個數據庫中寫?兩條數據,如何保證原?性?

案例2和3的解決思路

如果把案例 2、案例 3 的問題看作為?個分布式事務的話,可以?對賬解決

因為兩個庫的數據是冗余的,可以先保證?個庫的數據是準確的,以該庫為基準校對另外?個庫

總結

對賬的關鍵是要找出“數據背后的數學規律”。有些規律?較直接,誰都能看出來,?如案例2、案例3的冗余數據庫;有些規律隱含?些,?如案例1的訂單履約的狀態。找到了規律就可以基于規律進?數據的?對,發現問題,然后補償

3.弱?致性+基于狀態的補償

場景

需求解析

對于該需求,有?個關鍵特性:對于電商的購物來講,允許少賣,但不能超賣。?如有100件東西,賣給99個?,有1件沒有賣出去,這是可以接受的;但如果賣給了101個?,其中1個?拿不到貨,平臺違約,這就不能接受。?該處就利?了這個特性

流程

  • 提交訂單成功,扣庫存成功,返回成功
  • 提交訂單成功,扣庫存失敗,返回失敗,調??重試(此處可能會多扣庫存)
  • 提交訂單失敗,不再扣庫存,調??重試

解決

只要最終保證庫存可以多扣,不能少扣即可

但是,庫存多扣了,數據不?致,怎么補償呢?

庫存每扣?次,都會?成?條流?記錄。這條記錄的初始狀態是“占?”,等訂單?付成功后,會把狀態改成“釋放”

對于那些過了很長時間?直是占?,?不釋放的庫存,要么是因為前?多扣造成的,要么是因為?戶下了單但沒有?付

通過?對,得到庫存系統的“占?又沒有釋放的庫存流?”與訂單系統的未?付的訂單,就可以回收這些庫存,同時把對應的訂單取消。類似12306?站,過?定時間不?付,訂單會取消,將庫存釋放

4.重試+回滾+報警+??修復

先扣庫存,后創建訂單。不做狀態補償,為庫存系統提供?個回滾接口。創建訂單如果失敗了,先重試。如果重試還不成功,則回滾庫存的扣減。如回滾也失敗,則發報警,進????預修復

總之,根據業務邏輯,通過三次重試或回滾的?法,最?限度地保證?致。實在不?致,就發報警,讓???預。只要?志流?記錄得完整,??肯定可以修復!通常只要業務邏輯本?沒問題,重試、回滾之后還失敗的概率會?較低,所以這種辦法雖然丑陋,但很實?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go語言進階篇——文件

文件的打開 文件的常見的兩種打開方式是基于os包所提供的兩個函數: func Open(name string) (*File,error) func OpenFile(name string flag int perm FileMode) (*File,error)相對于前者,OpenFile可以提供更加細致的操作,而前者就是對后者的一個簡單封…

碼垛工作站:食品生產企業的轉型助推器

在當今高度自動化的工業生產中,碼垛工作站的應用正逐漸成為一種趨勢。某食品生產企業在面臨市場競爭加劇、人工成本上升等多重壓力下,決定引入碼垛工作站,以期實現生產流程的升級與變革。 一、碼垛工作站引入背景 該企業主要從事休閑食品的…

Android 中的 LinearLayout 布局

在 Android 開發中,布局是至關重要的一部分,它決定了應用程序的界面結構和用戶體驗。LinearLayout 是 Android 中最常用的布局之一,它以線性方式排列子視圖,可以垂直或水平布局。在這篇博客中,我們將深入了解 LinearLa…

數據結構實現-棧和隊列

順序棧 #include <iostream> using namespace std; #define MaxSize 50//順序棧 template<typename ElemType> struct SqStack{ElemType data[MaxSize];int top; };//初始化 template<typename ElemType> void InitStack(SqStack<ElemType>&s){s.…

Postman和Jmeter的區別

1.用例組織方式不同 jmeter組織方式相對比較扁平&#xff0c;沒有工作空間的概念&#xff0c;直接就是測試計劃 postman組織方式會比較輕量級&#xff0c;只要是針對單個的HTTP請求 2.支持的接口類型與測試類型上 jmeter會更強大&#xff0c;可以支持REST、Soap等等&#xf…

Kotlin 協程遇見 Flow:打造更優雅的數據流處理

Kotlin Flow 是 Kotlin 協程庫中的一個組件&#xff0c;它提供了處理異步數據流的能力。Kotlin Flow 類似于 RxJava 中的 Observable&#xff0c;但它完全基于 Kotlin 協程設計&#xff0c;使得異步流的操作變得更加簡單和直觀。 Flow 是冷流&#xff08;cold stream&#xff…

【貪心算法】Leetcode 455.分發餅干 376. 擺動序列 53. 最大子數組和

【貪心算法】Leetcode 455 分發餅干 376. 擺動序列【規律很多】53. 最大子數組和 455 分發餅干局部最優推全局最優&#xff1a;盡量用大餅干去滿足大胃口的小朋友 376. 擺動序列【規律很多】思想&#xff1a;注意考慮一個坡度留首尾兩個點、平坡、首尾 53. 最大子數組和【好思想…

15.網絡游戲逆向分析與漏洞攻防-網絡通信數據包分析工具-發送通信數據包至分析工具

上一個內容&#xff1a;14.數據包分析工具界面與通信設計 碼云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan 碼云版本號&#xff1a;2d6491e3c51a1a7ab4da0ee6dc4cf566a80fd6e1 代碼下載地址&#xff0c;在 titan 目錄下&…

模版進階C++

非類型模版 之前我們寫的模版都是在不知道模版&#xff08;類&#xff09;中有的變量的類型是什么的時候&#xff0c;我們先用模版參數定義&#xff0c;當類實例化的時候在傳參確認 非類型模版&#xff1a;模版參數定義的時候也可以定義整型類型&#xff08;c20之后才支持其…

奇點云:SAFe框架下,我們對平臺軟件工程生產線做了4項改造

導讀&#xff1a; 客戶規模擴大&#xff0c;如何保證大數據軟件產品和服務質量始終如一&#xff1f;幾乎所有成長中的軟件廠商&#xff0c;尤其是需要通過私有化部署交付的廠商&#xff0c;都會面臨這個問題。正如《人月神話》中多次表明的&#xff0c;單純地增加人手、擴大團隊…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的植物病害檢測系統(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發高效的植物病害檢測系統對于提升農業生產效率和作物健康管理意義重大。本篇博客詳細闡述了如何運用深度學習技術構建一個植物病害檢測系統&#xff0c;并提供了完整的實現代碼。該系統基于先進的YOLOv8算法&#xff0c;對YOLOv7、YOLOv6、YOLOv5進行了性能…

考研數學——高數:微分方程

一、一階線性微分方程 兩種形式&#xff1a; 非齊次&#xff1a; 齊次&#xff1a; 推導過程 推導公式的過程一般由特殊到一般&#xff1a;所以先求解齊次方程的解 &#xff08;然后對等式兩邊同時積分&#xff09; 再來求非齊次方程的解&#xff0c;由…

【測開求職】2023秋招快手一面面經

已經過了百度測開三面,快手這個一面比百度的要難很多,可能也是遇到了比較嚴格的面試官,感覺其他面經沒有這么難。30分鐘實習,20分鐘算法題,20分鐘八股,沒有問項目。 實習 diff遇到了哪些痛點diff是全量還是增量一些字段的增加或者枚舉值的增加可以用diff測嗎有哪些自動化…

03-grafana的下拉列表選項制作-grafana的變量

一、準備環境 為了實現下拉列表篩選的樣例&#xff0c;我們監控兩個linux節點&#xff1b; 目前&#xff0c;我們已經有了一個節點了&#xff0c;再添加一個&#xff1b; 二、grafana的儀表盤變量 如果想給儀表盤自定義下拉列表&#xff0c;那么&#xff0c;需要設置變量&#…

線上問題——2021-12-27 父子線程共用線程池導致死鎖故障

一、事故現象 從早上6點開始edu-wings-admin的timer-task和mq就開始報警任務堆積&#xff0c;且數量持續上升&#xff0c;到6點50左右mq也開始告警&#xff0c;8點左右發現問題&#xff0c;開始排查&#xff0c;直到11點才找到問題&#xff0c;任務開始正常消費。 二、事故影響…

haproxy集成國密ssl功能[下]

上接[haproxy集成國密ssl功能上 4. 源碼修改解析 以下修改基本圍繞haproxy的ssl_sock.c進行修改來展開的,為了將整個實現邏輯能夠說明清楚,下述內容有部分可能就是直接摘抄haproxy的原有代碼沒有做任何修改,而大部分增加或者修改的內容則進行了特別的說明。 4.1 為bind指令…

基于springboot+vue的疾病防控綜合系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

計算機設計大賽 深度學習貓狗分類 - python opencv cnn

文章目錄 0 前言1 課題背景2 使用CNN進行貓狗分類3 數據集處理4 神經網絡的編寫5 Tensorflow計算圖的構建6 模型的訓練和測試7 預測效果8 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度學習貓狗分類 ** 該項目較為新穎&a…

Python測試框架pytest介紹用法

1、介紹 pytest是python的一種單元測試框架&#xff0c;同自帶的unittest測試框架類似&#xff0c;相比于unittest框架使用起來更簡潔、效率更高 pip install -U pytest 特點&#xff1a; 1.非常容易上手,入門簡單,文檔豐富&#xff0c;文檔中有很多實例可以參考 2.支持簡單的單…

C++內存模型與內存序

寫在前面 在真正了解Memory Order的作用之前&#xff0c;曾經簡單地將Memory Order等同于mutex和atomic來進行線程間數據同步&#xff0c;或者用來限制線程間的執行順序&#xff0c;其實這是一個錯誤的理解。直到后來仔細研究了Memory Order之后&#xff0c;才發現無論是功能還…