精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文理解分布式事務(wù)的解決方案

開(kāi)發(fā) 前端 分布式
隨著企業(yè)應(yīng)用的規(guī)模越來(lái)越大,企業(yè)會(huì)進(jìn)一步進(jìn)行服務(wù)化改造,以滿足業(yè)務(wù)增長(zhǎng)的需求;當(dāng)前微服務(wù)架構(gòu)越來(lái)越流行,跨服務(wù)的事務(wù)場(chǎng)景也會(huì)越來(lái)越多。

 [[407680]]

單體數(shù)據(jù)庫(kù)不涉及網(wǎng)絡(luò)交互,所以在多表之間實(shí)現(xiàn)事務(wù)是比較簡(jiǎn)單的,這種事務(wù)稱(chēng)之為本地事務(wù)。

但是單體數(shù)據(jù)庫(kù)的性能達(dá)到瓶頸的時(shí)候,就需要分庫(kù),就會(huì)出現(xiàn)跨庫(kù)(數(shù)據(jù)庫(kù)實(shí)例)的事務(wù)需求;隨著企業(yè)應(yīng)用的規(guī)模越來(lái)越大,企業(yè)會(huì)進(jìn)一步進(jìn)行服務(wù)化改造,以滿足業(yè)務(wù)增長(zhǎng)的需求;當(dāng)前微服務(wù)架構(gòu)越來(lái)越流行,跨服務(wù)的事務(wù)場(chǎng)景也會(huì)越來(lái)越多。

這些都屬于分布式事務(wù)。分布式事務(wù)是指是指事務(wù)的發(fā)起者、參與者、數(shù)據(jù)資源服務(wù)器以及事務(wù)管理器分別位于分布式系統(tǒng)的不同節(jié)點(diǎn)之上。

概括起來(lái),分布式事務(wù)有三種場(chǎng)景:

  1. 跨數(shù)據(jù)庫(kù)分布式事務(wù)

  2. 跨服務(wù)分布式事務(wù)

  3. 混合式分布式事務(wù)

本文將介紹分布式事務(wù)常見(jiàn)的解決方案:

  1. 2PC

  2. 3PC

  3. TCC

  4. Saga事務(wù)

  5. 基于本地消息表機(jī)制

  6. 基于事務(wù)消息機(jī)制

  7. 最大努力通知機(jī)制

常見(jiàn)解決方案

分布式事務(wù)是由多個(gè)本地事務(wù)組成的,分布式事務(wù)跨越了多設(shè)備,之間又經(jīng)歷的復(fù)雜的網(wǎng)絡(luò),可想而知想要實(shí)現(xiàn)嚴(yán)格的事務(wù)道路阻且長(zhǎng)。

2PC

二階段提交(Two-phase Commit,簡(jiǎn)稱(chēng)2PC),是指為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點(diǎn)在進(jìn)行事務(wù)提交時(shí)保持一致性而設(shè)計(jì)的一種算法(Algorithm)。

整體分為兩個(gè)階段,如圖所示。

2PC的優(yōu)缺點(diǎn)

2PC的優(yōu)點(diǎn)是能利用參與者(RM)自身的功能進(jìn)行本地事務(wù)的提交和回滾,對(duì)業(yè)務(wù)邏輯零侵入(相對(duì)TCC解決方案)。

但2PC也存在三大缺點(diǎn):同步阻塞、單點(diǎn)故障和數(shù)據(jù)不一致問(wèn)題。

  1. 同步阻塞

由于參與者(RM)在執(zhí)行操作時(shí)都是同步阻塞的,所以在2PC過(guò)程中其他節(jié)點(diǎn)訪問(wèn)加鎖資源不得不處于阻塞狀態(tài)。

  1. 單點(diǎn)故障

協(xié)調(diào)者(TM)是單點(diǎn),一旦協(xié)調(diào)者發(fā)生故障,參與者會(huì)一直阻塞。如果是某個(gè)熱點(diǎn)資源阻塞,可能會(huì)導(dǎo)致整個(gè)系統(tǒng)的雪崩。

  1. 數(shù)據(jù)不一致問(wèn)題

在第二階段中,因?yàn)榫W(wǎng)絡(luò)原因?qū)е虏糠謪⑴c者(RM)沒(méi)有接收到協(xié)調(diào)者(TM)的信息,或者部分參與者進(jìn)行提交/回滾操作時(shí),發(fā)生異常。這都會(huì)導(dǎo)致數(shù)據(jù)的不一致性問(wèn)題。

2PC的優(yōu)化

Percolator是Google的上一代分布式事務(wù)解決方案,構(gòu)建在BigTable之上,在Google內(nèi)部用于網(wǎng)頁(yè)索引更新的業(yè)務(wù),原始的論文見(jiàn)于參考文檔4。

TiDB的事務(wù)模型沿用了Percolator的事務(wù)模型,之后講解分布式數(shù)據(jù)庫(kù)相關(guān)博客進(jìn)行講解。

3PC

3PC相對(duì)2PC增加了三階段模式以及超時(shí)機(jī)制。

超時(shí)機(jī)制:第三階段中,當(dāng)參與者長(zhǎng)時(shí)間沒(méi)有得到協(xié)調(diào)者的響應(yīng),在默認(rèn)情況下,參與者會(huì)自動(dòng)將超時(shí)的事務(wù)進(jìn)行提交(即使是協(xié)調(diào)者發(fā)送的可能是rollback命令,這里就造成了數(shù)據(jù)的不一致)。解決2PC同步阻塞的情況.

同時(shí)3PC增加的第一階段的詢問(wèn)通知,降低2PC中的數(shù)據(jù)不一致問(wèn)題的概率。

但2PC中的單點(diǎn)故障問(wèn)題,3PC并沒(méi)有解決。

3PC的三個(gè)階段,如圖所示:

  1. 第一階段,CanCommit

  2. 第二階段,PreCommit

  3. 第三階段,DoCommit

總結(jié)

2PC還是3PC都是協(xié)議,是一種指導(dǎo)思想,與項(xiàng)目中真正的落地方案還是有差別的。

但2PC和3PC對(duì)于大型分布式系統(tǒng)很少會(huì)使用,因?yàn)樵谑聞?wù)處理過(guò)程中,協(xié)調(diào)者需要同時(shí)連接多個(gè)數(shù)據(jù)庫(kù)(RM)。

