婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 帶你用Python實現(xiàn)Saga 分布式事務(wù)的方法

帶你用Python實現(xiàn)Saga 分布式事務(wù)的方法

熱門標簽:徐州天音防封電銷卡 電話機器人適用業(yè)務(wù) 湛江電銷防封卡 佛山防封外呼系統(tǒng)收費 鄭州智能外呼系統(tǒng)運營商 南昌辦理400電話怎么安裝 獲客智能電銷機器人 不錯的400電話辦理 哈爾濱外呼系統(tǒng)代理商

銀行跨行轉(zhuǎn)賬業(yè)務(wù)是一個典型分布式事務(wù)場景,假設(shè) A 需要跨行轉(zhuǎn)賬給 B,那么就涉及兩個銀行的數(shù)據(jù),無法通過一個數(shù)據(jù)庫的本地事務(wù)保證轉(zhuǎn)賬的 ACID,只能夠通過分布式事務(wù)來解決。

分布式事務(wù)

分布式事務(wù)在分布式環(huán)境下,為了滿足可用性、性能與降級服務(wù)的需要,降低一致性與隔離性的要求,一方面遵循 BASE 理論:

  • 基本業(yè)務(wù)可用性( Basic Availability )
  • 柔性狀態(tài)( Soft state )
  • 最終一致性( Eventual consistency )
  • 另一方面,分布式事務(wù)也部分遵循 ACID 規(guī)范:
  • 原子性:嚴格遵循
  • 一致性:事務(wù)完成后的一致性嚴格遵循;事務(wù)中的一致性可適當(dāng)放寬
  • 隔離性:并行事務(wù)間不可影響;事務(wù)中間結(jié)果可見性允許安全放寬
  • 持久性:嚴格遵循

SAGA

Saga 是這一篇數(shù)據(jù)庫論文SAGAS提到的一個分布式事務(wù)方案。其核心思想是將長事務(wù)拆分為多個本地短事務(wù),由 Saga 事務(wù)協(xié)調(diào)器協(xié)調(diào),如果各個本地事務(wù)成功完成那就正常完成,如果某個步驟失敗,則根據(jù)相反順序一次調(diào)用補償操作。

目前可用于 SAGA 的開源框架,主要為 Java 語言,其中以 seata 為代表。我們的例子采用 go 語言,使用的分布式事務(wù)框架為https://github.com/yedf/dtm,它對分布式事務(wù)的支持非常優(yōu)雅。下面來詳細講解 SAGA 的組成:

DTM 事務(wù)框架里,有 3 個角色,與經(jīng)典的 XA 分布式事務(wù)一樣:

  • AP/應(yīng)用程序,發(fā)起全局事務(wù),定義全局事務(wù)包含哪些事務(wù)分支
  • RM/資源管理器,負責(zé)分支事務(wù)各項資源的管理
  • TM/事務(wù)管理器,負責(zé)協(xié)調(diào)全局事務(wù)的正確執(zhí)行,包括 SAGA 正向 /逆向操作的執(zhí)行

下面看一個成功完成的 SAGA 時序圖,就很容易理解 SAGA 分布式事務(wù):

SAGA實踐

對于我們要進行的銀行轉(zhuǎn)賬的例子,我們將在正向操作中,進行轉(zhuǎn)入轉(zhuǎn)出,在補償操作中,做相反的調(diào)整。

首先我們創(chuàng)建賬戶余額表:

CREATE TABLE dtm_busi.`user_account` ( 
  `id` int(11) AUTO_INCREMENT PRIMARY KEY, 
  `user_id` int(11) not NULL UNIQUE , 
  `balance` decimal(10,2) NOT NULL DEFAULT '0.00', 
  `create_time` datetime DEFAULT now(), 
  `update_time` datetime DEFAULT now() 
); 

我們先編寫核心業(yè)務(wù)代碼,調(diào)整用戶的賬戶余額

def saga_adjust_balance(cursor, uid, amount): 
  affected = utils.sqlexec(cursor, "update dtm_busi.user_account set balance=balance+%d where user_id=%d and balance >= -%d" %(amount, uid, amount)) 
  if affected == 0: 
    raise Exception("update error, balance not enough") 

下面我們來編寫具體的正向操作 /補償操作的處理函數(shù)

@app.post("/api/TransOutSaga") 
def trans_out_saga(): 
  saga_adjust_balance(c, out_uid, -30) 
  return {"dtm_result": "SUCCESS"} 
 
