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

主頁 > 知識庫 > 講解如何利用 Python完成 Saga 分布式事務

講解如何利用 Python完成 Saga 分布式事務

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

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

1、分布式事務

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

  • 基本業務可用性( Basic Availability )
  • 柔性狀態( Soft state )
  • 最終一致性( Eventual consistency )

另一方面,分布式事務也部分遵循 ACID 規范:

  • 原子性:嚴格遵循
  • 一致性:事務完成后的一致性嚴格遵循;事務中的一致性可適當放寬
  • 隔離性:并行事務間不可影響;事務中間結果可見性允許安全放寬
  • 持久性:嚴格遵循

2、SAGA

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

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

DTM 事務框架里,有 3 個角色,與經典的 XA 分布式事務一樣:

  • AP/應用程序,發起全局事務,定義全局事務包含哪些事務分支
  • RM/資源管理器,負責分支事務各項資源的管理
  • TM/事務管理器,負責協調全局事務的正確執行,包括 SAGA 正向 /逆向操作的執行

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

3、SAGA 實踐

對于我們要進行的銀行轉賬的例子,我們將在正向操作中,進行轉入轉出,在補償操作中,做相反的調整。

首先我們創建賬戶余額表:

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() 
); 


我們先編寫核心業務代碼,調整用戶的賬戶余額

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") 


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

@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"} 


到此各個子事務的處理函數已經 OK 了,然后是開啟 SAGA 事務,進行分支調用

# 這是 dtm 服務地址 
dtm = "http://localhost:8080/api/dtmsvr" 
# 這是業務微服務地址 
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 分布式事務編寫完成。

如果您想要完整運行一個成功的示例,那么參考這個例子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 

4、處理網絡異常

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

這類網絡異常的妥當處理,是分布式事務中的大難題,異常情況包括三類:重復請求、空補償、懸掛,都需要正確處理

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

我們把處理函數調整為:

@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)調用會使用子事務屏障技術,保證 busi_callback 回調函數僅被提交一次

您可以嘗試多次調用這個 TransIn 服務,僅有一次余額調整。

5、處理回滾

假如銀行將金額準備轉入用戶 2 時,發現用戶 2 的賬戶異常,返回失敗,會怎么樣?我們調整處理函數,讓轉入操作返回失敗

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


我們給出事務失敗交互的時序圖:

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

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

我們可以將返回錯誤的 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"} 


最后的結果余額依舊會是對的,原理可以參考:分布式事務最經典的七種解決方案的子事務屏障環節

6、小結

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

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

以上就是利用 Python 輕松完成一個 Saga 分布式事務的詳細內容,更多關于Python完成一個 Saga 分布式事務的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 帶你用Python實現Saga 分布式事務的方法
  • 詳解分布式系統中如何用python實現Paxos
  • Python搭建Spark分布式集群環境
  • python django框架中使用FastDFS分布式文件系統的安裝方法
  • Python多進程入門、分布式進程數據共享實例詳解
  • Python分布式進程中你會遇到的問題解析

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

