【金九銀十必問面試題】站在架構師角度分析問題,如何解決TCC中的懸掛問題

来源:https://www.cnblogs.com/mic112/archive/2022/09/07/16665454.html
-Advertisement-
Play Games

“如何解決TCC中的懸掛問題”! 一個工作了4年的Java程式員,去京東面試,被問到這個問題。 大家好,我是Mic,一個工作了14年的Java程式員 這個問題面試官想考察什麼方面的知識?我們又該怎麼回答呢? 問題解析 TCC是分散式事務問題裡面的解決方案,一般在應聘互聯網公司的時候問的比較多。 實際 ...


“如何解決TCC中的懸掛問題”!

一個工作了4年的Java程式員,去京東面試,被問到這個問題。

大家好,我是Mic,一個工作了14年的Java程式員

這個問題面試官想考察什麼方面的知識?我們又該怎麼回答呢?

問題解析

TCC是分散式事務問題裡面的解決方案,一般在應聘互聯網公司的時候問的比較多。

實際上,在TCC這個事務解決方案裡面,除了懸掛問題以外,還有空回滾、冪等性需要考慮。

但是我們在應用的時候都是採用一些成熟的框架,比如Seata,這些框架本身就幫我們解決了。

導致大部分人不知道這個問題的意思。

所謂TCC,其實就是(Try-Confirm-Cancel),也就是把一個事務拆分成兩個階段,類似於傳統的XA事務模型。

Try這個階段,是實現業務的檢查,預留必要的業務資源。

Confirm,真正執行業務邏輯,只需要使用try階段預留的業務資源進行處理就行。

Cancel,如果事務執行失敗,就通過cancel方法釋放try階段預留的資源。

image-20220803203513145

在TCC事務模式下,我們通過一個事務協調器來管理多個事務,每個事務先執行try方法。

當所有事務參與者的try方法執行成功,就執行confirm方法完成真正邏輯的執行,一旦任意一個事務參與者出現異常,就通過cancel介面觸發事務回滾,釋放Try階段占用的資源。

img

很顯然,這是一個最終一致性的實現方案,因此當Try執行成功,就必須確保Confirm執行成功。

當Try執行失敗,就必須確保Cancel實現資源釋放。

而面試題中提到懸掛問題,指的是TCC執行Try介面出現網路超時時候,使得TCC觸發Cancel介面回滾,但可能在回滾之後,這個超時的Try介面才被真正執行,也就導致Cancel介面比Try介面先執行。

從而造成Try介面預留的資源一直無法釋放,這種情況就是懸掛。

以上就是TCC懸掛問題的背景,它確實是每個成熟的高級開發必須要瞭解的細節。

因為有可能會造成比較嚴重的生產事故。

瞭解了背景之後,我們應該如何解決呢?下麵來看看高手的回答。

高手:

對於懸掛問題,我認為只需要保證Cancel介面執行完以後,Try介面不允許在執行就可以了。

所以,我們可以在Try介面裡面,先判斷Cancel介面有沒有執行過,如果已經執行過,就不再執行。

是否執行過的這個判斷,可以在事務控製表裡面插入一條事務控制記錄來標記這個事務的回滾狀態。

然後在Try介面中只需要讀取這個狀態來判斷就行了。

總結

好了,今天的分享就到這裡結束了。

如果喜歡我的作品,記得點贊、收藏、關註!!!

file

版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!


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

-Advertisement-
Play Games
更多相關文章
  • JavaGUI-坦克大戰04 7.線程的應用03 7.3坦克大戰4.0版 7.3.4功能3:敵方坦克自由移動 功能3:讓敵人的坦克也可以自由隨機地上下左右移動 思路: 因為要求敵人的坦克自由移動,因此需要將敵人坦克當做線程使用,EnemyTank類實現Runnable介面 線程的run方法的具體操作 ...
  • JavaGUI-坦克大戰03-2 7.線程的應用02 7.3.坦克大戰4.0版 坦克大戰4.0版 增加功能: 功能1.讓敵人的坦克也能夠發射子彈(可以有多個子彈) 功能2.當我方坦克集中敵人坦克時,敵人的坦克就消失,如果能做出爆炸的效果更好 功能3.讓敵人的坦克也可以自由隨機地上下左右移動 功能4. ...
  • 1.什麼是模板層 模板層可以根據視圖中傳遞的字典數據動態生產相應的HTML頁面 2.模板層的配置 1.在項目下創建一個與同名文件夾平行的templates文件夾 2.在settings.py中的TEMPLATES配置項中 BACKEND:指定模板的引擎 DIRS:模板的搜索目錄(可以是一個或者多個) ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近在研究一個基於TP6的框架CRMEB,這裡分享下我的開發心得 首先要獲取原始項目文件 這裡是git地址 https://gitee.com/ZhongBangKeJi/CRMEB.git 項目環境的要求為Apache、MySQL、PH ...
  • 命令版 示例: 將main分支轉到master分支上 切到需要使用的分支 git checkout master 強制忽略歷史融合 git merge main --allow-unrelated-histories 3.提交融合衝突文件即可 ...
  • Django_ajax 1 簡介 AJAX(Asynchronous Javascript And XML)翻譯成中文就是“非同步Javascript和XML”。即使用Javascript語言與伺服器進行非同步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。 同步交互:客戶端發出一個請求後,需 ...
  • 作用域 作用域分為: 全局作用域 局部作用域 在函數內部的作用域叫做局部作用域,局部作用域中的變數叫做局部變數 非函數內部的作用域叫做全局作用域,全局作用域中的變數叫做全局變數 局部作用域可以使用全局變數,全局變數不能試用局部變數 變數的使用規則: 從內向外,找到後返回 函數作用域中命名全局變數gl ...
  • 我們上面使用swarm部署服務,單個服務還好,如果很多個服務怎麼來解決呢,這裡就用到了Docker Stack管理服務。 ​ 在上面我們學會瞭如何配置一個swarm集群,並且知道如何在swarm集群上部署應用,現在,我們開始瞭解Docker層級關係中的最高一個層級——stack。一個stack就是一 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...