通常微服務(wù)都是連接各自領(lǐng)域的數(shù)據(jù)庫(kù),微服務(wù)想要修改另一個(gè)領(lǐng)域的數(shù)據(jù),都是要通過(guò)RPC接口來(lái)實(shí)現(xiàn)的,并不會(huì)多數(shù)據(jù)源訪問(wèn)。如果存在過(guò)多協(xié)調(diào)者進(jìn)行多數(shù)據(jù)源的鏈接,勢(shì)必會(huì)增加服務(wù)治理的難度并可能導(dǎo)致數(shù)據(jù)的錯(cuò)亂。

TCC

不管是2PC還是3PC都是依賴于數(shù)據(jù)庫(kù)的事務(wù)提交和回滾。

但有時(shí)一些業(yè)務(wù)不僅僅涉及到數(shù)據(jù)庫(kù),例如發(fā)送一條短信、上傳一張圖片等業(yè)務(wù)層的邏輯。

所以事務(wù)的提交和回滾就得提升到業(yè)務(wù)層面而不是數(shù)據(jù)庫(kù)層面了,而TCC就是一種業(yè)務(wù)層面的兩階段提交。

TCC (Try、Commit、Cancel) 是一種補(bǔ)償型事務(wù)。該模型要求應(yīng)用的每個(gè)服務(wù)提供try、confirm、cancel三個(gè)接口,核心思想是首先對(duì)資源的進(jìn)行預(yù)留評(píng)估,如果事務(wù)可以提交,則完成對(duì)預(yù)留資源的確認(rèn);如果事務(wù)要回滾,則釋放預(yù)留的資源。

TCC其本質(zhì)是一個(gè)應(yīng)用層面上的2PC,同樣分為兩個(gè)階段,如下圖所示:

比如:一個(gè)扣款服務(wù)使用TCC的話,需要寫(xiě)Try方法,用來(lái)扣款資金;還需要一個(gè)Confirm方法來(lái)執(zhí)行真正的扣款;最后還需要提供Cancel方法用于進(jìn)行扣款操作的回滾。

可以看到原本的一個(gè)方法,需要膨脹成三個(gè)方法,所以說(shuō)TCC對(duì)業(yè)務(wù)有很大的侵入。

雖說(shuō)對(duì)業(yè)務(wù)有侵入,但是TCC沒(méi)有資源的阻塞,每一個(gè)方法都是直接提交事務(wù)的,如果出錯(cuò)是通過(guò)業(yè)務(wù)層面的Cancel來(lái)進(jìn)行補(bǔ)償,所以TCC屬于補(bǔ)償型事務(wù)。

對(duì)于2PC中出現(xiàn)單點(diǎn)故障問(wèn)題或超時(shí)問(wèn)題,TCC的解決方案是不停重試:不停地重試沒(méi)有收到響應(yīng)的Confirm/Cancel接口直到成功為止,如果重試策略失敗就通過(guò)記錄和報(bào)警進(jìn)行人工介入。

但這種重試機(jī)制,造成了TCC的冪等問(wèn)題與空回滾問(wèn)題。

TCC需要注意的問(wèn)題

  1. 冪等問(wèn)題

由于有重調(diào)機(jī)制,因此對(duì)于Try、Confirm、Cancel三個(gè)方法都需要冪等實(shí)現(xiàn),避免重復(fù)執(zhí)行產(chǎn)生錯(cuò)誤。

  1. 空回滾問(wèn)題

參與者(RM)的Try接口響應(yīng)由于網(wǎng)絡(luò)問(wèn)題沒(méi)有讓協(xié)調(diào)者(TM)成功接收到,此時(shí)協(xié)調(diào)者(TM)就會(huì)發(fā)出Cancel命令。那么Cancel接口就需要在未執(zhí)行Try的情況下能正常的Cancel。

  1. 懸掛問(wèn)題

事務(wù)協(xié)調(diào)器在調(diào)用TCC服務(wù)的一階段Try操作時(shí),可能會(huì)出現(xiàn)因網(wǎng)絡(luò)擁堵而導(dǎo)致的超時(shí),此時(shí)事務(wù)協(xié)調(diào)器會(huì)觸發(fā)二階段回滾,調(diào)用TCC服務(wù)的Cancel操作,Cancel調(diào)用未超時(shí);在此之后,擁堵在網(wǎng)絡(luò)上的一階段Try數(shù)據(jù)包被TCC服務(wù)收到,出現(xiàn)了二階段Cancel請(qǐng)求比一階段Try請(qǐng)求先執(zhí)行的情況,此TCC服務(wù)在執(zhí)行晚到的Try之后,將永遠(yuǎn)不會(huì)再收到二階段的Confirm或者Cancel,造成TCC服務(wù)懸掛。

所以在實(shí)現(xiàn)TCC服務(wù)時(shí),要允許空回滾,但也要拒絕執(zhí)行空回滾之后Try請(qǐng)求,要避免出現(xiàn)懸掛。

補(bǔ)償型TCC

上面講解的是通用型TCC,它需要對(duì)分布式事務(wù)相關(guān)的所有業(yè)務(wù)有掌控權(quán)。但有時(shí)候(例如調(diào)用的是別的公司的接口),通用型TCC行不通。

因此存在補(bǔ)償型TCC,可以理解為沒(méi)有Try的TCC形式。由于未提供Try接口,可以認(rèn)為是Saga機(jī)制的另一種形式。

比如坐飛機(jī)需要換乘,換乘的飛機(jī)又是不同的航空公司,比如從A飛到B,再?gòu)腂飛到C,只有A-B和B-C都買(mǎi)到票了才有意義。

這時(shí)候就直接接調(diào)用航空公司的買(mǎi)票操作,當(dāng)兩個(gè)航空公司都買(mǎi)成功了那就直接成功了,如果某個(gè)公司買(mǎi)失敗了,那就需要調(diào)用取消訂票接口。

相當(dāng)于直接執(zhí)行TCC的第二階段,需要重點(diǎn)關(guān)注回滾操作。如果回滾失敗得有記錄報(bào)警和人工介入等。

總結(jié)

TCC事務(wù)將分布式事務(wù)從資源層提到業(yè)務(wù)層來(lái)實(shí)現(xiàn),可以讓業(yè)務(wù)靈活選擇資源的鎖定粒度,并且全局事務(wù)執(zhí)行過(guò)程中不會(huì)一直持有鎖,所以系統(tǒng)的吞吐量比2PC模式要高很多。

由于TCC事務(wù)的帶來(lái)的工程復(fù)雜度、網(wǎng)絡(luò)延遲和服務(wù)治理難度的提高,所以除非是與支付交易相關(guān)的核心業(yè)務(wù)場(chǎng)景(對(duì)一致性要求很高),其他業(yè)務(wù)場(chǎng)景不要使用TCC事務(wù)。