@app.post("/api/TransOutCompensate") 
def trans_out_compensate(): 
  saga_adjust_balance(c, out_uid, 30) 
  return {"dtm_result": "SUCCESS"} 
 
@app.post("/api/TransInSaga") 
def trans_in_saga(): 
  saga_adjust_balance(c, in_uid, 30) 
  return {"dtm_result": "SUCCESS"} 
 
@app.post("/api/TransInCompensate") 
def trans_in_compensate(): 
  saga_adjust_balance(c, in_uid, -30) 
  return {"dtm_result": "SUCCESS"} 

到此各個子事務(wù)的處理函數(shù)已經(jīng) OK 了,然后是開啟 SAGA 事務(wù),進行分支調(diào)用

# 這是 dtm 服務(wù)地址 
dtm = "http://localhost:8080/api/dtmsvr" 
# 這是業(yè)務(wù)微服務(wù)地址 
svc = "http://localhost:5000/api" 
 
    req = {"amount": 30} 
    s = saga.Saga(dtm, utils.gen_gid(dtm)) 
    s.add(req, svc + "/TransOutSaga", svc + "/TransOutCompensate") 
    s.add(req, svc + "/TransInSaga", svc + "/TransInCompensate") 
    s.submit() 

至此,一個完整的 SAGA 分布式事務(wù)編寫完成。

如果您想要完整運行一個成功的示例,那么參考這個例子yedf/dtmcli-py-sample,將它運行起來非常簡單

# 部署啟動 dtm 
# 需要 docker 版本 18 以上 
git clone https://github.com/yedf/dtm 
cd dtm 
docker-compose up 
 
# 另起一個命令行 
git clone https://github.com/yedf/dtmcli-py-sample 
cd dtmcli-py-sample 
pip3 install flask dtmcli requests 
flask run 
 
# 另起一個命令行 
curl localhost:5000/api/fireSaga 

處理網(wǎng)絡(luò)異常

假設(shè)提交給 dtm 的事務(wù)中,調(diào)用轉(zhuǎn)入操作時,出現(xiàn)短暫的故障怎么辦?按照 SAGA 事務(wù)的協(xié)議,dtm 會重試未完成的操作,這時我們要如何處理?故障有可能是轉(zhuǎn)入操作完成后出網(wǎng)絡(luò)故障,也有可能是轉(zhuǎn)入操作完成中出現(xiàn)機器宕機。如何處理才能夠保障賬戶余額的調(diào)整是正確無問題的?

這類網(wǎng)絡(luò)異常的妥當(dāng)處理,是分布式事務(wù)中的大難題,異常情況包括三類:重復(fù)請求、空補償、懸掛,都需要正確處理

DTM 提供了子事務(wù)屏障功能,保證上述異常情況下的業(yè)務(wù)邏輯,只會有一次正確順序下的成功提交。(子事務(wù)屏障詳情參考分布式事務(wù)最經(jīng)典的七種解決方案的子事務(wù)屏障環(huán)節(jié))

我們把處理函數(shù)調(diào)整為:

@app.post("/api/TransOutSaga") 
def trans_out_saga(): 
  with barrier.AutoCursor(conn_new()) as cursor: 
    def busi_callback(c): 
      saga_adjust_balance(c, out_uid, -30) 
    barrier_from_req(request).call(cursor, busi_callback) 
  return {"dtm_result": "SUCCESS"} 

這里的 barrier_from_req(request).call(cursor, busi_callback)調(diào)用會使用子事務(wù)屏障技術(shù),保證 busi_callback 回調(diào)函數(shù)僅被提交一次

您可以嘗試多次調(diào)用這個 TransIn 服務(wù),僅有一次余額調(diào)整。

處理回滾

假如銀行將金額準備轉(zhuǎn)入用戶 2 時,發(fā)現(xiàn)用戶 2 的賬戶異常,返回失敗,會怎么樣?我們調(diào)整處理函數(shù),讓轉(zhuǎn)入操作返回失敗

@app.post("/api/TransInSaga") 
def trans_in_saga(): 
  return {"dtm_result": "FAILURE"} 

我們給出事務(wù)失敗交互的時序圖

這里有一點,TransIn 的正向操作什么都沒有做,就返回了失敗,此時調(diào)用 TransIn 的補償操作,會不會導(dǎo)致反向調(diào)整出錯了呢?

不用擔(dān)心,前面的子事務(wù)屏障技術(shù),能夠保證 TransIn 的錯誤如果發(fā)生在提交之前,則補償為空操作;TransIn 的錯誤如果發(fā)生在提交之后,則補償操作會將數(shù)據(jù)提交一次。

