阿里巴巴开源分布式框架Seata TCC模式深入分析
2019 年 3 月,螞蟻金服加入分布式事務(wù) Seata 的社區(qū)共建中,并貢獻(xiàn)其 TCC 模式。本期是 SOFAChannel 第四期,主題:分布式事務(wù) Seata TCC 模式深度解析,本文根據(jù)覺(jué)生的直播整理。
大家晚上好,我是 Seata Committer 覺(jué)生,來(lái)自螞蟻金服數(shù)據(jù)中間件團(tuán)隊(duì)。今天的內(nèi)容主要分為以下四個(gè)部分:
Seata TCC 模式的原理解析;
從 TCC 的業(yè)務(wù)模型與并發(fā)控制分享如何設(shè)計(jì)一個(gè) TCC 接口,并且適配 TCC 模型;
如何控制異常;
性能優(yōu)化,使得 TCC 模式能夠滿(mǎn)足更高的業(yè)務(wù)需求。
1 Seata 的 TCC 模式
1.1 服務(wù)化拆
下面我們就進(jìn)入第一個(gè)主題,Seata 的 TCC 模式。螞蟻金服早期是單系統(tǒng)架構(gòu),所有業(yè)務(wù)服務(wù)幾乎都在少數(shù)幾個(gè)系統(tǒng)中。隨著業(yè)務(wù)的發(fā)展,業(yè)務(wù)越來(lái)越復(fù)雜,服務(wù)之間的耦合度也越來(lái)越高,故我們對(duì)系統(tǒng)進(jìn)行了重構(gòu),服務(wù)按照功能進(jìn)行解耦和垂直拆分。拆分之后所帶來(lái)的問(wèn)題就是一個(gè)業(yè)務(wù)活動(dòng)原來(lái)只需要調(diào)用一個(gè)服務(wù)就能完成,現(xiàn)在需要調(diào)用多個(gè)服務(wù)才能完成,而網(wǎng)絡(luò)、機(jī)器等不可靠,數(shù)據(jù)一致性的問(wèn)題很容易出現(xiàn),與可擴(kuò)展性、高可用容災(zāi)等要求并肩成為金融 IT 架構(gòu)支撐業(yè)務(wù)轉(zhuǎn)型升級(jí)的最大挑戰(zhàn)之一。
從圖中可以看到,從單系統(tǒng)到微服務(wù)轉(zhuǎn)變,其實(shí)是一個(gè)資源橫向擴(kuò)展的過(guò)程,資源的橫向擴(kuò)展是指當(dāng)單臺(tái)機(jī)器達(dá)到資源性能瓶頸,無(wú)法滿(mǎn)足業(yè)務(wù)增長(zhǎng)需求時(shí),就需要橫向擴(kuò)展資源,形成集群。通過(guò)橫向擴(kuò)展資源,提升非熱點(diǎn)數(shù)據(jù)的并發(fā)性能,這對(duì)于大體量的互聯(lián)網(wǎng)產(chǎn)品來(lái)說(shuō),是至關(guān)重要的。服務(wù)的拆分,也可以認(rèn)為是資源的橫向擴(kuò)展,只不過(guò)方向不同而已。
資源橫向擴(kuò)展可能沿著兩個(gè)方向發(fā)展,包括業(yè)務(wù)拆分和數(shù)據(jù)分片:
業(yè)務(wù)拆分。根據(jù)功能對(duì)數(shù)據(jù)進(jìn)行分組,并將不同的微服務(wù)分布在多個(gè)不同的數(shù)據(jù)庫(kù)上,這實(shí)際上就是 SOA 架構(gòu)下的服務(wù)化。業(yè)務(wù)拆分就是把業(yè)務(wù)邏輯從一個(gè)單系統(tǒng)拆分到多個(gè)微服務(wù)中。
數(shù)據(jù)分片。在微服務(wù)內(nèi)部將數(shù)據(jù)拆分到多個(gè)數(shù)據(jù)庫(kù)上,為橫向擴(kuò)展增加一個(gè)新的維度。數(shù)據(jù)分片就是把一個(gè)微服務(wù)下的單個(gè) DB 拆分成多個(gè) DB,具備一個(gè) Sharding 的功能。通過(guò)這樣的拆解,相當(dāng)于一種資源的橫向擴(kuò)展,從而使得整個(gè)架構(gòu)可以承載更高的吞吐。
橫向擴(kuò)展的兩種方法可以同時(shí)進(jìn)行運(yùn)用:交易、支付與賬務(wù)三個(gè)不同微服務(wù)可以存儲(chǔ)在不同的數(shù)據(jù)庫(kù)中。另外,每個(gè)微服務(wù)內(nèi)根據(jù)其業(yè)務(wù)量可以再拆分到多個(gè)數(shù)據(jù)庫(kù)中,各微服務(wù)可以相互獨(dú)立地進(jìn)行擴(kuò)展。
Seata 關(guān)注的就是微服務(wù)架構(gòu)下的數(shù)據(jù)一致性問(wèn)題,是一整套的分布式事務(wù)解決方案。Seata 框架包含兩種模式,一種是 AT 模式。AT 模式主要從數(shù)據(jù)分片的角度,關(guān)注多 DB 訪問(wèn)的數(shù)據(jù)一致性,當(dāng)然也包括多服務(wù)下的多 DB 數(shù)據(jù)訪問(wèn)一致性問(wèn)題。
另外一個(gè)就是 TCC 模式,TCC 模式主要關(guān)注業(yè)務(wù)拆分,在按照業(yè)務(wù)橫向擴(kuò)展資源時(shí),解決微服務(wù)間調(diào)用的一致性問(wèn)題,保證讀資源訪問(wèn)的事務(wù)屬性。
今天我們主要講的就是 TCC 模式。在講 TCC 之前1.2 AT 模式
對(duì)于 AT 模式,之前其他同學(xué)已經(jīng)分享過(guò)很多次,大家也應(yīng)該比較熟悉了。AT 模式下,把每個(gè)數(shù)據(jù)庫(kù)被當(dāng)做是一個(gè) Resource,Seata 里稱(chēng)為 DataSource Resource。業(yè)務(wù)通過(guò) JDBC 標(biāo)準(zhǔn)接口訪問(wèn)數(shù)據(jù)庫(kù)資源時(shí),Seata 框架會(huì)對(duì)所有請(qǐng)求進(jìn)行攔截,做一些操作。每個(gè)本地事務(wù)提交時(shí),Seata RM(Resource Manager,資源管理器) 都會(huì)向 TC(Transaction Coordinator,事務(wù)協(xié)調(diào)器) 注冊(cè)一個(gè)分支事務(wù)。當(dāng)請(qǐng)求鏈路調(diào)用完成后,發(fā)起方通知 TC 提交或回滾分布式事務(wù),進(jìn)入二階段調(diào)用流程。此時(shí),TC 會(huì)根據(jù)之前注冊(cè)的分支事務(wù)回調(diào)到對(duì)應(yīng)參與者去執(zhí)行對(duì)應(yīng)資源的第二階段。TC 是怎么找到分支事務(wù)與資源的對(duì)應(yīng)關(guān)系呢?每個(gè)資源都有一個(gè)全局唯一的資源 ID,并且在初始化時(shí)用該 ID 向 TC 注冊(cè)資源。在運(yùn)行時(shí),每個(gè)分支事務(wù)的注冊(cè)都會(huì)帶上其資源 ID。這樣 TC 就能在二階段調(diào)用時(shí)正確找到對(duì)應(yīng)的資源。
這就是我們的 AT 模式。簡(jiǎn)單總結(jié)一下,就是把每個(gè)數(shù)據(jù)庫(kù)當(dāng)做一個(gè) Resource,在本地事務(wù)提交時(shí)會(huì)去注冊(cè)一個(gè)分支事務(wù)。
1.3 TCC 模式
那么對(duì)應(yīng)到 TCC 模式里,也是一樣的,Seata 框架把每組 TCC 接口當(dāng)做一個(gè) Resource,稱(chēng)為 TCC Resource。這套 TCC 接口可以是 RPC,也以是服務(wù)內(nèi) JVM 調(diào)用。在業(yè)務(wù)啟動(dòng)時(shí),Seata 框架會(huì)自動(dòng)掃描識(shí)別到 TCC 接口的調(diào)用方和發(fā)布方。如果是 RPC 的話,就是 sofa:reference、sofa:service、dubbo:reference、dubbo:service 等。
掃描到 TCC 接口的調(diào)用方和發(fā)布方之后。如果是發(fā)布方,會(huì)在業(yè)務(wù)啟動(dòng)時(shí)向 TC 注冊(cè) TCC Resource,與 DataSource Resource 一樣,每個(gè)資源也會(huì)帶有一個(gè)資源 ID。
如果是調(diào)用方,Seata 框架會(huì)給調(diào)用方加上切面,與 AT 模式一樣,在運(yùn)行時(shí),該切面會(huì)攔截所有對(duì) TCC 接口的調(diào)用。每調(diào)用一次 Try 接口,切面會(huì)先向 TC 注冊(cè)一個(gè)分支事務(wù),然后才去執(zhí)行原來(lái)的 RPC 調(diào)用。當(dāng)請(qǐng)求鏈路調(diào)用完成后,TC 通過(guò)分支事務(wù)的資源 ID 回調(diào)到正確的參與者去執(zhí)行對(duì)應(yīng) TCC 資源的 Confirm 或 Cancel 方法。
在講完了整個(gè)框架模型以后,大家可能會(huì)問(wèn) TCC 三個(gè)接口怎么實(shí)現(xiàn)。因?yàn)榭蚣鼙旧砗芎?jiǎn)單,主要是掃描 TCC 接口,注冊(cè)資源,攔截接口調(diào)用,注冊(cè)分支事務(wù),最后回調(diào)二階段接口。最核心的實(shí)際上是 TCC 接口的實(shí)現(xiàn)邏輯。下面我將根據(jù)螞蟻金服內(nèi)部多年的實(shí)踐來(lái)為大家分析怎么實(shí)現(xiàn)一個(gè)完備的 TCC 接口。,我們先回顧一下 AT 模式,這樣有助于我們理解后面的 TCC 模式。
2 TCC 業(yè)務(wù)模式與并發(fā)控制
2.1 TCC 設(shè)計(jì)原則
總結(jié)
以上是生活随笔為你收集整理的阿里巴巴开源分布式框架Seata TCC模式深入分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot 45个注解
- 下一篇: 说说你对binlog、redo log和