Saga事務(wù)

Saga事務(wù),也是一種補(bǔ)償事務(wù)。同補(bǔ)償型TCC一樣,沒(méi)有Try階段,而是把分布式事務(wù)看作一組本地事務(wù)構(gòu)成的事務(wù)鏈。

Saga事務(wù)基本協(xié)議如下:

  • 每個(gè)Saga事務(wù)由一系列冪等的有序子事務(wù)(sub-transaction,擔(dān)任參與者的身份) Ti 組成。

  • 每個(gè)Ti 都有對(duì)應(yīng)的冪等補(bǔ)償動(dòng)作Ci,補(bǔ)償動(dòng)作用于撤銷(xiāo)Ti造成的結(jié)果。

事務(wù)鏈中如果包含有業(yè)務(wù)順序的邏輯,一定要合理安排事務(wù)鏈的順序(以項(xiàng)目利益為優(yōu)先,如果出現(xiàn)紕漏可以人工補(bǔ)齊的原則,例如先扣款后發(fā)貨;先退貨再退款)

由于Saga模型中沒(méi)有Prepare階段,因此事務(wù)間不能保證隔離性,當(dāng)多個(gè)Saga事務(wù)操作同一資源時(shí),就會(huì)產(chǎn)生更新丟失、臟數(shù)據(jù)讀取等問(wèn)題,這時(shí)需要在業(yè)務(wù)層控制并發(fā),例如:在應(yīng)用層面加鎖,或者應(yīng)用層面預(yù)先凍結(jié)資源。

下面以下單流程為例,整個(gè)操作包括:扣減庫(kù)存(庫(kù)存服務(wù))、創(chuàng)建訂單(訂單服務(wù))、支付(支付服務(wù))等等。

事務(wù)正常執(zhí)行完成T1, T2, T3, ...,Tn,例如:扣減庫(kù)存(T1),創(chuàng)建訂單(T2),支付(T3),依次有序進(jìn)行,但支付服務(wù)出現(xiàn)報(bào)錯(cuò),此時(shí)Saga有兩種策略可以使用。

Saga事務(wù)的恢復(fù)策略

Saga定義了兩種恢復(fù)策略。

  1. 向前恢復(fù)(forward recovery)

適用于必須要成功的場(chǎng)景,發(fā)生失敗進(jìn)行重試,執(zhí)行順序是類(lèi)似于這樣的:T1, T2, ..., Tj(失敗), Tj(重試),..., Tn,其中j是發(fā)生錯(cuò)誤的子事務(wù)(sub-transaction)。

顯然,向前恢復(fù)沒(méi)有必要提供補(bǔ)償事務(wù),如果業(yè)務(wù)中子事務(wù)(最終)會(huì)成功,或補(bǔ)償事務(wù)難以定義或不可能,向前恢復(fù)更符合需求。

過(guò)度積極的重試策略(例如間隔太短或重試次數(shù)過(guò)多)會(huì)對(duì)下游服務(wù)造成不利影響,所以需要使用一個(gè)比較合理的重試機(jī)制。

  1. 向后恢復(fù)(backward recovery)

這種做法的效果是撤銷(xiāo)掉之前所有成功的子事務(wù),使得整個(gè)Saga的執(zhí)行結(jié)果撤銷(xiāo)。

下面講解的示例均為向后恢復(fù)策略。

Saga事務(wù)協(xié)調(diào)模式

Saga執(zhí)行事務(wù)的順序稱(chēng)為Saga的協(xié)調(diào)邏輯。這種協(xié)調(diào)邏輯有兩種模式,協(xié)調(diào)(Orchestration)和事件編排(Event Choreography)分別如下:

  1. 協(xié)調(diào)(Orchestration):Saga提供一個(gè)控制類(lèi),方便子事務(wù)的協(xié)調(diào)工作。事務(wù)執(zhí)行的命令從控制類(lèi)發(fā)起,按照邏輯順序請(qǐng)求Saga的子事務(wù),從子事務(wù)那里接受到反饋以后,控制類(lèi)再發(fā)起向其他子事務(wù)的調(diào)用。所有Saga的子事務(wù)都圍繞這個(gè)控制類(lèi)進(jìn)行溝通和協(xié)調(diào)工作。

以電商訂單的例子為例:

  1. 事務(wù)發(fā)起方的主業(yè)務(wù)邏輯請(qǐng)求控制類(lèi)開(kāi)啟訂單事務(wù)

  2. 控制類(lèi)向庫(kù)存服務(wù)請(qǐng)求扣減庫(kù)存,庫(kù)存服務(wù)回復(fù)處理結(jié)果。

  3. 控制類(lèi)向訂單服務(wù)請(qǐng)求創(chuàng)建訂單,訂單服務(wù)回復(fù)創(chuàng)建結(jié)果。

  4. 控制類(lèi)向支付服務(wù)請(qǐng)求支付,支付服務(wù)回復(fù)處理結(jié)果。

  5. 主業(yè)務(wù)邏輯接收并處理事務(wù)處理結(jié)果回復(fù)。

控制類(lèi)必須事先知道執(zhí)行整個(gè)訂單事務(wù)所需的流程。如果有任何失敗,它負(fù)責(zé)通過(guò)向每個(gè)子事務(wù)發(fā)送命令來(lái)撤銷(xiāo)之前的操作來(lái)協(xié)調(diào)分布式的回滾。基于控制類(lèi)協(xié)調(diào)一切時(shí),回滾要容易得多,因?yàn)榭刂祁?lèi)默認(rèn)是執(zhí)行正向流程,回滾時(shí)只要執(zhí)行反向流程即可。

  1. 事件編排(Event Choreography):子事務(wù)之間的調(diào)用、分配、決策和排序,通過(guò)交換事件進(jìn)行進(jìn)行。是一種去中心化的模式,子事務(wù)之間通過(guò)消息機(jī)制進(jìn)行溝通,通過(guò)監(jiān)聽(tīng)器的方式監(jiān)聽(tīng)其他子事務(wù)發(fā)出的消息,從而執(zhí)行后續(xù)的邏輯處理。由于沒(méi)有中間協(xié)調(diào)點(diǎn),靠子事務(wù)進(jìn)行相互協(xié)調(diào)。

