日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员修神之路--那些分布式事务解决方案

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员修神之路--那些分布式事务解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

親愛的,關注我吧

為了保證分布式環境下數據強一致性,需要引入分布式事務,而分布式事務由于網絡環境的不確定性,天生就很難實現。具體可以見上一篇。

[分布式下,我想要強一致性]

為了保證分布式事務的正確性,目前互聯網領域有幾種流行的解決方案,但是大部分都沒有像XA事務一樣形成標準的工業規范。但是這些方案在某些特定的行業或者業務場景下卻得到了越來越多的開發者的認可。

避免分布式事務

此方案提倡盡量避免分布式事務,不僅僅是因為分布式事務的難度,更是因為實現分布式事務需要更多的高級人才。如果一個操作設計到事務操作,而這些事務操作可以利用單機事務來解決,推薦首選單機事務。

當然,是否可以避免分布式事務還要看具體業務,在微服務盛行的當下,更多的還要看領域的劃分標準,如果兩個微服務可以合并成一個微服務,一定程度上在領域劃分標準接受范圍之內,可以考慮利用合并的方式來避免分布式服務。

舉一個很簡單的栗子:一個用戶基本信息服務和用戶資產服務(比如:用戶經驗值),當用戶修改資料的時候給用戶加貢獻值這個業務場景下,因為涉及到用戶資料修改和加貢獻值兩個不同服務的操作,這個時候就可以考慮將兩個服務合并為一個服務,用單機的數據庫事務來代替分布式事務。

在可以避免分布式事務的情況下,首選避免分布式事務

二階段提交

二階段(2PC)提交方案是基于X/OpenDTP標準規范的,最大的缺點在于它在第一階段需要鎖定資源,會大大降低系統的性能,大型的互聯網應用并不推薦這種方案,那種對性能不敏感的企業級應用可以嘗試使用。

在asp.net中,微軟已經提供了分布式事務的管理類型:TransactionScope,它依賴DTC(Distributed Transaction Coordinator)服務完成事務一致性。當它包裹的代碼中如果設計到多個不同物理位置的數據庫的時候,它會自動升級為分布式事務,使用起來非常方便。

using?(TransactionScope?ts?=?new?TransactionScope()){數據庫A操作();數據庫B操作();數據庫C操作();ts.Complete();}

TCC

TCC本質上是一種編程模型,它提倡的是補償操作,所以一般情況下它會有重試機制,它約定參與事務的每個業務方都需要提供三個接口,具體情況請查看上一篇文章。由于TCC的接口重試特性,所以提供的提交和取消接口必須實現冪等性。

2PC主要是針對數據庫操作,而TCC主要是針對業務層面來進行操作,這在性能上比2PC要高很多,例如一個提交訂單的場景,商品服務需要扣除庫存,而訂單系統需要創建訂單,代碼類似以下,請不要糾結命名和參數:

