分散式事物之綜合案例分析

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

7.1系統介紹 7.1.1. P2P介紹 P2P 金融又叫P2P信貸。其中P2P是 peer-to-peer 或 person-to-person 的簡寫,意思是:個人對個人。P2P金融指個人與個人間的小額借貸交易,一般需要藉助電子商務專業網路平臺幫助借貸雙方確立借貸關係並完成相關交易手續。借款者可 ...


7.1系統介紹

7.1.1. P2P介紹

P2P 金融又叫P2P信貸。其中P2P是 peer-to-peer 或 person-to-person 的簡寫,意思是:個人對個人。P2P金融指個人與個人間的小額借貸交易,一般需要藉助電子商務專業網路平臺幫助借貸雙方確立借貸關係並完成相關交易手續。借款者可自行發佈借款信息,包括金額、利息、還款方式和時間,實現自助式借款;投資者根據借款人發佈的信息,自行決定出借金額,實現自助式借貸。目前,國家對P2P行業的監控與規範性控制越來越嚴格,出台了很多政策來對其專項整治。並主張採用“銀行存管模式”來規避P2P平臺挪用借投人資金的風險,通過銀行開發的“銀行存管系統”管理投資者的資金,每位P2P平臺用戶在銀行的存管系統內都會有一個獨立賬號,平臺來管理交易,做到資金和交易分開,讓P2P平臺不能接觸到資金,就可以一定程度避免資金被挪用的風險。
什麼是銀行存管模式?
銀行存管模式涉及到2套賬戶體系,P2P平臺和銀行各一套賬戶體系。投資人在P2P平臺註冊後,會同時跳轉到銀行再開一個電子賬戶,2個賬戶間有一一對應的關係。當投資人投資時,資金進入的是平臺在銀行為投資人開設的二級賬戶中,每一筆交易,是由銀行在投資人與借款人間的交易劃轉,P2P平臺僅能看到信息的流動。
在這裡插入圖片描述

7.1.2.總體業務流程

在這裡插入圖片描述

術語描述
銀行存管模式 這種模式下,涉及到2套賬戶系統,P2P平臺和銀行各一套賬戶體系。投資人在P2P平臺註冊後,會同時跳轉到銀行再開一個電子賬戶,2個賬戶間有一一對應的關係。當投資人投資時,資金進入的是平臺在銀行為投資人開設的二級賬戶中,每一筆交易,由銀行在投資人與借款人間的交易劃轉,P2P平臺僅能看到信息的流動。
標的 P2P業內,習慣把借款人發佈的投資項目稱為“標的”。
發標 借款人在P2P平臺中創建併發布“標的”過程。
投標 投資人在認可相關借款人之後進行額一種借貸行為,對自己中意的借款標的進行投資操作,一個借款標可由單個投資人或多個投資人承接。
滿標 單筆借款標籌集齊所有借款資金即為滿標,計息時間是以標滿當日開始計息,投資人較多的平臺多數會當天滿標。

7.1.2.模塊說明

統一賬戶服務
用戶的登錄賬戶、密碼、角色、許可權、資源等系統級信息的管理,不包含用戶業務信息。
用戶中心
提供用戶業務信息的管理,如會員信息、實名認證信息、綁定銀行卡信息等,“用戶中心”的每個用戶與“統一賬戶服務”中的賬號關聯。
交易中心
提供發標、投標等業務。
還款服務
提供還款計劃的生成、執行、記錄與歸檔。
銀行存管系統(模擬)
模擬銀行存管系統,進行資金的存管,劃轉。

7.2.註冊賬號案例分析

7.2.1.業務流程

採用用戶、賬號分離設計(這樣設計的好處是,當用戶的業務信息發生變化時,不會影響的認證、授權等系統機制),因此需要保證用戶信息與賬號信息的一致性。
在這裡插入圖片描述

7.2.2.解決方案分析