以電商訂單的例子為例:

  1. 事務(wù)發(fā)起方的主業(yè)務(wù)邏輯發(fā)布開(kāi)始訂單事件

  2. 庫(kù)存服務(wù)監(jiān)聽(tīng)開(kāi)始訂單事件,扣減庫(kù)存,并發(fā)布庫(kù)存已扣減事件

  3. 訂單服務(wù)監(jiān)聽(tīng)?zhēng)齑嬉芽蹨p事件,創(chuàng)建訂單,并發(fā)布訂單已創(chuàng)建事件

  4. 支付服務(wù)監(jiān)聽(tīng)訂單已創(chuàng)建事件,進(jìn)行支付,并發(fā)布訂單已支付事件

  5. 主業(yè)務(wù)邏輯監(jiān)聽(tīng)訂單已支付事件并處理。

實(shí)現(xiàn)方式對(duì)比

基于協(xié)調(diào)的Saga的優(yōu)點(diǎn)如下:

  1. 服務(wù)之間關(guān)系簡(jiǎn)單,避免子事務(wù)之間的循環(huán)依賴關(guān)系,因?yàn)镾aga控制類(lèi)會(huì)調(diào)用Saga子事務(wù),但子事務(wù)不會(huì)調(diào)用控制類(lèi)。

  2. 程序開(kāi)發(fā)簡(jiǎn)單,子事務(wù)只需要完成自身的任務(wù),不用考慮處理消息的方式,降低子事務(wù)接入的復(fù)雜性。

  3. 易維護(hù)擴(kuò)展,如果事務(wù)需要添加新步驟,只需修改控制類(lèi),保持事務(wù)復(fù)雜性保持線性,回滾更容易管理。

  4. 容易測(cè)試,測(cè)試工作集中在集中在控制類(lèi)上,其他服務(wù)單獨(dú)測(cè)試功能即可。

基于協(xié)調(diào)的Saga的缺點(diǎn)如下:

  1. 控制類(lèi)集中太多邏輯的風(fēng)險(xiǎn),導(dǎo)致難以維護(hù)。

  2. 控制類(lèi)存在單點(diǎn)故障風(fēng)險(xiǎn)。

基于事件編排的Saga的優(yōu)點(diǎn)如下:

  1. 避免控制類(lèi)單點(diǎn)故障風(fēng)險(xiǎn)。

  2. 子事務(wù)之間通過(guò)訂閱時(shí)間溝通,組合會(huì)更靈活。

基于事件編排的Saga的缺點(diǎn)如下:

  1. 服務(wù)之間存在循環(huán)依賴的風(fēng)險(xiǎn)。

  2. 當(dāng)涉及的步驟較多,服務(wù)間關(guān)系混亂。如果沒(méi)有完善的文檔支撐,了解整個(gè)事務(wù)的執(zhí)行過(guò)程只能通過(guò)閱讀代碼完成。增加開(kāi)發(fā)人員理解和維護(hù)代碼的難度。

基于本地消息表機(jī)制

本地消息表機(jī)制會(huì)在數(shù)據(jù)庫(kù)中存放一個(gè)本地事務(wù)消息表,在進(jìn)行本地事務(wù)操作的同時(shí)將操作狀態(tài)插入到本地事務(wù)消息表。消息插入成功后再調(diào)用其他服務(wù),如果調(diào)用成功就修改這條本地消息的狀態(tài);如果調(diào)用失敗則不停重試,下游接口需要保證冪等性。

本地消息表機(jī)制是一種最大努力通知思想。

這里以支付服務(wù)和會(huì)計(jì)服務(wù)為例展開(kāi)介紹本地消息表方案。大概流程:用戶在支付服務(wù)完成了支付訂單支付成功后,此時(shí)會(huì)調(diào)用會(huì)計(jì)服務(wù)的接口生成一條原始的會(huì)計(jì)憑證到數(shù)據(jù)庫(kù)中。整體流程如圖:

完整流程:

  1. 在支付庫(kù)中加入一張消息表來(lái)記錄支付消息,即用戶支付成功后往這張消息表插入一條支付成功的消息,狀態(tài)為“發(fā)送中”。這里要保證了本地事務(wù)的強(qiáng)一致性(支付邏輯和插入消息表的消息組成了一個(gè)強(qiáng)一致性的事務(wù),要么同時(shí)成功,要么同時(shí)失敗)。

  2. 完成第1步的邏輯后,再向mq的PAY_QUEUE隊(duì)列中投遞一條支付消息,這條支付消息的內(nèi)容跟保存在支付庫(kù)消息表的消息內(nèi)容一致。

  3. 會(huì)計(jì)服務(wù)監(jiān)聽(tīng)到這條消息了,會(huì)計(jì)服務(wù)處理消費(fèi)邏輯開(kāi)始生成會(huì)計(jì)憑證。

  4. 會(huì)計(jì)憑證生成后,再反向向mq投遞一條消費(fèi)成功的消息到ACC_QUEUE隊(duì)列。

  5. 支付服務(wù)監(jiān)聽(tīng)到會(huì)計(jì)服務(wù)消費(fèi)成功的消息,將本地消息表的消息狀態(tài)改為“已發(fā)送”。

  6. 消息恢復(fù)系統(tǒng)每隔一段時(shí)間去本地消息表中撈取狀態(tài)為“發(fā)送中”的消息,然后重新投遞到mq的PAY_QUEUE隊(duì)列中。

如果消息恢復(fù)系統(tǒng)重新投遞同一條消息達(dá)到一定閾值,則記錄報(bào)警和通知人工處理。

總結(jié)

本地消息表機(jī)制的優(yōu)點(diǎn)是建設(shè)成本比較低,但也存在兩個(gè)缺點(diǎn):

  1. 本地消息表與業(yè)務(wù)耦合在一起,很難實(shí)現(xiàn)通用性,無(wú)法單獨(dú)運(yùn)維管理。

  2. 本地消息表是基于數(shù)據(jù)庫(kù)來(lái)做的,在高并發(fā)下是有性能瓶頸的。

基于事務(wù)消息機(jī)制

無(wú)論是2PC&3PC還是TCC、本地消息事務(wù),基本都遵守XA協(xié)議的思想。即這些方案本質(zhì)上都是事務(wù)協(xié)調(diào)者協(xié)調(diào)各個(gè)事務(wù)參與者的本地事務(wù)的進(jìn)度,使所有本地事務(wù)共同提交或回滾,最終達(dá)成全局已執(zhí)行的特性。在協(xié)調(diào)的過(guò)程中,協(xié)調(diào)者需要收集各個(gè)本地事務(wù)的當(dāng)前狀態(tài),并根據(jù)這些狀態(tài)發(fā)出下一階段的操作指令。

