婷婷综合国产,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
    亚洲综合视频在线| 久久久久久久久伊人| 日韩视频一区二区三区在线播放| 国产精品久久久久9999吃药| 国产在线精品一区二区| 欧美丰满少妇xxxxx高潮对白| 亚洲同性同志一二三专区| 国内精品在线播放| 视频一区视频二区中文字幕| 99精品视频在线观看| 久久久久久亚洲综合影院红桃| 亚洲午夜精品网| 91丝袜美女网| 国产精品国产三级国产aⅴ入口| 久久99精品久久久久久动态图| 日本精品视频一区二区三区| 久久综合久久综合久久综合| 国模一区二区三区白浆| 日韩你懂的在线观看| 欧美三区在线观看| 一区二区三区高清在线| 99精品久久只有精品| 国产精品免费网站在线观看| 成人高清在线视频| 国产精品全国免费观看高清| 国产高清精品网站| 日本一区二区三区国色天香| 丁香婷婷综合五月| 国产精品免费av| 99精品热视频| 亚洲精品网站在线观看| 欧美性生活大片视频| 丝袜诱惑制服诱惑色一区在线观看| 88在线观看91蜜桃国自产| 日韩av电影免费观看高清完整版 | 亚洲小说欧美激情另类| 欧美少妇bbb| 日日夜夜一区二区| 日韩欧美精品在线| 国产成人8x视频一区二区 | 欧美亚洲综合一区| 日韩精品欧美成人高清一区二区| 日韩一区二区三区四区| 精品一区二区久久久| 中文字幕精品综合| 在线视频一区二区三| 午夜国产不卡在线观看视频| 在线成人免费观看| 国产精品12区| 一级特黄大欧美久久久| 日韩一区二区三区电影在线观看 | 欧洲av一区二区嗯嗯嗯啊| 婷婷丁香久久五月婷婷| 26uuu国产日韩综合| kk眼镜猥琐国模调教系列一区二区| 亚洲人成在线观看一区二区| 欧美高清激情brazzers| 国产一区二区在线影院| 亚洲六月丁香色婷婷综合久久| 制服.丝袜.亚洲.另类.中文| 高清久久久久久| 亚洲不卡av一区二区三区| 欧美精品一区二区不卡| 91色.com| 精品一区二区三区免费播放| 亚洲日穴在线视频| 欧美成人官网二区| 色婷婷综合久色| 国产一区二区美女| 亚洲自拍与偷拍| 国产日韩欧美亚洲| 欧美电影在哪看比较好| 99精品久久免费看蜜臀剧情介绍| 美国十次了思思久久精品导航| 欧美国产视频在线| 91精选在线观看| 色香色香欲天天天影视综合网| 国产又粗又猛又爽又黄91精品| 亚洲综合在线免费观看| 久久久国产午夜精品 | 91视频一区二区三区| 激情欧美一区二区三区在线观看| 亚洲永久免费视频| 中文字幕精品在线不卡| 精品剧情在线观看| 欧美色爱综合网| 不卡在线视频中文字幕| 久久疯狂做爰流白浆xx| 亚洲国产精品人人做人人爽| 中文字幕在线观看不卡| 久久久久久久综合| 欧美va在线播放| 欧美电影影音先锋| 欧美视频一区二区三区在线观看| 不卡视频在线观看| 盗摄精品av一区二区三区| 国产在线日韩欧美| 蜜桃视频在线一区| 亚洲午夜影视影院在线观看| 亚洲成在线观看| 亚洲一区二三区| 91免费观看在线| 波多野结衣中文字幕一区 | 精品精品国产高清一毛片一天堂| 欧美挠脚心视频网站| 色婷婷精品大在线视频 | 国产成人精品一区二| 国产乱人伦偷精品视频不卡| 久久成人久久鬼色| 麻豆国产欧美一区二区三区| 日本不卡视频在线观看| 蜜臀a∨国产成人精品| 日韩国产欧美一区二区三区| 亚洲成av人片一区二区梦乃| 天天操天天色综合| 午夜精品123| 蜜桃av一区二区在线观看| 免费在线一区观看| 激情五月婷婷综合| 国产美女精品在线| 国产精品18久久久久久久久 | 一区二区三区日本| 亚洲成人福利片| 舔着乳尖日韩一区| 看国产成人h片视频| 国产主播一区二区| www.欧美日韩| 欧美午夜精品久久久| 欧美三区在线视频| 日韩欧美中文字幕公布| 久久久久久久精| 国产精品久久久久久久裸模| 亚洲日本在线视频观看| 亚洲国产精品久久久久秋霞影院| 天天综合网 天天综合色| 精品无码三级在线观看视频| 成人av高清在线| 欧美日韩在线三级| 欧美精品一区二区不卡| 亚洲色图第一区| 日韩成人精品在线观看| 国产精品自拍在线| 99久久久精品免费观看国产蜜| 在线观看视频91| 日韩欧美国产精品一区| 国产女主播视频一区二区| 亚洲另类在线视频| 麻豆高清免费国产一区| 豆国产96在线|亚洲| 在线一区二区三区四区| 欧美变态口味重另类| 成人免费一区二区三区视频| 天堂一区二区在线| 成人少妇影院yyyy| 51久久夜色精品国产麻豆| 国产精品国产三级国产三级人妇 | 欧美—级在线免费片| 亚洲国产精品综合小说图片区| 国产一区二区看久久| 91久久线看在观草草青青| 日韩精品一区二区三区视频| 日韩美女视频19| 黄色日韩网站视频| 色婷婷久久99综合精品jk白丝| 精品久久久久99| 亚洲国产成人91porn| 国v精品久久久网| 91精品欧美综合在线观看最新| 日本一区二区电影| 日本免费新一区视频| 99久久免费国产| 久久青草国产手机看片福利盒子 | 精品欧美乱码久久久久久1区2区| 亚洲欧美中日韩| 国产成人在线视频播放| 91精品国产一区二区三区蜜臀| 国产精品乱码久久久久久| 日本sm残虐另类| 欧美亚洲动漫另类| 中文字幕欧美三区| 日本美女视频一区二区| 91成人免费在线视频| 亚洲色图.com| 国产不卡在线一区| 欧美成人官网二区| 青青草成人在线观看| 欧美日韩一级视频| 亚洲国产精品久久一线不卡| 日本乱人伦aⅴ精品| 亚洲日本va在线观看| 97se亚洲国产综合在线| 国产日韩精品一区二区三区| 国产精品一区二区免费不卡| 久久影院视频免费| 韩国在线一区二区| 久久久精品黄色| 成人av电影在线| 亚洲色图色小说| 欧美在线观看视频一区二区三区| 夜夜嗨av一区二区三区网页|