分散式事務之解決方案(最大努力通知)

来源:https://www.cnblogs.com/haizai/archive/2019/12/02/11973668.html
-Advertisement-
Play Games

6.分散式事務解決方案之最大努力通知 6.1. 什麼是最大努力通知 最大努力通知也是一種解決分散式事務的方案,下邊是一個是充值的例子:交互流程 :1、賬戶系統調用充值系統介面2、充值系統完成支付處理向賬戶系統發起充值結果通知若通知失敗,則充值系統按策略進行重覆通知3、賬戶系統接收到充值結果通知修改充 ...


 

6.分散式事務解決方案之最大努力通知

6.1. 什麼是最大努力通知

最大努力通知也是一種解決分散式事務的方案,下邊是一個是充值的例子:
在這裡插入圖片描述
交互流程 :
1、賬戶系統調用充值系統介面
2、充值系統完成支付處理向賬戶系統發起充值結果通知
若通知失敗,則充值系統按策略進行重覆通知
3、賬戶系統接收到充值結果通知修改充值狀態
4、賬戶系統未接收到通知會主動調用充值系統的介面查詢充值結果
通過上邊的例子我們總結最大努力通知方案的目標 :
目標 :發起通知方通過一定的機制最大努力將業務處理結果通知到接收方。
具體包括 :
1、有一定的消息重覆通知機制。
因為接收通知方可能沒有接收到通知,此時要有一定的機制對消息重覆通知。
2、消息校對機制。
如果盡最大努力也沒有通知到接收方,或者接收方消費消息後要再次消費,此時可由接收方主動向通知方查詢消息信息來滿足需求。
最大努力通知與可靠消息一致性有什麼不同?
1、解決方案思想不同
可靠消息一致性,發起通知方需要保證將消息發出去,並且將消息發到接收通知方,消息的可靠性關鍵由發起通知方來保證。
最大努力通知,發起通知方盡最大的努力將業務處理結果通知為接收通知方,但是可能消息接收不到,此時需要接收通知方主動調用發起通知方的介面查詢業務處理結果,通知的可靠性關鍵在接收通知方。
2、兩者的業務應用場景不同
可靠消息一致性關註的是交易過程的事務一致,以非同步的方式完成交易。
最大努力通知關註的是交易後的通知事務,即將交易結果可靠的通知出去。
3、技術解決方向不同
可靠消息一致性要解決消息從發出到接收的一致性,即消息發出並且被接收到。
最大努力通知無法保證消息從發出到接收的一致性,只提供消息接收的可靠性機制。可靠機制是,最大努力的將消息通知給接收方,當消息無法被接收方接收時,由接收方主動查詢消費(業務處理結果)。

6.2. 解決方案

通過對最大努力通知的理解,採用MQ的ack機制就可以實現最大努力通知。
方案1 :
在這裡插入圖片描述
本方案是利用MQ的ack機制由MQ向接收通知方發送通知,流程如下 :
1、發起通知方將通知發給MQ。
使用普通消息機制將通知發給MQ。
註意 :如果消息沒有發出去可由接收通知方主動請求發起通知方查詢業務執行結果。
2、接收通知方監聽MQ。
3、接收通知方接收消息,業務處理完成回應ack。
4、接收通知方若沒有回應ack則MQ會重覆通知。
MQ會按照間隔1min、5min、10min、30min、1h、2h、5h、10h的方式,逐步拉大通知間隔(如果MQ採用rocketMq,在broker中可進行配置),直到達到通知要求的時間視窗上限。
5、接收通知方可通過消息校對介面來校對消息的一致性。
方案2 :
本方案也是利用MQ的ack機制,與方案1不同的是應用程式向接收通知方發送通知,如下圖 :
在這裡插入圖片描述
交互流程如下 :
1、發起通知方將通知發給MQ。
使用可靠消息一致方案中的事務消息保證本地事務與消息的原子性,最終將通知先發給MQ。
2、通知程式監聽MQ,接收MQ的消息。
方案1中接收通知方直接監聽MQ,方案2中由通知程式監聽MQ。
通知程式若沒有回應ack則MQ會重覆通知。
3、通知程式通過互聯網介面協議(如http、webservice)調用接收通知方案介面,完成通知。
通知程式調用接收通知方案介面成功就表示通知成功,即消費MQ消息成功,MQ將不再向通知程式投遞通知消息。
4、接收通知方可通過消息校對介面來校對消息的一致性。
方案1和方案2的不同點 :
1、方案1中接收通知方與MQ介面,即接收通知方案監聽MQ,此方案主要應用與內部應用之間的通知。
2、方案2中由通知程式與MQ介面,通知程式監聽MQ,收到MQ的消息後由通知程式通過互聯網介面協議調用接收通知方。此方案主要應用於外部應用之間的通知,例如支付寶、微信的支付結果通知。

6.3.RocketMQ實現最大努力通知型事務

6.3.1.業務說明

本實例通過RocketMq中間件實現最大努力通知型分散式事務,模擬充值過程。
本案例有賬戶系統和充值系統兩個微服務,其中賬戶系統的資料庫是bank1資料庫,其中有張三賬戶。充值系統的資料庫使用bank1_pay資料庫,記錄了賬戶的充值記錄。
業務流程如下圖 :
在這裡插入圖片描述
交互流程如下 :
1、用戶請求充值系統進行充值。
2、充值系統完成充值將充值結果發給MQ。
3、賬戶系統監聽MQ,接收充值結果通知,如果接收不到消息,MQ會重覆發送通知。接收到充值結果通知賬戶系統增加充值金額。
4、賬戶系統也可以主動查詢充值系統的充值結果查詢介面,增加金額。