但這些全局事務(wù)方案由于操作繁瑣、時(shí)間跨度大,或者在全局事務(wù)期間會(huì)排他地鎖住相關(guān)資源,使得整個(gè)分布式系統(tǒng)的全局事務(wù)的并發(fā)度不會(huì)太高。這很難滿足電商等高并發(fā)場(chǎng)景對(duì)事務(wù)吞吐量的要求,因此互聯(lián)網(wǎng)服務(wù)提供商探索出了很多與XA協(xié)議背道而馳的分布式事務(wù)解決方案。其中利用消息中間件實(shí)現(xiàn)的最終一致性全局事務(wù)(事務(wù)消息事務(wù))就是一個(gè)經(jīng)典方案。

基于事務(wù)消息機(jī)制

普通消息是無(wú)法解決本地事務(wù)執(zhí)行和消息發(fā)送的一致性問(wèn)題的。因?yàn)橄l(fā)送是一個(gè)網(wǎng)絡(luò)通信的過(guò)程,發(fā)送消息的過(guò)程就有可能出現(xiàn)發(fā)送失敗、或者超時(shí)的情況。超時(shí)有可能發(fā)送成功了,有可能發(fā)送失敗了,消息的發(fā)送方是無(wú)法確定的,所以此時(shí)消息發(fā)送方無(wú)論是提交事務(wù)還是回滾事務(wù),都有可能不一致性出現(xiàn)。

解決這個(gè)問(wèn)題,需要引入事務(wù)消息,事務(wù)消息和普通消息的區(qū)別在于事務(wù)消息發(fā)送成功后,處于prepared狀態(tài),不能被訂閱者消費(fèi),等到事務(wù)消息的狀態(tài)更改為可消費(fèi)狀態(tài)后,下游訂閱者才可以監(jiān)聽(tīng)到次消息。

事務(wù)消息的發(fā)送處理流程如下:

  1. 事務(wù)發(fā)起者預(yù)先發(fā)送一個(gè)事務(wù)消息。MQ系統(tǒng)收到事務(wù)消息后,將消息持久化,消息的狀態(tài)是“待發(fā)送”,并給發(fā)送者一個(gè)ACK消息。

  2. 事務(wù)發(fā)起者如果沒(méi)有收到ACK消息,則取消本地事務(wù)的執(zhí)行;如果收到了ACK消息,則執(zhí)行本地事務(wù)。

  3. 執(zhí)行本地事務(wù)后,根據(jù)結(jié)果發(fā)送給MQ系統(tǒng)提交或回滾請(qǐng)求。

本地事務(wù)執(zhí)行完畢后,發(fā)給MQ的通知消息有可能丟失。所以支持事務(wù)消息的MQ系統(tǒng)有一個(gè)定時(shí)掃描邏輯,掃描出狀態(tài)仍然是“待發(fā)送”狀態(tài)的消息,并向消息的發(fā)送方發(fā)起詢問(wèn),詢問(wèn)這條事務(wù)消息的最終狀態(tài)如何并根據(jù)結(jié)果更新事務(wù)消息的狀態(tài)。因此事務(wù)的發(fā)起方需要給MQ系統(tǒng)提供一個(gè)事務(wù)消息狀態(tài)查詢接口。

  1. MQ系統(tǒng)收到消息通知后,如果提交請(qǐng)求,則將消息更改為“可消費(fèi)”供訂閱者消費(fèi);如果事務(wù)執(zhí)行回滾,則刪除該事務(wù)消息。

如果事務(wù)消息的狀態(tài)是“可發(fā)送”,則MQ系統(tǒng)向下游參與者推送消息,推送失敗會(huì)不停重試。

  1. 下游參與者收到消息后,執(zhí)行本地事務(wù),本地事務(wù)如果執(zhí)行成功,則給MQ系統(tǒng)發(fā)送ACK消息;如果執(zhí)行失敗或給MQ發(fā)送ACK的消息丟失,則MQ系統(tǒng)會(huì)持續(xù)推送給消息。

總結(jié)

基于事務(wù)消息機(jī)制實(shí)現(xiàn)了最終一致性,適用于異步更新的場(chǎng)景,并且對(duì)數(shù)據(jù)實(shí)時(shí)性要求不高的地方。

對(duì)比本地消息表實(shí)現(xiàn)方案,不需要?jiǎng)?chuàng)建本地消息表,也不需要依賴本地?cái)?shù)據(jù)庫(kù)事務(wù)了,所以這種方案更適用于高并發(fā)的場(chǎng)景。

RocketMQ可以直接支持生產(chǎn)環(huán)境使用基于事務(wù)消息機(jī)制,其他消息中間件(例如Kafka,RabbitMQ等)需要自研封裝一個(gè)可靠消息服務(wù)。

RocketMQ事務(wù)消息解決的是本地事務(wù)的執(zhí)行和發(fā)消息這兩個(gè)動(dòng)作滿足事務(wù)的約束。Kafka事務(wù)消息則是用在一次事務(wù)中需要發(fā)送多個(gè)消息的情況,保證多個(gè)消息之間的事務(wù)約束,即多條消息要么都發(fā)送成功,要么都發(fā)送失敗。

最大努力通知機(jī)制

最大努力通知機(jī)制本質(zhì)是通過(guò)引入定期校驗(yàn)機(jī)制來(lái)對(duì)最終一致性做兜底,對(duì)業(yè)務(wù)侵入性較低、對(duì)MQ系統(tǒng)要求較低,實(shí)現(xiàn)比較簡(jiǎn)單,適合于對(duì)最終一致性敏感度比較低、業(yè)務(wù)鏈路較短的場(chǎng)景,比如跨平臺(tái)、跨企業(yè)的系統(tǒng)間的業(yè)務(wù)交互。

適用場(chǎng)景