您可以將返回錯誤的 TransIn 改成:

@app.post("/api/TransInSaga") 
def trans_in_saga(): 
  with barrier.AutoCursor(conn_new()) as cursor: 
    def busi_callback(c): 
      saga_adjust_balance(c, in_uid, 30) 
    barrier_from_req(request).call(cursor, busi_callback) 
  return {"dtm_result": "FAILURE"} 

最后的結(jié)果余額依舊會是對的,原理可以參考:分布式事務(wù)最經(jīng)典的七種解決方案的子事務(wù)屏障環(huán)節(jié)

小結(jié)

在這篇文章里,我們介紹了 SAGA 的理論知識,也通過一個例子,完整給出了編寫一個 SAGA 事務(wù)的過程,涵蓋了正常成功完成,異常情況,以及成功回滾的情況。相信讀者通過這邊文章,對 SAGA 已經(jīng)有了深入的理解。

文中使用的 dtm 是新開源的 Golang 分布式事務(wù)管理框架,功能強大,支持 TCC 、SAGA 、XA 、事務(wù)消息等事務(wù)模式,支持 Go 、python 、PHP 、node 、csharp 等語言的。同時提供了非常簡單易用的接口。

閱讀完此篇干貨,歡迎大家訪問項目https://github.com/yedf/dtm,給顆星星支持!

到此這篇關(guān)于帶你用Python實現(xiàn)Saga 分布式事務(wù)的問題的文章就介紹到這了,更多相關(guān)Python Saga 分布式事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解分布式系統(tǒng)中如何用python實現(xiàn)Paxos
  • Python搭建Spark分布式集群環(huán)境
  • python django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法
  • Python多進程入門、分布式進程數(shù)據(jù)共享實例詳解
  • Python分布式進程中你會遇到的問題解析
  • 講解如何利用 Python完成 Saga 分布式事務(wù)

標簽:蕪湖 懷化 紹興 吉安 廣西 蘭州 呂梁 安康