6.3.2.程式組成部分

本示常式序組成部分如下 :
資料庫:MySQL-5.7.25
包括bank1和bank1_pay兩個資料庫。
JDK:64位 jdk1.8.0_201
rocketmq 服務端:RocketMQ-4.5.0
rocketmq 客戶端:RocketMQ-Spring-Boot-starter.2.0.2-RELEASE 微服務框架:spring-boot-2.1.3、spring-cloud-Greenwich.RELEASE
微服務及資料庫的關係 :
dtx/dtx-notifymsg-demo/dtx-notifymsg-demo-bank1 銀行1,操作張三賬戶, 連接資料庫bank1 dtx/dtx-notifymsg-demo/dtx-notifymsg-demo-pay 銀行2,操作充值記錄,連接資料庫bank1_pay
在這裡插入圖片描述
交互流程如下 :
1、用戶請求充值系統進行充值。
2、充值系統完成充值將充值結果發給MQ。
3、賬戶系統監聽MQ,接收充值結果通知,如果接收不到消息,MQ會重覆發送通知。接收到充值結果通知賬戶系統增加充值金額。
4、賬戶系統也可以主動查詢充值系統的充值結果查詢介面,增加金額。

6.3.3.創建資料庫

創建bank1庫,並導入以下表結構和數據(包含張三賬戶)

CREATE DATABASE `bank1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
DROP TABLE IF EXISTS `account_info`; CREATE TABLE `account_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '戶 主姓名',
`account_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '銀行卡號',
`account_password` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT
'帳戶密碼',
`account_balance` double NULL DEFAULT NULL COMMENT '帳戶餘額', PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
INSERT INTO `account_info` VALUES (2, '張三的賬戶', '1', '', 10000);
DROP TABLE IF EXISTS `de_duplication`; CREATE TABLE `de_duplication` (
`tx_no` varchar(64) COLLATE utf8_bin NOT NULL, `create_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`tx_no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

創建bank1_pay庫,並導入以下表結構:

 CREATE DATABASE `bank1_pay` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; CREATE TABLE `account_pay` (
`id` varchar(64) COLLATE utf8_bin NOT NULL,
`account_no` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '賬號', `pay_amount` double NULL DEFAULT NULL COMMENT '充值餘額',
`result` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '充值結果:success,fail',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

6.3.4.啟動RocketMQ

rocketMQ啟動方式與RocketMQ實現可靠消息最終一致性事務中完全一致

6.3.5.discover-server

discover-server是服務註冊中心,測試工程將自己註冊至discover-server。

6.3.6.工程概述

(1)父工程maven依賴說明
在dtx父工程中指定了SpringBoot和SpringCloud版本

<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring‐boot‐dependencies</artifactId>      					   <version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency> 
		   

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

-Advertisement-
Play Games
更多相關文章
  • JS是一門什麼樣的語言? 是一門解釋性的語言 是一門腳本語言 是一門弱類型語言,聲明變數都用var 是一門基於對象的語言 是一門動態類型的語言: 1. 代碼(變數)只有執行到這個位置的時候,才知道這個變數中到底存儲的是什麼,如果是對象,就有對象的屬性和方法,如果是變數就是變數的作用 2. 對象沒有什 ...
  • 1. 簡書類 實現效果 html代碼 <div class="container"> <form action="" class="parent"> <input type="text" class="search" placeholder="搜索"> <input type="button" na ...
  • javascript 報錯 string.split is not a function ...
  • 自定義html元素滑鼠右鍵菜單 實現思路 在觸發contextmenu事件時,取消預設行為(也就是阻止瀏覽器顯示自帶的菜單),獲取右鍵事件對象,來確定滑鼠的點擊位置,作為顯示菜單的left和top值 編碼實現 <!DOCTYPE html> <html> <head> <meta charset=" ...
  • 功能:在文本框中輸入待辦事項按下回車後,事項會出現在未完成列表中;點擊未完成事項前邊的覆選框後,該事項會出現在已完成列表中,反之亦然;點擊刪除按鈕會刪除該事項。待辦事項的數據是保存到本地存儲的(localStorage),就算關閉頁面再打開,數據還是存在的(前提是要用相同瀏覽器)。 ToDoList ...
  • 基於Taro多端實踐TaroPop:自定義模態框|dialog對話框|msg消息框|Toast提示 taro自定義彈出框支持編譯到多端H5/小程式/ReactNative,還可以自定義彈窗類型/彈窗樣式、多按鈕事件/樣式、自動關閉、遮罩層、彈窗顯示位置及自定義內容模板 用法 ▍在相應頁面引入組件 i ...
  • 創建對象三種方式: 調用系統的構造函數創建對象 自定義構造函數創建對象(結合第一種和需求通過工廠模式創建對象) 字面量的方式創建對象 第一種:調用系統的構造函數創建對象 //小蘇舉例子: //實例化對象 var obj = new Object(); //對象有特征 屬性;和 行為 方法 //添加屬 ...
  • 功能描述: 當滾動條滑到某個位置時,顯示電梯導航; 當用戶滾動滾動條時,讓電梯導航的選中狀態和當前滾動到的區域保持一致; 當用戶點擊電梯導航時,滾動條滾動到被點擊導航對應的區域 準備工作: 首先將jQuery文件以及你自己的js文件引入你的html里,jq文件要放在上面 <script src="j ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...