本篇文章1878字,讀完約5分鐘

阿里云國際站經(jīng)銷商,主營阿里云,騰訊云,華為云,亞馬遜aws,谷歌云gcp,微軟云az,免費(fèi)開戶,代充值優(yōu)惠大,聯(lián)系客服飛機(jī)@jkkddd


分布式多步驟事務(wù)

本文介紹了如何使用Serverless工作流提供長流程分布式事務(wù)保證,幫助用戶聚焦于自身業(yè)務(wù)邏輯。
簡介
復(fù)雜的業(yè)務(wù)場景例如電商網(wǎng)站、酒店、航班預(yù)定這類涉及訂單管理的應(yīng)用通常要訪問多個(gè)遠(yuǎn)程服務(wù),并且對操作事務(wù)性語義(即所有步驟全部成功或全部失敗,不存在中間狀態(tài))有較高要求。在流量較小、數(shù)據(jù)存儲(chǔ)集中的應(yīng)用中,事務(wù)性可以通過關(guān)系型數(shù)據(jù)庫提供的ACID特性滿足。然而在大流量場景下,為了高可用和可擴(kuò)展性,業(yè)務(wù)通常選擇向微服務(wù)的分布式架構(gòu)方向演進(jìn)。在這樣的架構(gòu)中提供多步驟事務(wù)性的保證通常需要引入隊(duì)列和數(shù)據(jù)庫來持久化消息以及展現(xiàn)流程狀態(tài),這類系統(tǒng)的開發(fā)和運(yùn)維會(huì)給業(yè)務(wù)方帶來額外的成本和負(fù)擔(dān)。而使用Serverless工作流提供長流程分布式事務(wù)保證會(huì)幫您解決這些問題。
場景描述
假設(shè)某應(yīng)用為其用戶提供預(yù)定火車票、航班和酒店的功能,要求三個(gè)步驟保證事務(wù)性。該功能需要三個(gè)遠(yuǎn)程調(diào)用實(shí)現(xiàn)(例如預(yù)定火車票需要調(diào)用12306接口),如果三個(gè)調(diào)用都成功則該訂單成功。然而實(shí)際上任何一個(gè)遠(yuǎn)程調(diào)用都有可能會(huì)失敗,因此該應(yīng)用需要對不同的失敗場景做出相應(yīng)的補(bǔ)償邏輯,回退已完成操作。如下圖所示:
如果預(yù)定火車票(BuyTrainTicket)成功,而預(yù)定航班(ReserveFlight)失敗,則需要取消已經(jīng)購買的火車票(CancelTrainTicket),并告知您訂單失敗。
如果預(yù)定火車票(BuyTrainTicket)和預(yù)定航班(ReserveFlight)均成功,但是預(yù)訂酒店(ReserveHotel)失敗,則需要取消已經(jīng)預(yù)定的航班(CancelFlight)和火車票(CancelTrainTicket),并告知您訂單失敗。
Serverless工作流實(shí)現(xiàn)
下文的示例將FC函數(shù)編排成一個(gè)Serverless工作流流程從而實(shí)現(xiàn)了一個(gè)可靠的多步驟長流程,該示例分為3步:
創(chuàng)建FC函數(shù)
創(chuàng)建流程
執(zhí)行并查看結(jié)果
步驟1:創(chuàng)建FC函數(shù)
本步驟是模擬場景案例中提示的三個(gè)操作即預(yù)訂火車票、預(yù)訂航班及預(yù)定酒店。
創(chuàng)建下面的Python2.7的函數(shù),關(guān)于創(chuàng)建的詳細(xì)步驟,請參見FC文檔,建議命名:
Service: fnf-demo
Function: Operation
Operation函數(shù)模擬各操作(例如預(yù)定航班、預(yù)定酒店)的實(shí)現(xiàn),根據(jù)輸入決定該操作執(zhí)行結(jié)果(成功或失?。?/span>
步驟2:創(chuàng)建流程
使用Serverless工作流控制臺(tái)創(chuàng)建下面的流程。
配置流程RAM角色
步驟3:執(zhí)行并查看結(jié)果
在控制臺(tái)上對創(chuàng)建好的流程(Flow)開始一個(gè)新的執(zhí)行(Execution)。StartExecution API要求傳入JSON格式的輸入。下面的JSON對象可以模擬每個(gè)步驟的成功或失?。ɡ?reserve_hotel_result":"fail"代表模擬預(yù)定酒店這步失?。?。StartExecution是一個(gè)異步API,調(diào)用結(jié)束后,Serverless工作流會(huì)返回一個(gè)執(zhí)行名字用來查詢流程執(zhí)行狀態(tài)。
流程執(zhí)行開始后,在Serverless工作流控制臺(tái)可以查看流程的執(zhí)行過程和結(jié)果。從步驟信息頁簽?zāi)梢钥吹?,由?reserve_hotel_result":"fail"和ReserveHotel函數(shù)調(diào)用失敗,Serverless工作流按照流程定義,依次取消航班(CancelFlight)、取消火車票(CancelTrainTicket)。Serverless工作流每個(gè)步驟轉(zhuǎn)換有持久化的保證,因此網(wǎng)絡(luò)中斷或進(jìn)程崩潰等失敗場景不會(huì)影響流程事務(wù)性的保證。
流程執(zhí)行會(huì)產(chǎn)生執(zhí)行歷史事件(event),這些事件可以通過控制臺(tái)、SDK或CLI調(diào)用GetExecutionHistory API查詢。
錯(cuò)誤處理和重試
上面示例中的預(yù)定航班、預(yù)定酒店等遠(yuǎn)程調(diào)用都有可能受到網(wǎng)絡(luò)或服務(wù)錯(cuò)誤等原因?qū)е抡{(diào)用失敗,而增加對瞬時(shí)錯(cuò)誤的重試可以提高訂單流程成功率。Serverless工作流在任務(wù)(Task)類型的步驟(Step)自帶重試功能,如預(yù)定酒店這個(gè)步驟用下面的寫法可以實(shí)現(xiàn)對FC.Unknown類型的錯(cuò)誤指數(shù)退避。假設(shè)重試到達(dá)最大次數(shù)后ReserveHotel都無法成功,按照該步驟中catch的定義,ReserveHotel函數(shù)拋出的FC.Unknown錯(cuò)誤會(huì)被捕獲并將跳轉(zhuǎn)到CancelFlight執(zhí)行定義好的補(bǔ)償邏輯。

標(biāo)題:阿里云賬號(hào)注冊,阿里云服務(wù)器購買,24h自助充值

地址:http://www.pengfei-china.com/kfxw/64300.html