巨人網(wǎng)絡(luò)通訊聲明:本文標題《帶你用Python實現(xiàn)Saga 分布式事務(wù)的方法》,本文關(guān)鍵詞  帶,你用,Python,實現(xiàn),Saga,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《帶你用Python實現(xiàn)Saga 分布式事務(wù)的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于帶你用Python實現(xiàn)Saga 分布式事務(wù)的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色94色欧美sute亚洲13| 精品盗摄一区二区三区| 色哦色哦哦色天天综合| 亚洲欧洲日韩女同| 在线播放国产精品二区一二区四区| 色综合色综合色综合 | jizzjizzjizz欧美| 视频在线在亚洲| 国产欧美精品国产国产专区| 在线观看国产日韩| 中文字幕在线不卡| 欧美一级夜夜爽| jiyouzz国产精品久久| 免播放器亚洲一区| 国产日韩高清在线| 在线电影一区二区三区| 亚洲乱码精品一二三四区日韩在线| 国产91精品在线观看| 亚洲蜜臀av乱码久久精品| 亚洲国产日韩一级| 免费观看在线色综合| 亚洲欧美区自拍先锋| 国产婷婷色一区二区三区在线| 欧美猛男男办公室激情| 91久久人澡人人添人人爽欧美| 久久99九九99精品| 五月激情综合色| 久久综合狠狠综合久久综合88 | 国产婷婷一区二区| 日韩女优制服丝袜电影| 欧美日韩精品高清| 欧美精品一级二级三级| 欧美一区三区四区| 337p日本欧洲亚洲大胆精品| 久久精品欧美日韩| 国产精品色婷婷| 亚洲色图.com| 精品一区二区三区香蕉蜜桃 | 国内精品伊人久久久久av影院 | 人人精品人人爱| 色先锋久久av资源部| 91在线丨porny丨国产| 理论片日本一区| 老司机精品视频一区二区三区| 日本亚洲免费观看| 国产精品一区专区| 婷婷一区二区三区| 国产一区二区三区四| 成人小视频在线| 日韩亚洲欧美一区二区三区| 国产日韩欧美不卡在线| 日韩久久一区二区| 青青草原综合久久大伊人精品优势| 亚洲视频综合在线| 成人在线综合网站| 91精品国产综合久久久久久漫画 | 日韩和的一区二区| aaa亚洲精品一二三区| 久久综合九色综合欧美98| 亚洲国产精品久久一线不卡| 国产成人精品影视| 久久在线观看免费| 国产一区二区导航在线播放| 欧美性色欧美a在线播放| 中文字幕一区二区三区不卡| 激情欧美一区二区三区在线观看| 亚洲风情在线资源站| 在线观看欧美精品| 亚洲国产欧美在线| 欧美日韩色一区| 同产精品九九九| 日韩亚洲欧美在线观看| 亚洲精品伦理在线| 欧美伊人精品成人久久综合97| 欧美高清在线一区| 黑人巨大精品欧美黑白配亚洲| 日韩三级免费观看| 国产精品影视网| 欧美精彩视频一区二区三区| 国产成人在线免费观看| 欧美国产在线观看| 欧美日韩精品一区二区天天拍小说 | 亚洲精品成人悠悠色影视| 欧美一级在线免费| 日韩片之四级片| 欧美色精品在线视频| 在线欧美日韩国产| 在线不卡a资源高清| 欧美性猛交xxxx乱大交退制版| 91在线视频观看| 欧美亚洲免费在线一区| 欧美军同video69gay| 制服丝袜亚洲色图| 精品国产91亚洲一区二区三区婷婷| 欧美精品一区二区蜜臀亚洲| 韩国视频一区二区| 国产精品久久久久久久裸模| 国产一区激情在线| 亚洲精品免费一二三区| 在线一区二区三区四区五区| 极品少妇xxxx精品少妇| 亚洲欧美日韩小说| 欧美在线免费观看亚洲| 国产老女人精品毛片久久| 亚洲国产美国国产综合一区二区| 91黄色激情网站| 性感美女久久精品| 国产婷婷一区二区| 欧美亚洲国产bt| 一区二区三区在线观看国产| 国产成人在线网站| 国产精品久久免费看| 91精品国产欧美一区二区| 国产精品影视在线| 国产99精品国产| 日韩一区二区影院| 精品免费视频一区二区| 精品av综合导航| 日韩精品高清不卡| 91蝌蚪porny| 日韩免费高清av| 亚洲国产日日夜夜| 国产精品主播直播| 欧美日韩大陆在线| 日韩综合一区二区| 日本韩国一区二区| 亚洲激情成人在线| 国产精品77777| 欧美精品 国产精品| 一区免费观看视频| 国产精品亚洲成人| 久久久综合精品| 日本欧美在线看| 盗摄精品av一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 中文字幕免费一区| 99精品黄色片免费大全| 国产亚洲精品bt天堂精选| 一区二区三区**美女毛片| 国产精品99久久久久久有的能看| 91精品国产美女浴室洗澡无遮挡| 奇米综合一区二区三区精品视频 | 日韩综合小视频| 久久午夜电影网| 国产一区二区伦理| 中文字幕免费观看一区| 91免费精品国自产拍在线不卡| 亚洲成av人影院在线观看网| 欧美一级一级性生活免费录像| av午夜精品一区二区三区| 中文成人av在线| 色综合久久久久| 一区二区三区在线观看国产| 欧美一区二区三区四区在线观看| 成人一区在线观看| 久久激情综合网| 国产精品久久毛片| 欧美视频一区在线| 成人午夜av在线| 成人性生交大片免费看中文网站| 天涯成人国产亚洲精品一区av| 精品欧美一区二区久久| 9色porny自拍视频一区二区| 久久精品国产**网站演员| 亚洲一区二区精品视频| 一区二区三区国产| 亚洲v精品v日韩v欧美v专区| 欧美激情综合五月色丁香| 在线不卡欧美精品一区二区三区| 成人性生交大片免费看视频在线| 秋霞影院一区二区| 国产美女主播视频一区| 日本欧美韩国一区三区| 国产精品高潮久久久久无| 综合网在线视频| 日韩精品乱码免费| 黄页视频在线91| 狠狠色综合日日| 成人一区二区在线观看| 在线观看区一区二| 精品视频一区二区不卡| 欧美成人一区二区三区在线观看| 3d动漫精品啪啪一区二区竹菊| 91国产视频在线观看| 在线观看日韩精品| 精品国产乱码久久久久久夜甘婷婷| 中文字幕一区二区三区四区| 亚洲精品免费在线播放| 婷婷丁香激情综合| 国产不卡在线播放| 91精品办公室少妇高潮对白| 色综合天天综合网天天看片| 欧美日韩成人一区二区| 欧美挠脚心视频网站| 国产亚洲美州欧州综合国| 亚洲精品国产无天堂网2021| 日韩精品成人一区二区三区| 秋霞电影一区二区| 国产精品白丝jk黑袜喷水| 欧美一级欧美三级在线观看|