針對註冊業務,如果用戶與賬號信息不一致,則會導致嚴重問題,因此該業務對一致性要求較為嚴格,即當用戶服務和賬號服務任意一方出現問題都需要回滾事務。
根據上述需求進行解決方案分析 :
1、採用可靠消息一致性方案
可靠消息一致性要求只要消息發出,事務參與者接到消息就要將事務執行成功,不存在回滾的要求,所以不適用。
2、採用最大努力通知方案
最大努力通知表示發起通知執行完本地事務後將結果通知給事務參與者,即使事務參與者執行業務處理失敗發起通知方也不會回滾事務,所以不適用。
3、採用Seata實現2PC
在用戶中心發起全局事務,統一賬戶服務為事務參與者,用戶中心和統一賬戶服務只要有一方出現問題則全局事務回滾,符合要求。
實現方法如下 :
1、用戶中心添加用戶信息,開啟全局事務
2、統一賬號服務添加賬號信息,作為事務參與者
3、其中一方執行失敗Seata對SQL進行逆操作刪除用戶信息和賬號信息,實現回滾。
4、採用Hmily實現TCC
TCC也可以實現用戶中心和統一賬戶服務只要有一方出現問題則全局事務回滾,符合要求。
實現方法如下 :
1、用戶中心
try :添加用戶,狀態為不可用
confirm :更新用戶賬戶為可用
cancel :刪除用戶
2、統一賬號服務
try :添加賬號,狀態不可用
confirm :更新賬號狀態為可用
cancel :刪除賬號

7.3.存管開戶

7.3.1.業務流程

根據政策要求,P2P業務必須讓銀行存管資金,用戶的資金在銀行存管系統的賬戶中,而不在P2P平臺中,因此用戶要在銀行存管系統開戶。
在這裡插入圖片描述
用戶向用戶中心提交開戶資源,用戶中心生成開戶請求號並重定向至銀行存管系統開戶頁面。用戶設置存管密碼並確認開戶後,銀行存管立即返回“請求已受理”。在某一個時刻,銀行存管系統處理完該開戶請求後,將調用回調地址通知處理結果,若通知失敗,則按一定策略重試通知。同時,銀行存管系統應提供開戶結果查詢的介面,供用戶中心校對結果。

7.3.2.解決方案分析

P2P平臺的用戶中心與銀行存管系統之間屬於跨系統交互,銀行存管系統屬於外部系統,用戶中心無法干預銀行存管系統,所以用戶中心只能在收到銀行存管系統的業務處理結果通知後積極處理,開戶後的使用情況完全由用戶中心開控制。
根據上述需求進行解決方案分析 :
1、採用Seata實現2PC
需要侵入銀行存管系統的資料庫,由於它的外部系統,所以不適用。
2、採用Hmily實現TCC
TCC侵入性更強,所以不適用。
3、基於MQ的可靠消息一致性
如果讓銀行存管系統監聽MQ則不合適,因為它的外部系統。如果銀行存管系統將消息發給MQ用戶中心監聽MQ是可以的,但是由於相對銀行存管系統來說用戶中心屬於外部系統,銀行存管系統是不會讓外部系統直接監聽自己的MQ的,基於MQ的通信協議也不方便外部系統間的交互。所以本方案不適合。
4、最大努力通知方案
銀行存管系統內部使用MQ,銀行存管系統處理完業務後將處理結果發給MQ,由銀行存管的通知程式專門發送通知,並且採用互聯網協議通知給第三方系統(用戶中心)。
下圖中發起通知即銀行存管系統 :
在這裡插入圖片描述

7.4.滿標審核

7.4.1.業務流程

在借款人標的募集夠所有的資金後,P2P運營管理員審批該標的,觸發放款,並開啟還款流程。
在這裡插入圖片描述
管理員對某標的滿標審批通過,交易中心修改標的狀態為“還款中”,同時要通知還款服務生成還款計劃。

7.4.2.解決方案分析

生成還款計劃是一個執行時長較長的業務,不建議阻塞主業務流程,此業務對一致性要求較低。
根據上述需求進行解決方案分析 :
1、採用Seata實現2PC
Seata在事務執行過程會進行資料庫資源鎖定,由於事務執行時長較長會將資源鎖定較長時間,所以不適用。
2、採用Hmily實現TCC
本需求對業務一致性要求較低,因為生成還款計劃的時長較長,所以不要求交易中心修改標的狀態為“還款中”就立即生成還款計劃,所以本方案不適用。
3、基於MQ的可靠消息一致性
滿標批通過後由交易中心修改標的狀態為“還款中”並且向還款服務發送消息,還款服務接收到消息開始生成還款計劃,基於MQ的可靠消息一致性方案適用此場景。
4、最大努力通知方案
滿標審批通過後交易中心向還款服務發送通知要求生成還款計劃,還款服務並且對外提供還款計劃生成結果校對介面供其他服務查詢,最大努力通知也適用本場景。

分散式事務對比分析 :