巨人網絡通訊聲明:本文標題《講解如何利用 Python完成 Saga 分布式事務》,本文關鍵詞  講解,如何,利用,Python,完成,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《講解如何利用 Python完成 Saga 分布式事務》相關的同類信息!
  • 本頁收集關于講解如何利用 Python完成 Saga 分布式事務的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    在线亚洲一区观看| 久久久天堂av| 国产欧美一区二区三区鸳鸯浴| 亚洲品质自拍视频| 国模娜娜一区二区三区| 欧美偷拍一区二区| 国产精品毛片久久久久久久| 久久精品国产免费| 欧美在线啊v一区| 国产精品蜜臀在线观看| 国产一区二三区| 欧美一级精品大片| 亚洲成人免费av| 日本韩国一区二区三区| 中文字幕电影一区| 国产老肥熟一区二区三区| 欧美男人的天堂一二区| 亚洲国产另类av| 91免费看视频| 亚洲欧美另类小说| 色综合天天综合网天天看片| 国产精品二三区| 国产精品亚洲专一区二区三区| 日韩免费高清电影| 日韩电影一区二区三区四区| 欧美色窝79yyyycom| 亚洲精品ww久久久久久p站| 成人91在线观看| 国产精品色一区二区三区| 国产成人精品一区二| 久久久久久久久一| 国产麻豆视频一区| 国产欧美一区二区三区网站| 国产成人精品免费在线| 久久婷婷国产综合国色天香| 国产伦精品一区二区三区免费 | 亚洲综合小说图片| av亚洲精华国产精华| 中文字幕在线不卡一区二区三区| 丰满白嫩尤物一区二区| 欧美经典一区二区三区| 99久久er热在这里只有精品15| 中文字幕亚洲不卡| 欧美曰成人黄网| 五月天激情综合网| 精品国产成人在线影院 | 青青草原综合久久大伊人精品优势| 91精品国产丝袜白色高跟鞋| 午夜久久福利影院| 精品成a人在线观看| 成人激情开心网| 亚洲欧美国产三级| 欧美一级高清片| 国产成人精品免费| 亚洲中国最大av网站| 欧美一区三区四区| 成人福利视频网站| 一区二区三区国产豹纹内裤在线| 56国语精品自产拍在线观看| 国产剧情av麻豆香蕉精品| 国产精品视频一二三| 欧美日韩一区二区不卡| 狠狠色丁香久久婷婷综合丁香| 国产精品国产精品国产专区不片 | 日韩高清一区在线| 久久久久久久久久美女| 日本精品裸体写真集在线观看| 日韩av电影免费观看高清完整版| 国产日产欧美精品一区二区三区| 91美女在线观看| 国精品**一区二区三区在线蜜桃| 亚洲精品中文在线| 久久久另类综合| 精品污污网站免费看| 国产成人综合在线| 亚洲一区中文日韩| 中文欧美字幕免费| 欧美一级免费观看| 日本久久电影网| 国产成人在线视频播放| 五月激情综合网| 一区精品在线播放| 国产偷v国产偷v亚洲高清| 91精品国产综合久久久久久久久久| 国产精品一区二区在线播放 | 毛片av中文字幕一区二区| 亚洲欧美激情小说另类| 久久久蜜桃精品| 欧美成人三级在线| 5858s免费视频成人| 91久久国产综合久久| 不卡视频在线看| 国产精品一级黄| 久久se这里有精品| 免费观看一级欧美片| 亚洲国产美国国产综合一区二区| 国产精品久久一级| 国产日韩欧美高清| 久久精品综合网| 久久毛片高清国产| 久久日韩粉嫩一区二区三区| 欧美一级国产精品| 91麻豆精品91久久久久同性| 色哟哟国产精品| 色综合久久中文综合久久牛| 成人伦理片在线| 国产成人av电影在线| 国产成人午夜高潮毛片| 国产乱人伦偷精品视频免下载| 精品午夜一区二区三区在线观看| 日本vs亚洲vs韩国一区三区| 美女在线一区二区| 美国三级日本三级久久99| 麻豆91在线观看| 奇米影视7777精品一区二区| 蜜桃视频一区二区| 美女视频一区二区三区| 九色porny丨国产精品| 国产精品一区二区黑丝| 国产精品 日产精品 欧美精品| 国产成人精品www牛牛影视| 国产很黄免费观看久久| 国产盗摄精品一区二区三区在线 | 2020国产精品| 欧美激情一区二区在线| 成人欧美一区二区三区黑人麻豆| 综合在线观看色| 亚洲成人三级小说| 毛片一区二区三区| 国产精品一区二区男女羞羞无遮挡| 高清不卡一区二区在线| 色综合天天综合| 欧美精品色综合| 国产欧美综合在线观看第十页| 亚洲图片你懂的| 日韩不卡手机在线v区| 国产一区不卡视频| 91丨九色丨尤物| 欧美精品黑人性xxxx| 久久综合九色综合久久久精品综合| 日本一区二区在线不卡| 一区二区三区精密机械公司| 日本不卡一二三区黄网| 国产激情精品久久久第一区二区| 日本韩国一区二区| 日韩视频一区二区在线观看| 欧美高清在线精品一区| 午夜精品久久久久久久99水蜜桃| 狠狠v欧美v日韩v亚洲ⅴ| 99国内精品久久| 欧美xfplay| 亚洲图片自拍偷拍| 国产夫妻精品视频| 欧美视频在线观看一区二区| 久久嫩草精品久久久精品| 亚洲精品乱码久久久久久黑人 | 成人免费高清视频在线观看| 欧美午夜免费电影| 精品福利视频一区二区三区| 一区二区三区日韩在线观看| 国产成人在线免费观看| 91麻豆精品国产自产在线观看一区 | 国产精品乡下勾搭老头1| 欧洲亚洲国产日韩| 国产精品日产欧美久久久久| 免费观看成人av| 91福利区一区二区三区| 国产欧美一区二区三区在线看蜜臀 | 色综合咪咪久久| 国产女人aaa级久久久级| 蜜桃在线一区二区三区| 91黄色在线观看| 日韩理论片中文av| 成人一区二区三区中文字幕| 日韩一卡二卡三卡四卡| 中文字幕一区二区三| 精品一二三四在线| 日韩欧美在线综合网| 亚洲国产wwwccc36天堂| 色婷婷综合久久| 亚洲少妇屁股交4| 成人av一区二区三区| 久久精品一二三| 国产激情视频一区二区在线观看| 精品卡一卡二卡三卡四在线| 奇米精品一区二区三区在线观看 | 精品久久久久久亚洲综合网| 亚洲成人久久影院| 欧美另类z0zxhd电影| 一区二区三区不卡视频| 99视频一区二区| 中文字幕日韩一区| 成人99免费视频| 中文字幕日韩一区| 91网站最新网址| 亚洲精品日韩综合观看成人91| 99re8在线精品视频免费播放| 国产精品毛片a∨一区二区三区| 成人久久视频在线观看| 中文字幕不卡一区|