小明通過(guò)聯(lián)通網(wǎng)上營(yíng)業(yè)廳為手機(jī)充話費(fèi)。整個(gè)操作的流程如下:

  1. 小明選擇充值金額“50元”,支付方式“支付寶”。

  2. 聯(lián)通網(wǎng)上營(yíng)業(yè)廳創(chuàng)建一個(gè)充值訂單,狀態(tài)為“支付中”,并跳轉(zhuǎn)到支付寶的支付頁(yè)面。

  3. 支付寶驗(yàn)明確認(rèn)小明的支付后,從小明的賬戶中扣除50元,并向聯(lián)通的賬戶中增加50元。執(zhí)行完畢后向MQ系統(tǒng)發(fā)送一條消息,消息的內(nèi)容標(biāo)識(shí)支付是否成功,消息發(fā)送允許失敗。

  4. 如果消息發(fā)送成功,那么支付寶的通知服務(wù)會(huì)訂閱到該消息,并調(diào)用聯(lián)通的接口通知本次支付的結(jié)果。如果此時(shí)聯(lián)通的服務(wù)掛掉了,導(dǎo)致通知失敗了,則會(huì)按照5min、10min、30min、1h、...、24h等遞增的時(shí)間間隔,間隔性重復(fù)調(diào)用聯(lián)通的接口,直到調(diào)用成功或者達(dá)到預(yù)定的時(shí)間窗口上限后,則不再通知。這就是最大努力通知的含義。

  5. 如果聯(lián)通服務(wù)恢復(fù)正常,收到了支付寶的通知,給賬戶充值(聯(lián)通的充值接口需要保證冪等性)

  6. 如果聯(lián)通服務(wù)故障時(shí)間很久,恢復(fù)正常后,已超出支付寶通知服務(wù)的時(shí)間窗口,則聯(lián)通掃描“支付中”的訂單,主動(dòng)向支付寶發(fā)起請(qǐng)求,核驗(yàn)訂單的支付結(jié)果。

技術(shù)選型

2PC&3PC

2PC&3PC強(qiáng)依賴數(shù)據(jù)庫(kù),能夠很好的提供強(qiáng)一致性和強(qiáng)事務(wù)性,但相對(duì)來(lái)說(shuō)延遲比較高,比較適合傳統(tǒng)的單體應(yīng)用,在同一個(gè)方法中存在跨庫(kù)操作的情況,不適合大型分布式、高并發(fā)和高性能要求的場(chǎng)景。

TCC

TCC適用于執(zhí)行時(shí)間確定且較短,實(shí)時(shí)性要求高,對(duì)數(shù)據(jù)一致性要求高,比如互聯(lián)網(wǎng)金融企業(yè)最核心的三個(gè)服務(wù):交易、支付、賬務(wù)。

Saga事務(wù)

Saga事務(wù)適用于業(yè)務(wù)流程長(zhǎng)、業(yè)務(wù)流程多的業(yè)務(wù)且并發(fā)操作同一資源較少的情況。在銀行業(yè)金融機(jī)構(gòu)使用廣泛,比如互聯(lián)網(wǎng)微貸、渠道整合場(chǎng)景、金融機(jī)構(gòu)對(duì)接系統(tǒng)(需要對(duì)接外部系統(tǒng))等

基于本地消息表機(jī)制&基于事務(wù)消息機(jī)制

兩者都適用于事務(wù)中參與方支持操作冪等,對(duì)一致性要求不高,業(yè)務(wù)上能容忍數(shù)據(jù)不一致,直到兜底機(jī)制完成最終一致性。事務(wù)涉及的參與方、參與環(huán)節(jié)較少,業(yè)務(wù)上有對(duì)賬/校驗(yàn)系統(tǒng)兜底。

最大努力通知機(jī)制

最大努力通知機(jī)制適合于對(duì)最終一致性敏感度比較低、業(yè)務(wù)鏈路較短的場(chǎng)景。

前置知識(shí)

對(duì)于文中提到名詞的補(bǔ)充解釋。

DTP模型

DTP(Distributed Transaction Process)是一個(gè)分布式事務(wù)模型。在這個(gè)模型里面,有三個(gè)角色:

  1. AP: Application,事務(wù)的發(fā)起者,也就是業(yè)務(wù)層。哪些操作屬于一個(gè)事務(wù),就是AP定義的。

  2. TM: Transaction Manager,事務(wù)管理器,也稱(chēng)協(xié)調(diào)者。接收AP的事務(wù)請(qǐng)求,對(duì)全局事務(wù)進(jìn)行管理,管理事務(wù)分支狀態(tài),協(xié)調(diào)RM的處理,通知RM哪些操作屬于哪些全局事務(wù)以及事務(wù)分支等等。是整個(gè)事務(wù)調(diào)度模型的核心部分。

  3. RM:Resource Manager,資源管理器,也稱(chēng)參與者。一般是數(shù)據(jù)庫(kù),也可以是其他的資源管理器,如消息隊(duì)列(如JMS數(shù)據(jù)源),文件系統(tǒng)等。

DTP模型上定義了三個(gè)角色,但實(shí)際實(shí)現(xiàn)上可以由一個(gè)角色同時(shí)擔(dān)當(dāng)兩個(gè)功能。比如:AP和TM合并,TM沒(méi)必要單獨(dú)部署組件。

XA協(xié)議(XA Specification)

XA是一種分布式事務(wù)處理規(guī)范。XA規(guī)范了TM與RM之間的通信接口(如下圖所示的函數(shù)),在TM與多個(gè)RM之間形成一個(gè)雙向通信橋梁,從而在多個(gè)數(shù)據(jù)庫(kù)資源下保證強(qiáng)一致性。目前知名的數(shù)據(jù)庫(kù),如Oracle、DB2、MySQL等,都是實(shí)現(xiàn)了XA接口的,都可以作為RM。

在整個(gè)事務(wù)處理過(guò)程中,數(shù)據(jù)一直處于鎖住狀態(tài),即從prepare到commit、rollback的整個(gè)過(guò)程中,TM一直持有數(shù)據(jù)庫(kù)的鎖,如果有其他事務(wù)要修改數(shù)據(jù)庫(kù)的該條數(shù)據(jù),就必須等待鎖的釋放。

 

責(zé)任編輯:張燕妮 來(lái)源: 全菜工程師小輝
相關(guān)推薦

2022-07-13 09:53:58

分布式開(kāi)發(fā)

2022-05-30 10:37:35

分布式事務(wù)反向補(bǔ)償

2025-04-29 04:00:00

分布式事務(wù)事務(wù)消息

2024-12-09 09:35:00

2023-09-14 15:44:46

分布式事務(wù)數(shù)據(jù)存儲(chǔ)

2020-05-28 09:35:05

分布式事務(wù)方案

2024-06-13 09:25:14

2025-04-28 00:44:04

2010-07-21 13:53:41

SQL Server分

2025-05-07 00:10:00

分布式事務(wù)TCC模式

2023-11-30 07:19:08

.NET開(kāi)源

2024-03-26 12:08:53

分布式事務(wù)存儲(chǔ)

2019-01-11 18:22:07

阿里巴巴技術(shù)開(kāi)源

2021-09-28 09:43:11

微服務(wù)架構(gòu)技術(shù)