using?(TransactionScope?ts?=?new?TransactionScope()){數據庫A操作();//訂單服務 public?interface?IOrderService {//創建一個不可見的訂單,返回訂單號Task<string>?CreateOrder();//根據訂單號提交訂單,使訂單可見Task<int>?SubmitOrder(string?orderNo);//根據訂單號取消訂單Task<int>?CancleOrder(string?orderNo); }? //商品服務 public?interface?IProductService {//根據商品id,鎖定庫存,返回鎖定的idTask<int>?LockProductStock(int?productId);//根據鎖定的庫存id,提交事務,扣除商品庫存Task<int>?SubmitLockStock(int?lockId);//根據鎖定的庫存id,取消事務,商品庫存回滾Task<int>?CancleLockStock(int?lockId); }//訂單服務 public?interface?IOrderService {//創建一個不可見的訂單,返回訂單號Task<string>?CreateOrder();//根據訂單號提交訂單,使訂單可見Task<int>?SubmitOrder(string?orderNo);//根據訂單號取消訂單Task<int>?CancleOrder(string?orderNo); }? //商品服務 public?interface?IProductService {//根據商品id,鎖定庫存,返回鎖定的idTask<int>?LockProductStock(int?productId);//根據鎖定的庫存id,提交事務,扣除商品庫存Task<int>?SubmitLockStock(int?lockId);//根據鎖定的庫存id,取消事務,商品庫存回滾Task<int>?CancleLockStock(int?lockId); }???數據庫B操作();數據庫C操作();ts.Complete();}

其實TCC實現過程中,還有很多細節。比如:當提交事務階段,有一個節點由于網絡原因或者down機提交失敗,該怎么辦呢?這個時候我們要在本地引入本地消息機制,或者叫做業務活動管理器,把每個業務參與分布式事務的每個操作都記錄下來,當某個過程的某個節點操作失敗,無論是自動發起重試,還是手動重試都可以達到最終數據的一致性。

基于消息的事務

基于消息的分布式事務實現的是最終一致性,它是基于BASE理論的一個解決方案,最早由eBay提出并實施,它采用了消息隊列來輔助實現事務控制流程,核心思想是將需要分布式處理的任務通過MQ分發給每個業務去異步執行,如果任務失敗,則可以發起系統自動重試或者人工重試的糾正流程。

還是以上邊的創建訂單和扣減庫存為栗子:

1. 首先調用訂單服務的創建訂單接口創建訂單,如果創建成功,則發送需要扣減庫存的消息(也可以看做創建訂單成功的消息)到MQ。

2. 商品服務監聽扣減庫存消息隊列,如果收到扣減庫存消息,則執行扣減庫存操作,如果操作成功,則回復MQ刪除該消息。如果沒有操作成功,則準備接收同樣消息的下次投遞。

這個流程看似很完美,其實有很多漏洞。

- 創建訂單是第一步操作,可以看做是單純的單機操作,這個并沒有問題,但是接著發送MQ消息這一步需要和創建訂單保證事務性,因為會發生創建訂單成功,發送mq消息失敗的情況。如果不能用技術手段來保證這兩步的事務,也可以采用引入本地消息的方案,在創建訂單的時候,用訂單數據庫來保證訂單創建成功和創建訂單消息表的一致性。然后發送mq成功之后,修改訂單消息表的狀態為發送成功,如果發送mq消息失敗,則啟用另外一個線程或者進程進行重試。

- 商品服務扣減庫存類似,扣減庫存這個操作和回復mq消息這兩個操作也可以利用本地消息表的方式來解決一致性問題。當收到扣減庫存消息的時候,扣減庫存和添加消息成功處理記錄可以利用數據庫的事務來保證一致性,如果回復消息隊列ack失敗,就算是有重復消息,也可以根據本地的消費消息表來過濾重復消息

基于消息的分布式解決方案還有一個劣勢,如果一個事務的業務參與方非常多,消息的發送可能會非常復雜,需要非常謹慎的設計。比如以上訂單的栗子,現在引入了優惠券服務,在訂單創建成功,需要同時扣減庫存和優惠券,如果優惠券扣減失敗,需要同時回滾庫存和取消訂單,這也只是三個業務參與方,如果是四個,五個呢?當然這在業務中也許并不常見。

基于消息的分布式事務解決方案,由于引入了重試機制,也需要接口在實現的時候支持冪等性。但從開發的角度,這種方案要比tcc以及2pc都要有優勢,把每個系統之間的耦合度降到了最低,而且每個業務方的實現技術可以非常靈活,無論是采用java還是c#活著是golang都無所謂。

當然市面上基于消息的分布式解決方案各式各樣,但總體來說都屬于最終一致性方案。如果引入消息通道MQ的不穩定性,那還需要在各個業務方引入查詢機制來確保消息的ack機制。舉個栗子:如果商品服務已經正常扣減庫存,由于mq問題,始終不能正常ack。這個時候訂單服務是否會主動查詢商品服務是否已經正常扣庫存?這個時候整個架構可能就非現在這個樣子了,這個要是扯起來又是一篇文章了

總結

以上是生活随笔為你收集整理的程序员修神之路--那些分布式事务解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色婷婷综合久久久久中文一区二区 | 国产超碰人人模人人爽人人添 | 欧美xxxx在线 | 色图一区 | 国产一级免费视频 | 天天插插| 色翁荡息又大又硬又粗又爽 | 日日夜夜精品视频免费 | 成人在线播放视频 | 96国产视频| 免费在线观看中文字幕 | 男女黄色又爽大片 | 久久青草热 | 色吧在线视频 | 国产剧情在线观看 | 欧美成人精品一区二区男人看 | 日韩激情电影在线 | 国产精品熟女一区二区不卡 | 丰满护士巨好爽好大乳 | 色婷婷色婷婷 | 最新极品jizzhd欧美 | 国产一区二区三区免费观看视频 | 久久国产视频精品 | 日批视频免费在线观看 | 国产精品一区二区性色av | 入禽太深免费视频 | 大黄毛片 | 日韩二区三区四区 | 天天色成人网 | 国产精品网站在线 | 少妇人妻真实偷人精品视频 | 日本韩国毛片 | 免费av网站大全 | 精品伦精品一区二区三区视频密桃 | √天堂8资源中文在线 | 国产欧美一区二区三区视频 | 天天久 | 黄色小视频在线免费观看 | 黄色在线网| 成人av一级 | 欧美精品一区二区三区久久 | 国产成人免费看一级大黄 | 亚洲啪视频 | 亚洲精品亚洲人成人网 | 国产又粗又深又猛又爽又在线观看 | 国产在线精品观看 | 另类小说色综合 | 青青草国产在线视频 | 狠狠干夜夜骑 | 国产精品久久久久国产a级 国产一区二区在线播放 | 99精品网 | 国产强伦人妻毛片 | 东方成人av| 欧美你懂的 | 波多野结衣办公室33分钟 | 天天av天天操 | 特种兵之深入敌后高清全集免费观看 | 亚洲三区在线观看无套内射 | mm131国产精品 | 国产伦精品一区二区三区视频1 | av毛片网站 | 污漫在线观看 | 人妻少妇偷人精品久久性色 | 中文字幕在线视频免费 | 国产美女福利视频 | 免费一级大片 | 免费的av网站 | 日韩一卡二卡三卡 | 中文字幕免费在线看线人动作大片 | 羞羞涩涩视频 | 久久精品视频免费观看 | 精品无码久久久久国产 | 国产精品99久久久久久动医院 | 天天干天天要 | 久草手机在线视频 | 日韩欧美中文字幕在线播放 | 人人澡人人爱 | 少妇又色又爽又黄的视频 | 性欧美17一18内谢 | 久久网亚洲 | 国产精品亚洲一区二区三区在线观看 | 亚洲自拍天堂 | 黄色av毛片 | 影音先锋一区 | 动漫精品一区一码二码三码四码 | 青青草原国产在线观看 | 婷婷在线网 | 一区在线不卡 | 天天做天天躁天天躁 | 国产黑人 | 黄页网站视频在线观看 | 大胸美女啪啪 | 99热热热热 | 日本黄色小视频 | av少妇| www久久久 | 在线观看黄 | 黑人黄色片 | 无遮挡边吃摸边吃奶边做 |