分散式事務的華麗進化

来源:https://www.cnblogs.com/Jcloud/archive/2023/08/15/17630790.html
-Advertisement-
Play Games

說到分散式事務,大家並不陌生。在實際工作中,用得比較多的還是柔性分散式事務,今天主要把在工作中運用到的幾種柔性分散式事務的場景及實現方式做一個簡單介紹,也可以看做是柔性分散式事務的一個演進過程。 ...


說到分散式事務,大家並不陌生。在實際工作中,用得比較多的還是柔性分散式事務,今天主要把在工作中運用到的幾種柔性分散式事務的場景及實現方式做一個簡單介紹,也可以看做是柔性分散式事務的一個演進過程。

一、調用方保證

這種方式適合業務內自己使用,當方法內的任務一個邏輯發生異常時,整個方法都異常,由調用方進行重試。該方法不太適合於外部系統的交互,否則,這就是把自己的命運交到別人的手裡,是比較危險的做法。

在上述調用示意圖中,內部應用APP1和APP2之間,APP1的方法method1調用APP2里的method2方法,method2里有分散式事務邏輯,當分散式事務中的邏輯異常後,method2方法都失敗或拋出異常,method1收到返回值是失敗或異常後,都需要重試調用method2,確保method2執行成功。method2本身則需要確保邏輯中已經成功的邏輯再次被調用時處理也要正確。

@DistributedTransaction
method2(){
    //write DB
    //send msg
    //RPC invoke
}


該方法不建議大家在工作中使用,僅從保證分散式事務的正確性看是可以使用的,但從Java的規範上看,這種方法屬於用異常控制流程,並不是很規範。同時,如果分散式事務中的邏輯是寫本地庫,發消息或RPC遠程調用,則一般不建議把事務和發消息或RPC調用放到事務方法內,避免大事務。

二、定時任務掃描業務表

該場景主要運用於流量小、業務場景較單一的場景,或是業務處於驗證階段,為了快速驗證業務是否有價值階段,直接用業務表來做任務表,避免建多張表。在用本地事務寫完業務表後,事務正常提交即可。通過一個定時任務查詢業務表的增量數據,在定時任務中處理其他業務邏輯。

@Transaction
void method1(){
    //write DB1 Bueiness Table
    //other business Logic
}

void method2(){
    //查詢DB1中的Bueiness Table,時間從上次任務開始執行的時間開始
    //處理自身的業務邏輯
}


該方案一般作為過渡方案,最終業務量上來後,會升級到下麵的本地任務表的方案。

三、本地任務表

這是比較典型的分散式事務的解決方案,即:在業務庫中,同步建一個任務表。業務表和任務表在本地事務中同時寫入,再由一個定時任務定時查詢任務表,把任務讀取到後根據業務邏輯要求進行處理。

業務表和任務表在一個資料庫中,由資料庫的一個事務控制器實現事務。在應用中,另起一個定時任務,由定時任務去查詢任務表,把任務表中新進的任務抓取後執行該定時任務需要執行的業務邏輯。

@Transaction
void method1(){
    //write DB1 Bueiness Table
    //write DB1 Task Table
}

void method2(){
    //定時查詢DB1中的Task Table
    //任務抓取後執行自身的業務邏輯
}


該方案實際運用時,定時任務的穩定性需要我們特別關註,定時任務的穩定性決定我們該方案的可用性。建議把定時任務的執行情況監控起來,確保有問題時能第一時間處理,避免影響業務。

四、組件抽取

目前,對於Java語言開發的團隊,其框架大部分都以Spring為主,故可基於SpringEvent非同步事件做一個小的組件封裝。主要思路為在事務中,發送Event非同步事件,當非同步事件發送成功則事務提交結束,當非同步事件發送失敗則非同步任務落本地資料庫後事務再提交結束,然後通過定時任務從任務表中抓取任務執行。

該方案以SpringEvent非同步事件為主做了一個組件,當SpringEvent非同步事件發送異常後,降級到本地任務表,確保非同步任務的可靠性。即使沒有封裝為組件,在實際工作中,還是比較推薦大家使用該方案。

@Transaction
void method1(){
    //業務數據寫入DB成功
    try{
    //發送SpringEvent事件
    }catch(Exception ex){
    //寫入本地任務表
    }
}

void method2(){
    //接收事件或定時任務的數據執行業務邏輯
}


當然,如果項目中沒有使用Spring框架也沒問題,有了上述的思想,可以根據自身使用的框架情況進行調整。正所謂“只要思想不滑坡,辦法總比困難多”。

作者:京東物流 廖宗雄

來源:京東雲開發者社區 自猿其說Tech 轉載請註明出處


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## [Ooonly] 前情提要:需要刷寫一整個app程式,分包刷寫,每包位元組數為單數,要求CRC校驗正確。(晶元底層提供32位全字刷寫和16位半字刷寫,驅動只整合了32位全字刷寫函數) 使用32位刷寫函數出現的現象:通過keil5觀察記憶體空間發現一包刷寫成功一包刷寫失敗一包刷寫成功...一直迴圈到 ...
  • 提要:本系列文章主要參考`MIT 6.828課程`以及兩本書籍`《深入理解Linux內核》` `《深入Linux內核架構》`對Linux內核內容進行總結。 記憶體管理的實現覆蓋了多個領域: 1. 記憶體中的物理記憶體頁的管理 2. 分配大塊記憶體的伙伴系統 3. 分配較小記憶體的slab、slub、slob分 ...
  • 本文將詳細介紹如何發佈.NET Core項目到IIS伺服器。首先,第一步需要安裝IIS,介紹了在本地電腦和伺服器中進行安裝。然後需要安裝SDK和運行時才能發佈.NETCore項目。其次介紹瞭如何發佈.NETCore項目和Vue項目,並配置IIS。最後介紹瞭如何將項目部署到Service服務中。 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230815092340479-67825278.png) # 1. 事務日誌 ## 1.1. 事務日誌有助於提高事務的效率 ### 1.1.1. 存儲引擎只需要更改記憶體中的數 ...
  • # mysql複製技術/mysql集群 ![](https://img2023.cnblogs.com/blog/3165277/202308/3165277-20230815183932805-1063237772.png) ## 準備 1.四台虛擬機都關閉防火牆 ``` systemctl st ...
  • 最近系統有個需求,希望工作流的審批人被催辦後就要置頂在最前面, 工作流列表我是用es的,一開始想用pinned實現,但用pinned的話,每頁都會置頂在前面,我的需求只是想讓他優先排在前面,翻頁後正常顯示 後面找到這個,通過把匹配到數據的分數提高,然後用sort進行排序,就能實現我的需求了 GET ...
  • 簡介 Timescale Documentation | Getting started with Timescale Timescale是一個用於時間序列,事件和分析的PostgreSQL數據平臺。 提供了PostgreSQL的可靠性,這是時間序列的超能力 TimescaleDB,。它提供 自動備 ...
  • GaussDB(for Influx)推出了單機版方案,可用於開發、測試等場景,既能享受到服務化帶來的便利,也可以明顯地降低使用成本。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...