2024-06-13 08:04:23

2022-08-03 07:47:45

存儲(chǔ)分布式體系

2016-10-25 14:35:05

分布式系統(tǒng) 存儲(chǔ)

2019-07-25 15:32:35

分布式事務(wù)微服務(wù)系統(tǒng)架構(gòu)

2025-08-27 09:11:48

2020-03-31 16:13:26

分布式事務(wù)方案TCC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲成人福利视频| 黄色a级在线观看| 国产一级片av| 亚洲电影影音先锋| 亚洲国产精品人久久电影| 怡红院av亚洲一区二区三区h| 精品影院一区| 国产在线精品一区在线观看麻豆| 国内精品久久久久影院优 | 日本少妇xxxx动漫| 黑丝美女一区二区| 日韩精品一区在线观看| 成人精品视频一区二区| 日韩经典av| 国产亚洲一区字幕| 亚洲特黄一级片| 欧美精品一区男女天堂| 污污视频网站免费观看| 丝袜美腿av在线| 国产精品人成在线观看免费 | 在线中文字幕网站| 999亚洲国产精| 久久资源免费视频| 91激情视频在线观看| eeuss国产一区二区三区四区| 91极品视觉盛宴| 国产日韩欧美精品在线观看| 视频一区二区三区不卡| 久久免费偷拍视频| 国产色综合一区二区三区| 一二三区中文字幕| 久久久成人网| 91av在线播放视频| 久操视频免费在线观看| 先锋资源久久| 在线视频国产日韩| 中文字幕被公侵犯的漂亮人妻| 亚洲精品一二三**| 91精品国产欧美一区二区| 久草综合在线观看| 中文字幕在线直播| 五月激情六月综合| 国产一级做a爰片久久毛片男| 黄网站免费在线观看| 欧美高清在线精品一区| 色一情一乱一伦一区二区三欧美| 亚洲欧洲精品视频| 成a人片国产精品| 国产成人亚洲欧美| 亚洲a视频在线| 国产精品亚洲第一区在线暖暖韩国| 国产精品日韩欧美大师| 日韩久久久久久久久久| 老妇喷水一区二区三区| 国产成人激情视频| 国产精品国产精品国产| 日本欧美一区二区在线观看| 国产成+人+综合+亚洲欧美丁香花| 影音先锋亚洲天堂| 午夜在线观看免费一区| 欧美亚洲成人精品| 成人免费视频毛片| 狂野欧美一区| 国产欧美最新羞羞视频在线观看| 国产成人精品亚洲| 看国产成人h片视频| 国产美女精彩久久| 国产男男gay网站| 国产精品一级黄| 国产精品久久久久久久免费大片 | 婷婷激情五月综合| 免费精品视频在线| 成人欧美一区二区三区在线| 国产高清在线免费| 9久草视频在线视频精品| 麻豆91av| 91精彩视频在线观看| 亚洲视频在线一区| 野外做受又硬又粗又大视频√| 嗯啊主人调教在线播放视频| 一本大道综合伊人精品热热| 91精品无人成人www| 精品国产一区二区三区性色av | 麻豆网站免费观看| 国产成人aa在线观看网站站| 亚洲免费视频网站| 欧美激情视频二区| 久久免费大视频| 欧美日韩成人在线播放| 影音先锋亚洲天堂| 捆绑调教一区二区三区| 99视频免费观看蜜桃视频| 亚欧在线观看视频| 国产精品国产成人国产三级| 欧美黑人在线观看| 一呦二呦三呦精品国产| 欧美一卡在线观看| av网站免费在线播放| 成人激情电影在线| 欧美精品久久久久a| 国产男人搡女人免费视频| 国产精品一区二区在线看| 久久草视频在线看| 国产网站在线免费观看| 欧美日韩一区二区三区| 91香蕉国产线在线观看| 亚洲色图丝袜| 欧美精品激情在线| 亚洲在线观看av| 91看片淫黄大片一级| 超碰在线免费观看97| 毛片免费看不卡网站| 欧美大片免费久久精品三p| a级片在线观看| 激情欧美丁香| 91精品久久久久久久久久入口| 香蕉视频免费看| 一区二区高清在线| 天天干天天综合| 亚洲另类av| 欧美久久精品一级黑人c片 | 免费成人在线网站| 久久精品日产第一区二区三区| 永久av在线| 五月天丁香久久| 香蕉在线观看视频| 97精品视频| 国产精品久久久久久久久久ktv | 26uuu国产一区二区三区| 第九区2中文字幕| 色综合.com| 国产一区二区三区在线视频| 天天综合网久久综合网| proumb性欧美在线观看| 99久久久精品视频| 欧美日韩午夜电影网| xvideos成人免费中文版| 中文字幕免费视频观看| 久久久久久久国产精品影院| 欧美日韩性生活片| 黑人久久a级毛片免费观看| 欧美成人免费全部观看天天性色| 中文字幕第315页| 中文字幕av一区二区三区| 人妻无码视频一区二区三区| 国产欧美日韩精品高清二区综合区| 91精品国产色综合久久不卡98口 | 久久男人资源站| 亚洲一区电影| 国内外成人免费激情在线视频网站 | 欧美日韩精品一二三区| 亚欧精品视频一区二区三区| 青娱乐精品视频| 五月天色一区| 精品乱码一区二区三区四区| 色狠狠av一区二区三区香蕉蜜桃| 最近中文字幕在线观看| 国产精品激情偷乱一区二区∴| 自拍偷拍21p| 97欧美在线视频| 91网站在线看| 国产盗摄精品一区二区酒店| 亚洲精品一区二区精华| 五月婷婷色丁香| 国产女同性恋一区二区| 中文字幕在线综合| 在线精品国产| 国产在线一区二| 东京一区二区| 日韩视频免费中文字幕| 国产激情无套内精对白视频| 五月婷婷欧美视频| 丰满少妇高潮一区二区| 久草这里只有精品视频| 日韩精品免费一区| 无码日韩精品一区二区免费| 国产精品久久久久久久久久小说| 蜜桃av在线免费观看| 欧美一区欧美二区| 国产精品xxxx喷水欧美| 国产日韩精品久久久| 99国产精品久久久久久| 激情久久久久久| 欧洲精品在线一区| 国产精品毛片无码| 91成人福利在线| 色视频在线免费观看| 欧美成人三级电影在线| 天堂中文字幕在线观看| 国产精品精品国产色婷婷| 国产亚洲精品成人a| 久久一区二区三区四区五区| 五月天色婷婷综合| 风间由美性色一区二区三区四区| 国产成人精品网站| 免费男女羞羞的视频网站在线观看| 亚洲精品日韩久久久| 在线免费观看一区二区| 婷婷六月综合亚洲| 黑人と日本人の交わりビデオ| 粉嫩高潮美女一区二区三区 | 国产午夜精品视频一区二区三区| 欧美深夜视频| 91久久综合亚洲鲁鲁五月天| 午夜影院在线播放| 欧美成人精品在线观看| 成年人在线看| 亚洲黄页视频免费观看| 97人妻一区二区精品免费视频 | 国产亚洲欧美日韩在线观看一区二区| 成人网在线视频| 日本韩国欧美| 国语自产精品视频在线看| 日韩精品毛片| 亚洲深夜福利网站| 欧美 日韩 综合| 欧美一区二区三区在线视频| 中文字幕+乱码+中文| 精品久久久久久中文字幕| 粉嫩av性色av蜜臀av网站| 久久精品人人做| 亚洲激情 欧美| 国产盗摄精品一区二区三区在线| 亚洲人辣妹窥探嘘嘘| 男人的天堂亚洲在线| 欧美一级免费播放| 综合精品一区| 伊人久久大香线蕉综合75| 国语产色综合| 日韩av一区二区三区美女毛片| 久久久久观看| 粉嫩av一区二区三区免费观看| 成人国产精品久久| 91久久精品在线| 玖玖精品在线| 国产精品第一视频| 欧美极品免费| 国产精品极品尤物在线观看 | 在线精品视频一区二区| 91蜜桃视频在线观看| 亚洲图片欧美色图| 久久久久久久久久久网| 怡红院av一区二区三区| 精品国产视频一区二区三区| 亚洲欧洲精品一区二区精品久久久| 在线观看免费小视频| 国产片一区二区三区| b站大片免费直播| 久久久www免费人成精品| 中文字幕免费高清| 中文字幕不卡在线观看| 女人18毛片毛片毛片毛片区二| 国产精品久久毛片av大全日韩| 日本免费www| 成人欧美一区二区三区黑人麻豆| 久草视频手机在线| 一区二区三区国产精品| 国产大片中文字幕| 午夜久久久久久久久| 亚洲黄色小说图片| 色av综合在线| 91午夜交换视频| 日韩亚洲欧美一区二区三区| 亚洲国产福利视频| 亚洲精品720p| 国产毛片av在线| 日韩亚洲在线观看| 国产精品186在线观看在线播放| 97超级碰在线看视频免费在线看| 欧美电影免费观看高清完整| 国产精品久久久久久久久久久久久| 欧美黄页免费| 99国产盗摄| 日韩精品丝袜美腿| 在线不卡视频一区二区| 欧美区一区二| 日韩一级片播放| 国产精品资源在线| 91玉足脚交白嫩脚丫| 国产欧美久久久精品影院| 日韩成人短视频| 天天色综合成人网| 亚洲一级片免费看| 精品成人a区在线观看| 久久视频www| 久久777国产线看观看精品| 川上优av中文字幕一区二区| 国产精品久久99久久| 超碰精品在线| 亚洲精品一区二区三区四区五区| 欧美三区不卡| 9久久婷婷国产综合精品性色| 国产精品一区二区在线看| 亚洲精品视频久久久| 亚洲欧美日韩人成在线播放| av资源免费观看| 日韩一级欧美一级| 国产大片在线免费观看| 欧美夫妻性视频| 成人不卡视频| 久久久久一区二区| 亚洲成人三区| 狠狠躁狠狠躁视频专区| www.亚洲激情.com| 麻豆视频在线免费看| 在线亚洲+欧美+日本专区| www夜片内射视频日韩精品成人| 亚洲欧美制服第一页| 青青青国内视频在线观看软件| 国产精品欧美日韩| 啪啪国产精品| 搞av.com| 久久99国内精品| 久久久久久久久久久久| 午夜不卡在线视频| 午夜精品久久久久久久99热黄桃| 在线一区二区日韩| 香蕉伊大人中文在线观看| 99视频网站| 女生裸体视频一区二区三区| 日本三级黄色网址| 久久蜜桃av一区二区天堂| 国产 日韩 欧美 成人| 9191久久久久久久久久久| 户外极限露出调教在线视频| 97精品国产97久久久久久免费| 欧美激情三级| 国产免费xxx| 久久成人18免费观看| 高潮毛片无遮挡| 色悠悠久久综合| 午夜av免费在线观看| 欧美极品少妇xxxxⅹ免费视频 | 六月婷婷久久| 日韩视频二区| 少妇一级淫免费观看| 亚洲综合精品久久| 国产成人精品a视频| 久久综合电影一区| 国产精品久一| a级片一区二区| 国产成人小视频| 欧美极品视频在线观看| 日韩欧美成人激情| 欧美女同一区| 国产欧美综合精品一区二区| 亚洲图片在线| 黄色免费视频网站| 婷婷久久综合九色综合绿巨人| 秋霞视频一区二区| 国模极品一区二区三区| 欧美a大片欧美片| 国产精品50p| 久久蜜桃av一区二区天堂| aaa在线视频| 最新国产成人av网站网址麻豆| 国产成人精品一区二区三区在线| 亚洲不卡1区| 日韩高清欧美激情| 日韩av片在线免费观看| 欧美军同video69gay| 在线观看三级视频| 国产精品久久久一区二区三区| 亚洲人成久久| 性高潮久久久久久久| 欧美性感一类影片在线播放| 欧美一级二级三级区| 亚洲xxxx3d| 亚洲欧洲日本一区二区三区| 国产肉体xxxx裸体784大胆| 在线观看91精品国产入口| 日本三级视频在线观看| 91精品国自产在线观看| 亚洲日本欧美| 怡红院一区二区三区| 7777精品伊人久久久大香线蕉的| 婷婷色在线播放| 久久久久久久久一区二区| 轻轻草成人在线| 久久国产在线观看| 亚洲免费av电影| av在线亚洲一区| 欧美三级在线观看视频| 欧美经典一区二区| 99在线精品视频免费观看20| 国产91精品久| 天天综合网网欲色| 99久久人妻精品免费二区| 欧美亚洲国产bt| 欧美巨大xxxx做受沙滩| 区一区二区三区中文字幕| 国产一区二区三区在线看麻豆| 天天操天天干视频| 日韩最新在线视频| 欧美美女啪啪| 手机版av在线| 日韩欧美主播在线| fc2ppv国产精品久久| 日本成人看片网址| 国产成人免费av在线|