各種方案的優缺點 :
2PC最大的詬病是阻塞協議。RM在執行分支事務後需要等待TM的決定,此時服務會阻塞並鎖定資源。由於其阻塞機制和最差時間複雜度高,因此,這種設計不能適應隨著事務涉及的服務數量增加而擴展的需要,很難用於併發較高以及子事務生命周期較長(long-running
transactions)的分散式服務中。

如果拿TCC事務的處理流程與2PC兩階段提交做比較,2PC通常都是在跨庫的DB層面,而TCC則在應用層面的處理,需要通過業務邏輯來實現。這種分散式事務的實現方式的優勢在於,可以讓應用自己定義數據操作的粒度,使得降低鎖衝突,提高吞吐量成為可能。
而不足之處則在於對應用的侵入性非常強,業務邏輯的每個分支都需要實現try、confirm、cancel三個操作。此外,其實現難度也比較大,需要按照網路狀態、系統故障等不同的失敗原因實現不同的回滾策略。典型的使用場景 :滿,登錄送優惠捲等。

可靠消息最終一致性事務適合執行周期長且實時性要求不高的場景。引入消息機制後,同步的事務操作變為基於消息執行的非同步操作,避免來分散式事務中的同步阻塞操作的影響,並實現來兩個服務的解耦。典型的使用場景 :註冊送積分,登錄送優惠捲等。

最大努力通知是分散式事務中要求最低的一種,適用於一些最終一致性時間敏感度低的業務;允許發起通知方處理業務失敗,在接收通知發收到通知後積極進行失敗處理,無論發起通知方如何處理結果都不會影響到接收通知方的後續處理;發起通知方需提供查詢執行情況介面,用於接收通知方校對結果。典型的使用場景 :銀行通知、支付結果通知等。
在這裡插入圖片描述
總結 :
在條件允許的情況下,我們儘可能選擇本地事務單數據源,因為它減少來網路交互帶來的性能損耗,且避免來數據若一致性帶來的種種問題。若某系統頻繁不合理的使用分散式事務,應首先從整體設計角度觀察服務的拆分是否合理,是否高內聚低耦合?是否粒度太小?分散式事務一直是業界難題,因為網路的不確定性,而且我們習慣於拿分散式事務與單機事務ACID做對比。
無論是資料庫曾的XA、還是應用層TCC、可靠消息、最大努力通知等方案,都沒有完美解決分散式事務問題,他們不過是各自在性能、一致性、可用性等方面做取捨,尋求某些場景偏好下的權衡。


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

-Advertisement-
Play Games
更多相關文章
  • To the right is the tweet embed that will be used as the practical example. Some of the elements would look better with a different layout. The last c ...
  • 場景 搭建ElementUI前端項目後提示: Access to XMLHttpRequest at **from origin ** has been blocked by CORS policy 這是因為在請求後臺SpringBoot介面時出現了跨域請求問題。 本來打算是搭建好前端項目後再js中 ...
  • js內置對象 1. JavaScript中的對象分為3中;自定義對象/內置對象,瀏覽器對象 2. Math對象 Math.PI; 圓周率 Math.floor();向下取整 Math.ceil();向上取整 Math.max();最大值 Math.min();最小值 Math.randon();隨機 ...
  • ``` Practice 用戶名: 密 碼: 性 別:男 女 保密 愛 好:運功 旅游 閱讀 攝影 地 址: 上傳頭像: 個人簡介: 不少於10字 ``` ![](https://img2018.cnblogs.com/blog/821307/201912/821307-20191208193829... ...
  • 1、加上placeholder,可以為空 2、放在label標簽中 ...
  • 在項目中會用到模糊查詢,之前在首頁是用的element的tree顯示的目錄,會有用到搜索,但tree裡邊會有自帶的模糊查詢,用filter-node-method方法使用 但上次的項目中 又涉及到不試用插件的模糊搜索,使用原生來搜索,其實網上有很多種,但個人覺得正則還是好用,不區別大小寫很方便,之前 ...
  • 現在矢量切片越來越普及,對於地圖渲染能更輕更快。ArcGIS JS 4.13可以實現載入第三方矢量切片,以下為代碼示例,最下方是我之前切的建築物數據。 當切片大小在1M左右,載入效果還是可以。不過跟mapbox gl相比還是有些遜色,mapbox gl可以載入6M大小的切片,但ArcGIS JS 4 ...
  • import org.apache.commons.lang.StringUtils; import org.junit.Test; public class Test{ //總結:isNotBlank()一定要裡面有東西 null,""," ",返回的都是false @Test public vo ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...