日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原创 | 分布式事务科普(终结篇)

發布時間:2024/4/11 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原创 | 分布式事务科普(终结篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方“朱小廝的博客”,選擇“設為星標”

后臺回復"高效Java"領取《Effective Java第三版》

當當優惠碼:V54PW7,可減¥30

歡迎跳轉到本文的原文鏈接:https://honeypps.com/architect/introduction-of-distributed-transaction/

《分布式事務科普》是我在YiQing期間整理的一篇科普型文章,內容共計兩萬五千字左右,應該算是涵蓋了這個領域的大多數知識點。篇幅較長,遂分為上下兩篇發出。上篇為《分布式事務科普——初識篇》:ACID、事務隔離級別、MySQL事務實現原理、CAP、BASE、2PC、3PC等(昨天已經發出,有需要的同學可以跳轉)。下篇為《分布式事務科普——終結篇》,詳細講解分布式事務的解決方案:XA、AT、TCC、Saga、本地消息表、消息事務、最大努力通知等。

分布式事務科普

隨著業務的快速發展、業務復雜度越來越高,傳統單體應用逐漸暴露出了一些問題,例如開發效率低、可維護性差、架構擴展性差、部署不靈活、健壯性差等等。而微服務架構是將單個服務拆分成一系列小服務,且這些小服務都擁有獨立的進程,彼此獨立,很好地解決了傳統單體應用的上述問題,但是在微服務架構下如何保證事務的一致性呢?本文首先從事務的概念出來,帶大家先回顧一下ACID、事務隔離級別、CAP、BASE、2PC、3PC等基本理論(參考上篇《分布式事務科普——初識篇》),然后再詳細講解分布式事務的解決方案:XA、AT、TCC、Saga、本地消息表、消息事務、最大努力通知等。

分布式事務解決方案

在引入分布式事務前,我們最好先明確一下我們是否真的需要分布式事務。有可能因為過度設計致使微服務過多,從而不得不引入分布式事務,這個時候就不建議你采用下面的任何一種方案,而是把需要事務的微服務聚合成一個單機服務,使用數據庫的本地事務。因為不論任何一種方案都會增加你系統的復雜度,這樣的成本實在是太高了,千萬不要因為追求某些設計,而引入不必要的成本和復雜度。

常見的分布式事務方案有:XA、AT、TCC、Saga、本地消息表、MQ消息事務、最大努力通知等。

X/Open DTP模型與XA

X/Open,即現在的open group,是一個獨立的組織,主要負責制定各種行業技術標準。官網地址:http://www.opengroup.org/。X/Open組織主要由各大知名公司或者廠商進行支持,這些組織不光遵循X/Open組織定義的行業技術標準,也參與到標準的制定。

DTP全稱是Distributed Transaction Process,即分布式事務模型。在DTP本地模型實例中包含3個部分:AP、TM和RM,如下圖所示。其中,AP 可以和TM 以及 RM 通信,TM 和 RM 互相之間可以通信。

  • AP(Application Program,應用程序):AP定義事務邊界(定義事務開始和結束)并訪問事務邊界內的資源。

  • RM(Resource Manager,資源管理器):RM管理著某些共享資源的自治域,比如說一個MySQL數據庫實例。在DTP里面還有兩個要求,一是RM自身必須是支持事務的,二是RM能夠根據全局(分布式)事務標識(GTID之類的)定位到自己內部的對應事務。

  • TM(Transaction Manager,事務管理器):TM能與AP和RM直接通信,協調AP和RM來實現分布式事務的完整性。負責管理全局事務,分配全局事務標識,監控事務的執行進度,并負責事務的提交、回滾、失敗恢復等。

AP和RM之間則通過RM提供的Native API 進行資源控制,這個沒有進行約API和規范,各個廠商自己實現自己的資源控制,比如Oracle自己的數據庫驅動程序。

DTP模型里面定義了XA接口,TM 和 RM 通過XA接口進行雙向通信(這也是XA的主要作用, 除此之外,XA還對兩階段提交協議進行了部分優化),例如:TM通知RM提交事務或者回滾事務,RM把提交結果通知給TM。XA 的全稱是eXtended Architecture,它是一個分布式事務協議,它通過二階段提交協議保證強一致性。

其過程大致如下:

  • 第一階段:TM請求所有RM進行準備,并告知它們各自需要做的局部事務(Transaction Branch)。RM收到請求后,如果判斷可以完成自己的局部事務,那就持久化局部事務的工作內容,再給TM肯定答復;要是發生了其他情況,那給TM的都是否定答復。在發送了否定答復并回滾了局部事務之后,RM才能丟棄持久化了的局部事務信息。

  • 第二階段:TM根據情況(比如說所有RM Prepare成功,或者,AP通知它要Rollback等),先持久化它對這個全局事務的處理決定和所涉及的RM清單,然后通知所有涉及的RM去提交或者回滾它們的局部事務。RM們處理完自己的局部事務后,將返回值告訴TM之后,TM才可以清除掉包括剛才持久化的處理決定和RM清單在內的這個全局事務的信息。

基于XA協議實現的分布式事務是強一致性的分布式事務,典型應用場景如JAVA中有關分布式事務的規范如JTA(Java Transaction API)和JTS(Java Transaction Service)中就涉及到了XA。

XA 協議通常實現在數據庫資源層,直接作用于資源管理器上。因此,基于 XA 協議實現的分布式事務產品,無論是分布式數據庫還是分布式事務框架,對業務幾乎都沒有侵入,就像使用普通數據庫一樣。

不過XA的使用并不廣泛,究其原因主要有以下幾類:

  • 性能,如:阻塞性協議,增加響應時間、鎖時間、死鎖等因素的存在,在高并發場景下并不適用。

  • 支持程度,并不是所有的資源都支持XA協議;在數據庫中支持完善度也有待考驗,比如MySQL 5.7之前都有缺陷(MySQL 5.0版本開始支持XA,只有當隔離級別為SERIALIZABLE的時候才能使用分布式事務)。

  • 運維復雜。

Seata與AT模式

AT(Automatic Transaction)模式是基于XA事務演進而來,核心是對業務無侵入,是一種改進后的兩階段提交,需要數據庫支持。AT最早出現在阿里巴巴開源的分布式事務框架Seata中,我們不妨先簡單了解下Seata。

Seata簡介

Seata(Simple Extensible Autonomous Transaction Architecture,一站式分布式事務解決方案)是 2019 年 1 月份螞蟻金服和阿里巴巴共同開源的分布式事務解決方案。Seata 的設計思路是將一個分布式事務可以理解成一個全局事務,下面掛了若干個分支事務,而一個分支事務是一個滿足 ACID 的本地事務,因此我們可以操作分布式事務像操作本地事務一樣。

Seata 內部定義了 3個模塊來處理全局事務和分支事務的關系和處理過程,如上圖所示,分別是 TM、RM 和 TC。其中 TM 和 RM 是作為 Seata 的客戶端與業務系統集成在一起,TC 作為 Seata 的服務端獨立部署。? Transaction Coordinator(TC):事務協調器,維護全局事務的運行狀態,負責協調并驅動全局事務的提交或回滾。? Transaction Manager(TM):控制全局事務的邊界,負責開啟一個全局事務,并最終發起全局提交或全局回滾的決議。? Resource Manager(RM):控制分支事務,負責分支注冊、狀態匯報,并接收事務協調器的指令,驅動分支(本地)事務的提交和回滾

  • Transaction Coordinator(TC):事務協調器,維護全局事務的運行狀態,負責協調并驅動全局事務的提交或回滾。

  • Transaction Manager(TM):控制全局事務的邊界,負責開啟一個全局事務,并最終發起全局提交或全局回滾的決議。

  • Resource Manager(RM):控制分支事務,負責分支注冊、狀態匯報,并接收事務協調器的指令,驅動分支(本地)事務的提交和回滾。

參照上圖,簡要概括整個事務的處理流程為:

  • TM 向 TC 申請開啟一個全局事務,TC 創建全局事務后返回全局唯一的 XID,XID 會在全局事務的上下文中傳播;

  • RM 向 TC 注冊分支事務,該分支事務歸屬于擁有相同 XID 的全局事務;

  • TM要求TC提交或回滾XID的相應全局事務。

  • TC在XID的相應全局事務下驅動所有分支事務以完成分支提交或回滾。

  • Seata 會有 4 種分布式事務解決方案,分別是 AT 模式、TCC 模式、Saga 模式和 XA 模式。這個小節我們主要來講述一下AT模式的實現方式,TCC和Saga模式在后面會繼續介紹。

    AT模式

    Seata 的事務提交方式跟 XA 協議的兩段式提交在總體上來說基本是一致的,那它們之間有什么不同呢?

    我們都知道 XA 協議它依賴的是數據庫層面來保障事務的一致性,也即是說 XA 的各個分支事務是在數據庫層面上驅動的,由于 XA 的各個分支事務需要有 XA 的驅動程序,一方面會導致數據庫與 XA 驅動耦合,另一方面它會導致各個分支的事務資源鎖定周期長,這也是它沒有在互聯網公司流行的重要因素。

    基于 XA 協議以上的問題,Seata 另辟蹊徑,既然在依賴數據庫層會導致這么多問題,那我們就從應用層做手腳,這還得從 Seata 的 RM 模塊說起,前面也說過 RM 的主要作用了,其實 RM 在內部做了對數據庫操作的代理層。如上圖所示,在使用 Seata 時,我們使用的數據源實際上用的是 Seata 自帶的數據源代理 DataSourceProxy,Seata 在這層代理中加入了很多邏輯,主要是解析 SQL,把業務數據在更新前后的數據鏡像組織成回滾日志,并將 undo log 日志插入 undo_log 表中,保證每條更新數據的業務 SQL都有對應的回滾日志存在。

    這樣做的好處就是,本地事務執行完可以立即釋放本地事務鎖定的資源,然后向 TC 上報分支狀態。當 TM 決議全局提交時,就不需要同步協調處理了,TC 會異步調度各個 RM 分支事務刪除對應的 undo log 日志即可,這個步驟非常快速地可以完成;當 TM 決議全局回滾時,RM 收到 TC 發送的回滾請求,RM 通過 XID 找到對應的 undo log 回滾日志,然后執行回滾日志完成回滾操作。

    如上圖(左),XA 方案的 RM 是放在數據庫層的,它依賴了數據庫的 XA 驅動程序。而上圖(右),Seata 的 RM 實際上是已中間件的形式放在應用層,不用依賴數據庫對協議的支持,完全剝離了分布式事務方案對數據庫在協議支持上的要求。

    AT模式下是如何做到對業務無侵入,又是如何執行提交和回滾的呢?

    第一階段

    參照下圖,Seata 的 JDBC 數據源代理通過對業務 SQL 的解析,把業務數據在更新前后的數據鏡像組織成回滾日志(undo log),利用本地事務的 ACID 特性,將業務數據的更新和回滾日志的寫入在同一個本地事務中提交。這樣可以保證任何提交的業務數據的更新一定有相應的回滾日志存在,最后對分支事務狀態向 TC 進行上報。基于這樣的機制,分支的本地事務便可以在全局事務的第一階段提交,馬上釋放本地事務鎖定的資源。

    第二階段

    如果決議是全局提交,此時分支事務此時已經完成提交,不需要同步協調處理(只需要異步清理回滾日志),第二階段可以非常快速地結束,參考下圖。

    如果決議是全局回滾,RM收到協調器發來的回滾請求,通過XID和Branch ID找到相應的回滾日志記錄,通過回滾記錄生成反向的更新SQL并執行,以完成分支的回滾,參考下圖。

    講到這里,關于AT模式大部分問題我們應該都清楚了,但總結起來,核心也只解決了一件事情,就是ACID中最基本、最重要的 A(原子性)。但是,光解決A顯然是不夠的:既然本地事務已經提交,那么如果數據在全局事務結束前被修改了,回滾時怎么處理?ACID 的 I(隔離性)在Seata的AT模式是如何處理的呢?

    Seata AT 模式引入全局鎖機制來實現隔離。全局鎖是由 Seata 的 TC 維護的,事務中涉及的數據的鎖。

    寫隔離

    參考官網(https://seata.io/en-us/docs/overview/what-is-seata.html)的資料,寫隔離的要領如下:

    • 第一階段本地事務提交前,需要確保先拿到全局鎖 。

    • 拿不到全局鎖,不能提交本地事務。

    • 拿全局鎖的嘗試被限制在一定范圍內,超出范圍將放棄,并回滾本地事務,釋放本地鎖。

    以一個示例來說明。兩個全局事務tx1和tx2,分別對a表的m字段進行更新操作,m的初始值1000。tx1先開始,開啟本地事務拿到本地鎖,更新操作 m = 1000 - 100 = 900。本地事務提交前,先拿到該記錄的全局鎖,本地提交釋放本地鎖。tx2后開始,開啟本地事務拿到本地鎖,更新操作 m = 900 - 100 = 800。本地事務提交前,嘗試拿該記錄的全局鎖,tx1全局提交前,該記錄的全局鎖被 tx1持有,tx2需要重試等待全局鎖 。

    tx1 第二階段全局提交,釋放全局鎖 。tx2拿到全局鎖提交本地事務。

    如果tx1的第二階段全局回滾,則tx1需要重新獲取該數據的本地鎖,進行反向補償的更新操作,實現分支的回滾。

    參考下圖,此時如果tx2仍在等待該數據的全局鎖,同時持有本地鎖,則tx1的分支回滾會失敗。分支的回滾會一直重試,直到tx2的全局鎖等鎖超時,放棄全局鎖并回滾本地事務釋放本地鎖,tx1 的分支回滾最終成功。

    因為整個過程全局鎖在tx1結束前一直是被tx1持有的,所以不會發生臟寫的問題。

    讀隔離

    在數據庫本地事務隔離級別為讀已提交(READ COMMITTED)或以上的基礎上,Seata(AT模式)的默認全局隔離級別是讀未提交(READ UNCOMMITTED)。如果應用在特定場景下,必需要求全局的讀已提交,目前Seata的方式是通過SELECT FOR UPDATE語句的代理。

    SELECT FOR UPDATE語句的執行會申請全局鎖 ,如果全局鎖被其他事務持有,則釋放本地鎖(回滾SELECT FOR UPDATE語句的本地執行)并重試。這個過程中,查詢是被阻塞 住的,直到全局鎖拿到,即讀取的相關數據是已提交的,才返回。

    全局鎖是由 TC 也就是服務端來集中維護,而不是在數據庫維護的。這樣做有兩點好處:一方面,鎖的釋放非常快,尤其是在全局提交的情況下收到全局提交的請求,鎖馬上就釋放掉了,不需要與 RM 或數據庫進行一輪交互;另外一方面,因為鎖不是數據庫維護的,從數據庫層面看數據沒有鎖定。這也就是給極端情況下,業務降級提供了方便,事務協調器異常導致的一部分異常事務,不會阻塞后面業務的繼續進行。

    AT模式基于本地事務的特性,通過攔截并解析 SQL 的方式,記錄自定義的回滾日志,從而打破 XA 協議阻塞性的制約,在一致性、性能、易用性三個方面取得一定的平衡:在達到確定一致性(非最終一致)的前提下,即保障一定的性能,又能完全不侵入業務。在很多應用場景下,Seata的AT模式都能很好地發揮作用,把應用的分布式事務支持成本降到極低的水平。

    不過AT模式也并非銀彈,在使用之前最好權衡好以下幾個方面:

    • 隔離性。隔離性不高,目前只能支持到接近讀已提交的程度,更高的隔離級別,實現成本將非常高。

    • 性能損耗。一條Update的SQL,則需要全局事務XID獲取(與TC通訊)、before image(解析SQL,查詢一次數據庫)、after image(查詢一次數據庫)、insert undo log(寫一次數據庫)、before commit(與TC通訊,判斷鎖沖突),這些操作都需要一次遠程通訊RPC,而且是同步的。另外undo log寫入時blob字段的插入性能也是不高的。每條寫SQL都會增加這么多開銷,粗略估計會增加5倍響應時間(二階段雖然是異步的,但其實也會占用系統資源,網絡、線程、數據庫)。

    • 全局鎖。Seata在每個分支事務中會攜帶對應的鎖信息,在before commit階段會依次獲取鎖(因為需要將所有SQL執行完才能拿到所有鎖信息,所以放在commit前判斷)。相比XA,Seata 雖然在一階段成功后會釋放數據庫鎖,但一階段在commit前全局鎖的判定也拉長了對數據鎖的占有時間,這個開銷比XA的prepare低多少需要根據實際業務場景進行測試。全局鎖的引入實現了隔離性,但帶來的問題就是阻塞,降低并發性,尤其是熱點數據,這個問題會更加嚴重。Seata在回滾時,需要先刪除各節點的undo log,然后才能釋放TC內存中的鎖,所以如果第二階段是回滾,釋放鎖的時間會更長。Seata的引入全局鎖會額外增加死鎖的風險,但如果實現死鎖,會不斷進行重試,最后靠等待全局鎖超時,這種方式并不優雅,也延長了對數據庫鎖的占有時間。

    TCC

    關于TCC(Try-Confirm-Cancel)的概念,最早是由Pat Helland于2007年發表的一篇名為《Life beyond Distributed Transactions:an Apostate’s Opinion》的論文提出。在該論文中,TCC還是以Tentative-Confirmation-Cancellation命名。正式以Try-Confirm-Cancel作為名稱的是Atomikos公司,其注冊了TCC商標。

    TCC分布式事務模型相對于 XA 等傳統模型,其特征在于它不依賴資源管理器(RM)對分布式事務的支持,而是通過對業務邏輯的分解來實現分布式事務。

    TCC 模型認為對于業務系統中一個特定的業務邏輯,其對外提供服務時必須接受一些不確定性,即對業務邏輯初步操作的調用僅是一個臨時性操作,調用它的主業務服務保留了后續的取消權。如果主業務服務認為全局事務應該回滾,它會要求取消之前的臨時性操作,這就對應從業務服務的取消操作。而當主業務服務認為全局事務應該提交時,它會放棄之前臨時性操作的取消權,這對應從業務服務的確認操作。每一個初步操作,最終都會被確認或取消。

    因此,針對一個具體的業務服務,TCC 分布式事務模型需要業務系統提供三段業務邏輯:

  • Try:完成所有業務檢查,預留必須的業務資源。

  • Confirm:真正執行的業務邏輯,不作任何業務檢查,只使用 Try 階段預留的業務資源。因此,只要Try操作成功,Confirm必須能成功。另外,Confirm操作需滿足冪等性,保證分布式事務有且只能成功一次。

  • Cancel:釋放 Try 階段預留的業務資源。同樣的,Cancel 操作也需要滿足冪等性。

  • TCC分布式事務模型包括三部分:

    • 主業務服務(Main Server):主業務服務為整個業務活動的發起方、服務的編排者,負責發起并完成整個業務活動。

    • 從業務服務(Service):從業務服務是整個業務活動的參與方,負責提供TCC業務操作,實現Try、Confirm、Cancel三個接口,供主業務服務調用。

    • 事務管理器(Transaction Manager):事務管理器管理控制整個業務活動,包括記錄維護TCC全局事務的事務狀態和每個從業務服務的子事務狀態,并在業務活動提交時調用所有從業務服務的Confirm操作,在業務活動取消時調用所有從業務服務的Cancel操作。

    上圖所展示的是TCC事務模型與DTP事務模型的對比圖,看上去這兩者差別很大。聰明的讀者應該可以從圖中的著色上猜出些端倪,其實這兩者基本一致:TCC模型中的主業務服務相當于DTP模型中AP,從業務服務相當于DTP模型中的RM,兩者也都有一個事務管理器;TCC模型中從業務服務器所提供的Try/Commit/Cancel接口相當于DTP模型中RM提供的Prepare/Commit/Rollback接口。

    所不同的是DTP模型中Prepare/Commit/Rollback都是由事務管理器調用,TCC模型中的Try接口是由主業務服務調用的,二階段的Commit/Cancel才是由事務管理器調用。這就是TCC事務模型的二階段異步化功能,從業務服務的第一階段執行成功,主業務服務就可以提交完成,然后再由事務管理器框架異步的執行各從業務服務的第二階段。這里犧牲了一定的隔離性和一致性的,但是提高了長事務的可用性。

    下面我們再來了解一下一個完整的TCC分布式事務流程:

  • 主業務服務首先開啟本地事務。

  • 主業務服務向事務管理器申請啟動分布式事務主業務活動。

  • 然后針對要調用的從業務服務,主業務活動先向事務管理器注冊從業務活動,然后調用從業務服務的 Try 接口。

  • 當所有從業務服務的 Try 接口調用成功,主業務服務提交本地事務;若調用失敗,主業務服務回滾本地事務。

  • 若主業務服務提交本地事務,則TCC模型分別調用所有從業務服務的Confirm接口;若主業務服務回滾本地事務,則分別調用 Cancel 接口;

  • 所有從業務服務的Confirm或Cancel操作完成后,全局事務結束。

  • 用戶接入TCC,最重要的是考慮如何將自己的業務模型拆成兩階段來實現。下面,我們從一個簡答的例子來熟悉一下TCC的具體用法。

    以“扣錢”場景為例,在接入TCC前,對A賬戶的扣錢,只需一條更新賬戶余額的 SQL 便能完成;但是在接入TCC之后,用戶就需要考慮如何將原來一步就能完成的扣錢操作拆成兩階段,實現成三個方法,并且保證Try成功Confirm一定能成功。

    如下圖所示,一階段Try方法需要做資源的檢查和預留。在扣錢場景下,Try要做的事情是就是檢查賬戶余額是否充足,預留轉賬資金,預留的方式就是凍結A賬戶的轉賬資金。Try方法執行之后,賬號A余額雖然還是100,但是其中30元已經被凍結了,不能被其他事務使用。

    二階段Confirm執行真正的扣錢操作。Confirm會使用Try階段凍結的資金,執行賬號扣款。Confirm執行之后,賬號A在一階段中凍結的30元已經被扣除,賬號A余額變成 70 元 。

    如果二階段是回滾的話,就需要在Cancel方法內釋放一階段Try凍結的30元,使賬號A的回到初始狀態,100元全部可用。

    在TCC模型中,事務的隔離交給業務邏輯來實現。其隔離性思想就是通過業務的改造,在第一階段結束之后,從底層數據庫資源層面的加鎖過渡為上層業務層面的加鎖,從而釋放底層數據庫鎖資源,放寬分布式事務鎖協議,將鎖的粒度降到最低,以最大限度提高業務并發性能。

    以上面的例子舉例,賬戶A上有100元,事務tx1要扣除其中的30元,事務tx2也要扣除30元,出現并發。在第一階段的Try操作中,需要先利用數據庫資源層面的加鎖,檢查賬戶可用余額,如果余額充足,則預留業務資源,扣除本次交易金額。一階段結束后,雖然數據庫層面資源鎖被釋放了,但這筆資金被業務隔離,不允許除本事務之外的其它并發事務動用。

    補償性事務

    TCC第一階段的Try或者第二階段的Confirm/Cancel在執行過程中,一般都會開啟各自的本地事務,來保證方法內部業務邏輯的ACID特性。這里Confirm/Cancel執行的本地事務是補償性事務。

    補償性事務是一個獨立的支持ACID特性的本地事務,用于在邏輯上取消服務提供者上一個ACID事務造成的影響,對于一個長事務(long-running transaction),與其實現一個巨大的分布式ACID事務,不如使用基于補償性的方案,把每一次服務調用當做一個較短的本地ACID事務來處理,執行完就立即提交。

    TCC第二階段Confirm/Cancel執行的補償性事務用于取消Try階段本地事務造成的影響。因為第一階段Try只是預留資源,之后必須要明確的告訴服務提供者,這個資源到底要還需不需要。下一節中所要講述的Saga也是一種補償性的事務。

    TCC異常控制

    在有了一套完備的 TCC 接口之后,是不是就真的高枕無憂了呢?答案是否定的。在微服務架構下,很有可能出現網絡超時、重發,機器宕機等一系列的異常情況。一旦遇到這些 情況,就會導致我們的分布式事務執行過程出現異常,最常見的主要是空回滾、冪等、懸掛。因此,在TCC接口設計中還需要處理好這三個問題。

    Cancel接口設計時需要允許空回滾。在Try接口因為丟包時沒有收到,事務管理器會觸發回滾,這時會觸發Cancel接口,這時Cancel執行時發現沒有對應的事務 XID或主鍵時,需要返回回滾成功。讓事務服務管理器認為已回滾,否則會不斷重試,而Cancel又沒有對應的業務數據可以進行回滾。

    冪等性的意思是對同一個系統使用同樣的條件,一次請求和重復的多次請求對系統資源的影響是一致的。因為網絡抖動或擁堵可能會超時,事務管理器會對資源進行重試操作,所以很可能一個業務操作會被重復調用,為了不因為重復調用而多次占用資源,需要對服務設計時進行冪等控制,通常我們可以用事務XID或業務主鍵判重來控制。

    懸掛的意思是Cancel比Try接口先執行,出現的原因是Try由于網絡擁堵而超時,事務管理器生成回滾,觸發Cancel接口,而最終又收到了Try接口調用,但是Cancel比Try先到。按照前面允許空回滾的邏輯,回滾會返回成功,事務管理器認為事務已回滾成功,則此時的Try接口不應該執行,否則會產生數據不一致,所以我們在Cancel空回滾返回成功之前先記錄該條事務 XID或業務主鍵,標識這條記錄已經回滾過,Try接口先檢查這條事務XID或業務主鍵如果已經標記為回滾成功過,則不執行Try的業務操作。

    總結

    XA兩階段提交是資源層面的,而TCC實際上把資源層面二階段提交上提到了業務層面來實現,有效了的避免了XA兩階段提交占用資源鎖時間過長導致的性能低下問題。TCC也沒有AT模式中的全局行鎖,所以性能也會比AT模式高很多。不過,TCC模式對業務代碼有很大的侵入性,主業務服務和從業務服務都需要進行改造,從業務方改造成本更高。

    Saga

    Saga 算法(https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf)于 1987 年提出,是一種異步的分布式事務解決方案。其理論基礎在于,其假設所有事件按照順序推進,總能達到系統的最終一致性,因此 Saga需要服務分別定義提交接口以及補償接口,當某個事務分支失敗時,調用其它的分支的補償接口來進行回滾。

    在Saga模式下,分布式事務內有多個參與者,每一個參與者都是一個沖正補償服務,需要用戶根據業務場景實現其正向操作和逆向回滾操作。

    分布式事務執行過程中,依次執行各參與者的正向操作,如果所有正向操作均執行成功,那么分布式事務提交。如果任何一個正向操作執行失敗,那么分布式事務會去退回去執行前面各參與者的逆向回滾操作,回滾已提交的參與者,使分布式事務回到初始狀態。

    Saga模式下分布式事務通常是由事件驅動的,各個參與者之間是異步執行的,Saga 模式是一種長事務解決方案。

    Saga模式不保證事務的隔離性,在極端情況下可能出現臟寫。比如在分布式事務未提交的情況下,前一個服務的數據被修改了,而后面的服務發生了異常需要進行回滾,可能由于前面服務的數據被修改后無法進行補償操作。一種處理辦法可以是“重試”繼續往前完成這個分布式事務。由于整個業務流程是由狀態機編排的,即使是事后恢復也可以繼續往前重試。所以用戶可以根據業務特點配置該流程的事務處理策略是優先“回滾”還是“重試”,當事務超時的時候,服務端會根據這個策略不斷進行重試。

    由于Saga不保證隔離性,所以我們在業務設計的時候需要做到“寧可長款,不可短款”的原則,長款是指在出現差錯的時候站在我方的角度錢多了的情況,錢少了則是短款,因為如果長款可以給客戶退款,而短款則可能錢追不回來了,也就是說在業務設計的時候,一定是先扣客戶帳再入帳,如果因為隔離性問題造成覆蓋更新,也不會出現錢少了的情況。

    Saga模式適用于業務流程長且需要保證事務最終一致性的業務系統,Saga模式一階段就會提交本地事務,無鎖、長流程情況下可以保證性能。事務參與者可能是其它公司的服務或者是遺留系統的服務,無法進行改造和提供TCC要求的接口,也可以使用Saga模式。

    Saga模式所具備的優勢有:一階段提交本地數據庫事務,無鎖,高性能;參與者可以采用事務驅動異步執行,高吞吐;補償服務即正向服務的“反向”,易于理解、易于實現;不過,Saga 模式由于一階段已經提交本地數據庫事務,且沒有進行“預留”動作,所以不能保證隔離性。

    一個好的分布式事務應用應該盡可能滿足:

    • 提高易用性、即降低業務改造成本。

    • 性能損耗低。

    • 隔離性保證完整。但如同CAP,這三個特性是相互制衡的,往往只能滿足其中兩個,我們可以搭配AT、TCC和Saga來畫一個三角約束:

    本地消息表

    本地消息表最初是由eBay架構師Dan Pritchett在一篇解釋 BASE 原理的論文《Base:An Acid Alternative》(https://queue.acm.org/detail.cfm?id=1394128)中提及的,業界目前使用這種方案是比較多的,其核心思想是將分布式事務拆分成本地事務進行處理。

    方案通過在事務主動發起方額外新建事務消息表,事務發起方處理業務和記錄事務消息在本地事務中完成,輪詢事務消息表的數據發送事務消息,事務被動方基于消息中間件消費事務消息表中的事務。

    下面把分布式事務最先開始處理的事務方稱為事務主動方,在事務主動方之后處理的業務內的其他事務稱為事務被動方。事務的主動方需要額外新建事務消息表,用于記錄分布式事務的消息的發生、處理狀態。

    參考上圖,我們不妨來聊一聊本地消息表的事務處理流程。

    事務主動方處理好相關的業務邏輯之后,先將業務數據寫入數據庫中的業務表(圖中步驟1),然后將所要發送的消息寫入到數據庫中的消息表(步驟2)。注意:寫入業務表的邏輯和寫入消息表的邏輯在同一個事務中,這樣通過本地事務保證了一致性。

    之后,事務主動方將所要發送的消息發送到消息中間件中(步驟3)。消息在發送過程中丟失了怎么辦?這里就體現出消息表的用處了。在上一步中,在消息表中記錄的消息狀態是“發送中”,事務主動方可以定時掃描消息表,然后將其中狀態為“發送中”的消息重新投遞到消息中間件即可。只有當最后事務被動方消費完之后,消息的狀態才會被設置為“已完成”。

    重新投遞的過程中也可能會再次失敗,此時我們一般會指定最大重試次數,重試間隔時間根據重試次數而指數或者線性增長。若達到最大重試次數后記錄日志,我們可以根據記錄的日志來通過郵件或短信來發送告警通知,接收到告警通知后及時介入人工處理即可。

    前面3個步驟可以避免“業務處理成功,消息發送失敗”或者“消息發送成功,業務處理失敗”這種棘手情況的出現,并且也可以保證消息不會丟失。

    事務被動方監聽并消費消息中間件中的消息(步驟4),然后處理相應的業務邏輯,并把業務數據寫入到自己的業務表中(步驟5),隨后將處理結果返回給消息中間件(步驟6)。

    步驟4-6中可能會出現各種異常情況,事務被動方可以在處理完步驟6之后再向消息中間件ACK在步驟4中讀取的消息。這樣,如果步驟4-6中間出現任何異常了都可以重試消費消息中間件中的那條消息。這里不可避免的會出現重復消費的現象,并且在前面的步驟3中也會出現重復投遞的現象,因此事務被動方的業務邏輯需要能夠保證冪等性。

    最后事務主動方也會監聽并讀取消息中間件中的消息(步驟7)來更新消息表中消息的狀態(步驟8)。

    步驟6和步驟7是為了將事務被動方的處理結果反饋給事務主動方,這里也可以使用RPC的方式代替。如果在事務被動方處理業務邏輯的過程中發現整個業務流程失敗,那么事務被動方也可以發送消息(或者RPC)來通知事務主動方進行回滾。

    基于本地消息表的分布式事務方案就介紹到這里了,本地消息表的方案的優點是建設成本比較低,其雖然實現了可靠消息的傳遞確保了分布式事務的最終一致性,其實它也有一些缺陷:

  • 本地消息表與業務耦合在一起,難以做成通用性,不可獨立伸縮。

  • 本地消息表是基于數據庫來做的,而數據庫是要讀寫磁盤IO的,因此在高并發下是有性能瓶頸的。

  • (歡迎關注公眾號:朱小廝的博客)

    消息事務

    消息事務作為一種異步確保型事務,其核心原理是將兩個事務通過消息中間件進行異步解耦。

    消息事務的一種實現思路是通過保證多條消息的同時可見性來保證事務一致性。但是此類消息事務實現機制更多的是用在 consume-transform-produce(Kafka支持)場景中,其本質上還是用來保證消息自身事務,并沒有把外部事務包含進來。

    還有一種思路是依賴于 AMQP 協議(RabbitMQ支持)來確保消息發送成功。AMQP需要在發送事務消息時進行兩階段提交,首先進行 tx_select 開啟事務,然后再進行消息發送,最后執行 tx_commit 或tx_rollback。這個過程可以保證在消息發送成功的同時,本地事務也一定成功執行。但事務粒度不好控制,而且會導致性能急劇下降,同時也無法解決本地事務執行與消息發送的原子性問題。

    不過,RocketMQ事務消息設計解決了上述的本地事務執行與消息發送的原子性問題。在RocketMQ的設計中,broker和producer的雙向通信能力使得broker天生可以作為一個事務協調者存在。而RocketMQ本身提供的存儲機制,則為事務消息提供了持久化能力。RocketMQ 的高可用機制以及可靠消息設計,則為事務消息在系統在發生異常時,依然能夠保證事務的最終一致性達成。

    RocketMQ 事務消息的設計流程同樣借鑒了兩階段提交理論,整體交互流程如下圖所示:

    下面我們來了解一下這個設計的整體流程。

    首先,事務發起方發送一個Prepare消息到MQ Server中(對應于上圖中Step 1和Step 2),如果這個Prepare消息發送失敗,那么就直接取消操作,后續的操作也都不再執行。如果這個Prepare消息發送成功了,那么接著執行自身的本地事務(Step 3)。

    如果本地事務執行失敗,那么通知MQ Server回滾(Step 4 - Rollback),后續操作都不再執行。如果本地事務執行成功,就通知MQ Server發送確認消息(Step 4 - Commit)。

    倘若 Step 4中的Commit/Rollback消息遲遲未送達到MQ Server中呢?MQ Server會自動定時輪詢所有的 Prepare 消息,然后調用事務發起方事先提供的接口(Step 5),通過這個接口反查事務發起方的上次本地事務是否執行成功(Step 6)。

    如果成功,就發送確認消息給 MQ Server;失敗則告訴 MQ Server回滾消息(Step 7)。

    事務被動方會接收到確認消息,然后執行本地的事務,如果本地事務執行成功則事務正常完成。如果事務被動方本地事務執行失敗了咋辦?基于 MQ 來進行不斷重試,如果實在是不行,可以發送報警由人工來手工回滾和補償。

    上圖是采用本地消息表方案和采用RocketMQ事務消息方案的對比圖,其實,我們不難發現RocketMQ的這種事務方案就是對本地消息表的封裝,其MQ內部實現了本地消息表的功能,其他方面的協議基本與本地消息表一致。

    RocketMQ 事務消息較好的解決了事務的最終一致性問題,事務發起方僅需要關注本地事務執行以及實現回查接口給出事務狀態判定等實現,而且在上游事務峰值高時,可以通過消息隊列,避免對下游服務產生過大壓力。

    事務消息不僅適用于上游事務對下游事務無依賴的場景,還可以與一些傳統分布式事務架構相結合,而 MQ 的服務端作為天生的具有高可用能力的協調者,使得我們未來可以基于MQ提供一站式輕量級分布式事務解決方案,用以滿足各種場景下的分布式事務需求。

    最大努力通知

    最大努力通知型(Best-effort Delivery)是最簡單的一種柔性事務,適用于一些最終一致性時間敏感度低的業務,且被動方處理結果不影響主動方的處理結果。典型的使用場景:如支付通知、短信通知等。

    以支付通知為例,業務系統調用支付平臺進行支付,支付平臺進行支付,進行操作支付之后支付平臺會盡量去通知業務系統支付操作是否成功,但是會有一個最大通知次數。如果超過這個次數后還是通知失敗,就不再通知,業務系統自行調用支付平臺提供一個查詢接口,供業務系統進行查詢支付操作是否成功。

    最大努力通知方案可以借助MQ(消息中間件)來實現,參考下圖。

    發起通知方將通知發給MQ,接收通知方監聽 MQ 消息。接收通知方收到消息后,處理完業務回應ACK。接收通知方若沒有回應ACK,則 MQ 會間隔 1min、5min、10min 等重復通知。接受通知方可調用消息校對接口,保證消息的一致性。

    分布式事務的取舍

    嚴格的ACID事務對隔離性的要求很高,在事務執行中必須將所有的資源鎖定,對于長事務來說,整個事務期間對數據的獨占,將嚴重影響系統并發性能。因此,在高并發場景中,對ACID的部分特性進行放松從而提高性能,這便產生了BASE柔性事務。柔性事務的理念則是通過業務邏輯將互斥鎖操作從資源層面上移至業務層面。通過放寬對強一致性要求,來換取系統吞吐量的提升。另外提供自動的異常恢復機制,可以在發生異常后也能確保事務的最終一致。

    柔性事務需要應用層進行參與,因此這類分布式事務框架一個首要的功能就是怎么最大程度降低業務改造成本,然后就是盡可能提高性能(響應時間、吞吐),最好是保證隔離性。

    當然如果我們要自己設計一個分布式事務框架,還需要考慮很多其它特性,在明確目標場景偏好后進行權衡取舍,這些特性包括但不限于以下:

    • 業務侵入性(基于注解、XML,補償邏輯);

    • 隔離性(寫隔離/讀隔離/讀未提交,業務隔離/技術隔離);

    • TM/TC部署形態(單獨部署、與應用部署一起);

    • 錯誤恢復(自動恢復、手動恢復);

    • 性能(回滾的概率、付出的代價,響應時間、吞吐);

    • 高可用(注冊中心、數據庫);

    • 持久化(數據庫、文件、多副本一致算法);

    • 同步/異步(2PC執行方式);

    • 日志清理(自動、手動);

    • ......

    分布式事務一直是業界難題,難在于CAP定理,在于分布式系統8大錯誤假設 ,在于FLP不可能原理 ,在于我們習慣于單機事務ACID做對比。無論是數據庫領域XA,還是微服務下AT、TCC、Saga、本地消息表、事務消息、最大努力通知等方案,都沒有完美解決分布式事務問題,它們不過是各自在性能、一致性、可用性等方面做取舍,尋求某些場景偏好下的權衡。

    歡迎跳轉到本文的原文鏈接:https://honeypps.com/architect/introduction-of-distributed-transaction/

    想知道更多?描下面的二維碼關注我

    后臺回復”加群“獲取公眾號專屬群聊入口

    當當優惠碼福利來一波!當當全場自營圖書5折,用優惠碼:V54PW7(長按復制),滿200(原價400)再減30,相當于170=400,四折多一點。使用渠道:當當小程序或當當APP。使用時間:4/10-4/23。

    【精彩推薦】

    • Paxos、Raft不是一致性算法嘛?

    • 越說越迷糊的CAP

    • 面試官居然問我Raft為什么會叫做Raft!

    • 面試官給我挖坑:URI中的//有什么用

    • 網關Zuul科普

    • 網關Spring Cloud?Gateway科普

    • 分布式事務科普——初識篇

    >>>?字節跳動社招內推入口?<<<

    >>> 字節跳動校招內推入口 <<<

    朕已閱?

    總結

    以上是生活随笔為你收集整理的原创 | 分布式事务科普(终结篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    免费黄在线观看 | 激情小说 五月 | 日韩一级片观看 | 国产精品久久久777 成人手机在线视频 | 国产午夜精品一区二区三区四区 | 久久99热国产 | 99精彩视频在线观看免费 | 日韩成人精品一区二区 | 成人羞羞视频在线观看免费 | 精品v亚洲v欧美v高清v | 91精品亚洲影视在线观看 | 久久综合久久综合九色 | 久久国产精品偷 | 久久久精品午夜 | 日韩欧美69 | 亚洲aⅴ免费在线观看 | 99这里只有精品99 | 在线观看亚洲a | 综合五月| 久久综合九色综合欧美狠狠 | 黄在线免费观看 | 国产一区二区在线免费播放 | 黄色一级大片免费看 | 99re在线视频观看 | 亚洲午夜精品久久久久久久久久久久 | av色一区| 免费观看成人网 | 五月天久久狠狠 | 亚洲久久视频 | 日本亚洲国产 | 精品自拍sae8—视频 | 91福利视频在线 | 亚洲精品动漫久久久久 | 成人一级影视 | 国产精品18videosex性欧美 | 国产69精品久久久久久久久久 | 色多视频在线观看 | 国产精品专区在线观看 | 欧美成人中文字幕 | 夜夜看av | 国产亚洲精品成人av久久影院 | 天天插天天狠天天透 | 久久a v电影 | 91免费观看视频网站 | 粉嫩一二三区 | 亚洲精品网址在线观看 | 国内精品久久天天躁人人爽 | 日韩欧美网址 | 色婷婷www| 中文字幕一区二区三区久久 | 久久96国产精品久久99软件 | 久久午夜影视 | 毛片网站观看 | 97超碰站 | 91视频在线自拍 | 91女子私密保健养生少妇 | 国产精品国产三级国产不产一地 | 香蕉视频在线网站 | 婷婷激情在线观看 | 青青射| 玖玖视频精品 | 在线色视频小说 | 久久久激情视频 | av在线播放网址 | 久久精品欧美 | 欧美亚洲成人xxx | 亚洲精品国产拍在线 | 国产流白浆高潮在线观看 | 国产高清视频在线播放一区 | 蜜臀久久99静品久久久久久 | 日韩免费电影一区二区 | 国产精品剧情 | 久久久久久综合 | 久久久久国产成人免费精品免费 | 视频二区在线 | 国产日韩视频在线播放 | 日本三级大片 | 成年人国产视频 | av色综合网 | 丁香电影小说免费视频观看 | 久久国产精品一区二区 | 亚洲情婷婷 | 最新国产精品视频 | 天天射,天天干 | а天堂中文最新一区二区三区 | 久久伦理 | 九九热中文字幕 | 欧美国产不卡 | 亚洲,国产成人av | 在线观看视频国产 | 久久久久久国产精品久久 | 日本中出在线观看 | 丁香久久综合 | 美女一级毛片视频 | 免费观看一级成人毛片 | 天天操天天综合网 | 91精品久久久久久粉嫩 | 国产精选在线 | 97视频资源 | 欧美精品久久久久久久久久久 | 亚洲精品一区二区久 | 国产黑丝一区二区 | 国产网红在线观看 | 91探花在线视频 | 久久久香蕉视频 | 日韩素人在线观看 | 丁香五月亚洲综合在线 | 国产在线不卡 | 国产精品一区二区免费视频 | 在线观看视频h | 奇米7777狠狠狠琪琪视频 | 精品国产乱码久久久久久1区2匹 | av成人在线看 | 99久久综合国产精品二区 | 亚洲国产精品女人久久久 | 最新精品视频在线 | 天躁狠狠躁 | 免费福利片2019潦草影视午夜 | 婷婷在线视频 | 天天激情综合网 | 久久不卡国产精品一区二区 | 日韩专区在线观看 | 国产精品高潮久久av | 欧美小视频在线 | 日韩一区二区三 | 国产丝袜高跟 | 五月天丁香亚洲 | 日韩毛片久久久 | 成片视频在线观看 | 高清国产午夜精品久久久久久 | 黄色大片免费网站 | 菠萝菠萝在线精品视频 | 日韩中文字幕免费电影 | 精品国产免费人成在线观看 | 亚洲高清在线 | 亚洲欧美在线视频免费 | 亚洲精品在线免费看 | 超级碰99| 国产91欧美 | 国产国产人免费人成免费视频 | www.精选视频.com | 又紧又大又爽精品一区二区 | 人人天天夜夜 | 亚洲视频免费在线观看 | 国外av在线 | 在线免费高清一区二区三区 | 精品影院一区二区久久久 | 在线观看播放av | 国产精品一区一区三区 | 欧美一级艳片视频免费观看 | 中文av一区二区 | 久久久久久久精 | 免费一区在线 | 中文字幕亚洲欧美日韩2019 | 98涩涩国产露脸精品国产网 | 久久婷婷国产色一区二区三区 | 中文字幕资源网 国产 | 精品999在线 | 国产视频不卡 | 久久伊人综合 | 欧美日韩视频网站 | 国产手机在线观看 | 中文字幕人成乱码在线观看 | 最新中文字幕在线观看视频 | 亚在线播放中文视频 | 日韩免费在线看 | 天天综合入口 | 九九九九九国产 | 欧美一级免费在线 | 18久久久| 中文字幕一区二 | 色婷婷九月 | 久久久久久国产一区二区三区 | 日本美女xx | 99视频一区二区 | 日韩av片免费在线观看 | 精品96久久久久久中文字幕无 | 97色婷婷人人爽人人 | 久久久久久久久久福利 | 中文字幕在线视频一区 | www.天堂av | 国产在线美女 | 国产午夜精品一区二区三区嫩草 | 国产高清99 | 色av网站 | 97视频在线免费播放 | 中文字幕你懂的 | 91精品国产成人观看 | 国产小视频在线看 | 激情视频免费在线 | 91成人网在线播放 | 精品国产一区二区三区在线 | 国产一级做a爱片久久毛片a | 欧美午夜a | 国产视频精品视频 | 欧美999| 亚洲理论片| 视频91 | 国内精品久久久久影院一蜜桃 | 日日操天天操狠狠操 | av看片在线| 欧美五月婷婷 | 99精品国产免费久久久久久下载 | 91精品日韩 | 国产精品观看在线亚洲人成网 | 99re中文字幕 | 91看片淫黄大片一级在线观看 | 精品国产亚洲一区二区麻豆 | 在线免费黄色av | 日韩有码欧美 | 亚洲理论片 | 99免费在线观看视频 | 在线黄色免费 | 亚洲免费精品一区二区 | 日韩精品久久久久久中文字幕8 | 99免费在线播放99久久免费 | 亚洲人av免费网站 | 欧美成人一区二区 | 99re热精品视频 | 中文字幕在线网 | 精品久久久久久久久久久久 | 狠狠狠狠狠狠干 | 国产美腿白丝袜足在线av | 久久九九视频 | 亚洲第一成网站 | 一级理论片在线观看 | 日韩高清在线一区 | 成人国产在线 | 久久乐九色婷婷综合色狠狠182 | 久久免费高清视频 | 国产视频2| 一区二区欧美在线观看 | av中文资源在线 | 亚洲精品午夜久久久 | 婷婷六月天在线 | 国产第一福利 | 国产精品理论片 | 国产中文字幕在线看 | 精品视频久久久 | 国产精品自拍在线 | 91精品国产欧美一区二区 | 天天射天天舔天天干 | 粉嫩av一区二区三区四区在线观看 | 国产五码一区 | 91高清一区 | av在观看 | 亚洲自拍偷拍色图 | 国产精品麻豆免费版 | 狠狠干干| 国产精彩视频 | 91久久国产露脸精品国产闺蜜 | 在线看av的网址 | 久草视频在 | 国产h片在线观看 | 国内久久久久 | 亚洲少妇影院 | 婷婷丁香av | 激情五月婷婷激情 | 在线观看亚洲精品 | 成人中文字幕+乱码+中文字幕 | 99精品美女 | 在线视频 一区二区 | 在线天堂中文在线资源网 | 91中文字幕在线视频 | 日韩精品视频一二三 | 亚洲精品videossex少妇 | 91九色老| 天天干,天天操 | 97超碰人人看| 韩国一区视频 | 一二三区av| 91精品国产三级a在线观看 | 欧美福利视频一区 | 中文字幕视频观看 | 色香天天| 欧美先锋影音 | 久久精品国产一区二区 | 在线不卡中文字幕播放 | 亚洲综合黄色 | 日韩在线视频不卡 | 国产毛片久久久 | 成人性生爱a∨ | 最近久乱中文字幕 | 国产一级黄色免费看 | 免费高清av在线看 | 久久久在线视频 | 四虎欧美 | 私人av| 亚洲爱av | 91视频啊啊啊 | 天天操狠狠操夜夜操 | 亚洲精品在线一区二区 | 久草精品国产 | 国产精品嫩草影视久久久 | 夜夜躁狠狠燥 | 超碰个人在线 | 欧美在线视频a | 亚洲综合成人专区片 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产精品综合av一区二区国产馆 | 日韩精品久久久久久久电影竹菊 | www91在线| 操操操av | 久久久av免费 | 国产欧美最新羞羞视频在线观看 | 天天操天天射天天 | 久久久99精品免费观看 | 中文字幕 二区 | 五月婷婷色综合 | 在线观看黄色国产 | 一区二区三区动漫 | 精品黄色在线观看 | 在线成人免费电影 | 免费在线一区二区 | 亚洲欧洲美洲av | 欧美一级视频一区 | 国产精品美女视频网站 | 日韩在线高清 | 国产精品久久久久久久久毛片 | 1024在线看片 | 国产一线二线三线性视频 | av高清一区二区三区 | 天堂av免费看 | 亚洲精品国内 | aⅴ精品av导航 | 国产精品99久久99久久久二8 | 国产视频精选在线 | 久久国产精品免费 | 日本精品久久久一区二区三区 | 日韩欧美在线观看 | 99久久精品国产免费看不卡 | 全久久久久久久久久久电影 | 亚洲国产最新 | www.91成人| 美女视频黄是免费的 | 91色在线观看视频 | 综合天天久久 | av在线一 | av网站在线免费观看 | 色狠狠综合天天综合综合 | 最近中文字幕高清字幕在线视频 | 在线一区二区三区 | 日韩久久片| 日韩国产精品久久 | 国产精品精品国产婷婷这里av | 久草在线视频精品 | 日本午夜在线亚洲.国产 | 成人免费毛片aaaaaa片 | 99精品久久久久久久 | www夜夜操com | 亚洲黄色影院 | 久久综合免费视频 | 99久久久国产精品美女 | 亚洲免费在线看 | 91九色蝌蚪视频网站 | 成人午夜精品久久久久久久3d | 97在线视频免费播放 | 久久不卡av | 欧美a级片免费看 | 美腿丝袜av| 久久精品男人的天堂 | 99热这里是精品 | 亚洲成av人片 | 毛片永久新网址首页 | 色综合咪咪久久网 | 粉嫩av一区二区三区免费 | aaa毛片视频| 中文字幕中文字幕在线中文字幕三区 | 婷婷视频在线播放 | 美女一区网站 | 日韩精品久久一区二区 | 天天操操| 91视频在线免费下载 | 久久免费视频播放 | 久久久久久视频 | 亚洲人成人99网站 | 又大又硬又黄又爽视频在线观看 | 操天天操 | 黄色电影网站在线观看 | 精品在线99 | 四虎影视欧美 | 超碰97免费在线 | 日韩欧美在线免费 | 最新久久久 | 婷婷丁香色 | 国产精品 亚洲精品 | 国产在线播放不卡 | 国产成人免费观看 | 中文字幕在线观看你懂的 | 国产三级久久久 | 在线观看国产中文字幕 | 91九色porn在线资源 | 亚洲 欧洲 国产 日本 综合 | 国产精品久久久久久久久搜平片 | 91成人短视频在线观看 | 日韩激情片在线观看 | 国产99在线播放 | 黄色成人91 | 免费日韩 精品中文字幕视频在线 | 久久伦理| 一区 二区电影免费在线观看 | 成人在线网站观看 | 中文字幕av在线不卡 | 久久国产精彩视频 | 日本mv大片欧洲mv大片 | 人人看人人艹 | 日韩精品中字 | 日韩色视频在线观看 | 国产成人亚洲在线观看 | 国产精品免费在线播放 | 天天爽天天摸 | 日韩欧美视频一区二区 | 人人要人人澡人人爽人人dvd | 中文字幕色婷婷在线视频 | 亚洲精品字幕 | 黄a在线观看 | 免费视频区 | 久久久黄视频 | www.成人sex| 高清视频一区二区三区 | 日本不卡123区 | 亚洲一区视频在线播放 | 免费高清影视 | 久久这里只有精品9 | 色噜噜在线观看视频 | 亚洲免费永久精品国产 | 国产美女免费视频 | 天天av在线播放 | 色丁香婷婷 | 国产精品一区二区美女视频免费看 | av丝袜美腿 | 日韩一区视频在线 | 人人爽夜夜爽 | www.av在线播放 | 伊人婷婷网 | 久久久久免费精品国产小说色大师 | 日韩视频中文 | 视频一区二区在线观看 | 成人毛片一区 | 一区三区视频 | 久久免费视频3 | 久久综合偷偷噜噜噜色 | 黄网站免费久久 | 黄av在线| 天天色婷婷 | 在线免费观看一区二区三区 | 成人av一区二区在线观看 | 久久免费看a级毛毛片 | 女人18毛片a级毛片一区二区 | 丁香亚洲| 在线视频成人 | 日日综合网 | 91探花国产综合在线精品 | 欧美精品亚洲精品日韩精品 | 在线观看视频在线观看 | 国产精品久久三 | 最近中文字幕国语免费高清6 | 免费高清在线视频一区· | 狠狠亚洲| 国产日产精品久久久久快鸭 | 日韩av视屏在线观看 | 国产精品黄网站在线观看 | 97人人艹 | 天天拍夜夜拍 | 四虎在线观看 | 97网| 亚洲影视九九影院在线观看 | 久久精品一二三区白丝高潮 | 天天躁日日躁狠狠躁av麻豆 | 午夜av在线播放 | 色综合久久99| 婷婷精品国产欧美精品亚洲人人爽 | 日韩成人免费电影 | 久久在线播放 | 亚洲精品午夜一区人人爽 | 色黄久久久久久 | 欧美伦理一区 | 色噜噜日韩精品一区二区三区视频 | 国产精品福利在线播放 | www日韩| 69国产精品视频 | 超碰国产人人 | 狠狠狠狠狠狠狠干 | 欧美先锋影音 | 在线超碰av | 免费观看91视频 | 色偷偷人人澡久久超碰69 | 亚洲午夜精品在线观看 | 国产亚洲视频在线 | 久久免费观看视频 | 国产高清在线不卡 | 波多在线视频 | 欧美极度另类性三渗透 | 五月开心色 | 亚洲精品在线观看av | 国产不卡在线观看 | 国产青春久久久国产毛片 | 六月丁香伊人 | 国产精品白虎 | 免费久久片 | 国产福利在线免费 | 成人av在线一区二区 | 久久久免费看视频 | 国产成人亚洲在线观看 | 午夜美女视频 | 久久一区二区三区国产精品 | 久久精品国产亚洲精品2020 | 婷婷丁香激情综合 | 天天干,天天草 | 免费麻豆网站 | 欧美性春潮 | 中文字幕在线看人 | 激情欧美丁香 | 国产成人a亚洲精品 | 天堂成人在线 | 在线成人性视频 | 亚洲在线网址 | 中文字幕在线观看不卡 | 色资源中文字幕 | 日本性动态图 | 成人精品一区二区三区电影免费 | 欧美一区三区四区 | 国产成年免费视频 | 久久久久综合精品福利啪啪 | 国产小视频在线观看 | h动漫中文字幕 | 玖玖视频国产 | 五月婷在线播放 | 欧美成人在线免费观看 | 天堂v中文 | 在线亚洲午夜片av大片 | 久久激情综合网 | www.狠狠干| 人人澡视频 | 在线观看av免费观看 | 婷婷久草 | 最近免费在线观看 | 91在线你懂的 | 亚洲国产精品成人精品 | 天天操夜夜想 | 99在线免费视频 | 免费麻豆视频 | 99精品欧美一区二区三区 | 久久不色 | 午夜久久福利视频 | 久久精品亚洲一区二区三区观看模式 | 亚洲永久精品一区 | 伊人婷婷综合 | 综合久久精品 | 欧美无极色 | 91成人精品一区在线播放 | 天天操天天插 | 国产一级二级三级在线观看 | 成人在线免费小视频 | 日本精品一区二区三区在线观看 | 91精品国产91热久久久做人人 | 99精品国产一区二区三区麻豆 | 中文字幕不卡在线88 | 日韩1页 | 国产99精品在线观看 | 国产精品免费在线播放 | 久久精品激情 | 在线观看视频在线 | 亚洲精品88欧美一区二区 | 久久美女视频 | 亚洲欧美婷婷六月色综合 | 一本一本久久a久久精品牛牛影视 | 国模精品一区二区三区 | 美女网站黄在线观看 | 欧美精品一区二区三区四区在线 | 欧美一区日韩精品 | 日韩伦理片hd | 欧美性受极品xxxx喷水 | 成人在线网站观看 | 丁香视频全集免费观看 | 狠狠干狠狠艹 | 在线日韩精品视频 | 亚洲丝袜中文 | 亚洲午夜精 | av一级片在线观看 | 色中色资源站 | 一级黄色网址 | 人人看人人做人人澡 | 亚洲国产精品视频在线观看 | 国产网红在线 | 免费高清av在线看 | 色综合久久88色综合天天人守婷 | 91精品国产福利在线观看 | 中文字幕日韩伦理 | 欧美精品久久久久久久亚洲调教 | 精品免费久久 | 一区二区视| 精品毛片在线 | 国产精品久久久久久久久婷婷 | 久久久天堂 | 久久精品中文字幕一区二区三区 | 国产一级二级av | 黄色字幕网 | 国产成人免费网站 | 日韩免费在线观看视频 | 国语麻豆 | 91在线公开视频 | 二区三区在线 | 奇米网8888 | 久草影视在线观看 | 黄色av电影免费观看 | 免费看av片网站 | 色中文字幕在线观看 | 最新午夜 | 日本中文字幕高清 | 午夜精品一区二区三区在线视频 | 在线观看91视频 | 亚洲色图22p| 中文字幕 国产视频 | 六月丁香在线观看 | 亚洲理论影院 | 亚洲精品玖玖玖av在线看 | 黄色一二级片 | 久草在线电影网 | 国产一区二区三区视频在线 | 韩日电影在线免费看 | 国产无吗一区二区三区在线欢 | 国产xxxx做受性欧美88 | 久久精品三 | 日韩毛片在线免费观看 | 亚洲一区 影院 | 欧美激情精品久久久久久变态 | 色999在线 | 亚洲欧美精品一区 | 色多多在线观看 | 青青河边草免费观看完整版高清 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产一级淫片在线观看 | 国产一级黄色免费看 | 久久1电影院 | 国产精品普通话 | 午夜少妇av | 国产中文字幕在线免费观看 | 在线欧美最极品的av | 激情亚洲综合在线 | 久久免费黄色网址 | 久久99视频免费 | 欧美日韩在线播放一区 | 999成人国产 | 国产青草视频在线观看 | 深夜男人影院 | 69av久久| 欧美性久久久久久 | 国产永久网站 | 欧美日韩中文另类 | 黄色av一区二区三区 | 午夜视频二区 | 极品美女被弄高潮视频网站 | 免费观看高清 | 毛片基地黄久久久久久天堂 | 色婷婷激情四射 | 99精品视频一区二区 | 久久久久久高清 | 91久久爱热色涩涩 | 黄色av电影一级片 | 亚洲综合欧美激情 | 最新国产一区二区三区 | 免费欧美高清视频 | 啪一啪在线 | 狠狠干中文字幕 | 久久久久久久电影 | 99视频精品免费视频 | 国产高清在线a视频大全 | 特级黄色片免费看 | 久草在线视频网站 | 婷婷久久丁香 | 91污污视频在线观看 | 草久在线观看 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国产成人精品一区二三区 | 91av成人 | 国产免费又爽又刺激在线观看 | 精品久久毛片 | 丁香 婷婷 激情 | 99久久激情 | 韩国av三级 | 蜜桃av综合网 | 丁香五月网久久综合 | 91精品视频导航 | 亚洲成人影音 | 国产视频久久久久 | 亚洲国产视频在线 | 黄色影院在线播放 | av在线一级| 久久99精品热在线观看 | 免费久久久久久 | 久久草草影视免费网 | 国产美女永久免费 | 精品久久一二三区 | 国语对白少妇爽91 | .精品久久久麻豆国产精品 亚洲va欧美 | 久热香蕉视频 | 激情av网 | 欧美视频在线二区 | 日日射天天射 | 97超级碰碰| 亚洲视频一级 | 永久免费在线 | 国产欧美久久久精品影院 | 亚洲综合色视频 | 日韩欧美视频一区 | 亚洲精品18日本一区app | 国产香蕉视频在线播放 | 91最新视频 | 欧洲视频一区 | 嫩嫩影院理论片 | 国产手机视频精品 | 九九综合久久 | 欧美性超爽 | 黄色成人小视频 | 婷婷久久国产 | 毛片www | 久久久久久久久久福利 | 日日射天天射 | 在线观看中文字幕2021 | 国产精品成人自产拍在线观看 | 东方av在线免费观看 | 日本中文字幕在线观看 | 九九涩涩av台湾日本热热 | 国产午夜小视频 | 日韩在线 | 久久久999| 97超碰资源总站 | 国产高清在线免费 | 一区二区三区四区五区在线 | 精品久久99| 国产精品18久久久久久不卡孕妇 | 成人免费视频在线观看 | 成人av电影在线 | 国产精品系列在线播放 | 91传媒在线 | 激情欧美一区二区三区 | 久久成人18免费网站 | 97精品国产aⅴ | 黄色特级一级片 | 久久精品男人的天堂 | 亚洲 欧美 另类人妖 | 国产精品成人一区二区 | 手机av电影在线 | 亚洲精品乱码久久久一二三 | 中文字幕永久免费 | 国产精品美女在线 | 欧美激情亚洲综合 | 91九色porny在线 | 99这里只有精品99 | 国产五十路毛片 | av在线免费播放网站 | 成 人 黄 色 片 在线播放 | 最新高清无码专区 | 一区二区三区免费网站 | 欧美一级艳片视频免费观看 | 免费h在线观看 | 超碰97网站| 国产高清在线 | 午夜精品久久久99热福利 | 久久在线精品 | 国产一区二区观看 | 亚洲精品视频在线观看免费视频 | 国产精品手机看片 | 青青河边草免费 | 国产日韩欧美在线影视 | 国产精品久久久久久久久蜜臀 | 国产不卡一区二区视频 | 国产白浆视频 | 欧美日韩中文国产一区发布 | 久久在草 | 亚洲人人网 | 人人插人人 | 在线观看视频亚洲 | 人人看人人爱 | 高清美女视频 | 日韩免费视频线观看 | 在线免费黄 | 午夜视频在线观看网站 | 一区 二区电影免费在线观看 | 国产亚洲欧美一区 | 99久久99热这里只有精品 | 欧美二区三区91 | 国产伦理久久 | 成人免费中文字幕 | 亚洲激情电影在线 | 亚洲va欧美 | 亚洲精区二区三区四区麻豆 | 国产免费成人 | 国产精品美女久久久久久 | 91干干干 | 高清中文字幕av | 久久视频在线免费观看 | 欧美精品一二 | 成人av影视在线 | 日韩91在线 | 在线观看日韩 | 欧美另类人妖 | 人人射人人爱 | 亚洲另类视频在线观看 | .国产精品成人自产拍在线观看6 | av成人在线网站 | 天天色中文 | 天堂在线视频中文网 | 免费观看国产成人 | 99精品国产一区二区三区麻豆 | 天天操操操操操操 | 亚洲国产丝袜在线观看 | 久久韩国免费视频 | 最近中文字幕免费大全 | 色婷婷狠狠操 | 久久激情视频 久久 | 狠狠色网 | 五月激情久久久 | 国产小视频在线免费观看视频 | 手机av网站| av免费网站| 亚洲成人资源 | 久久久久免费观看 | 免费黄色a网站 | 久热国产视频 | 亚洲电影网站 | 亚洲日韩欧美一区二区在线 | 在线观看免费高清视频大全追剧 | 国产区在线视频 | 亚洲视频中文 | 24小时日本在线www免费的 | 97超碰免费在线 | 国产精品久久久久久久久久东京 | 久久免费大片 | 久久精品男人的天堂 | 中文字幕永久在线 | 亚洲成人999| 91精品伦理 | 欧美日韩一二三四区 | 夜夜操网 | 91.麻豆视频 | 草久久精品 | 天天鲁天天干天天射 | 国产精品久久久久久一二三四五 | 91影视成人| 久久成人一区 | 国产精品久久久久一区二区三区 | 免费精品视频在线 | 日本中文字幕在线免费观看 | 五月婷婷中文网 | 久久久资源 | 97天天综合网 | 亚洲精品美女久久久 | av免费在线观看网站 | 亚洲精品国偷自产在线91正片 | 亚洲免费永久精品国产 | wwwwww色| 2019免费中文字幕 | 国产美女网站视频 | 蜜臀久久99静品久久久久久 | 国产精品免费不 | 欧美一区二区三区在线看 | 国产极品尤物在线 | 在线观看va| 91大神在线观看视频 | 国产区精品视频 | 97视频免费在线 | 97在线精品视频 | 青青河边草免费 | 婷婷久久精品 | 亚洲国产小视频在线观看 | 日本精品一区二区三区在线播放视频 | 国产一卡二卡在线 | 精品一区二区免费在线观看 | 欧美精品中文字幕亚洲专区 | 国产一级片一区二区三区 | 特级黄录像视频 | 99日韩精品 | 成人黄大片 | 国产1区2区3区精品美女 | 亚洲综合欧美激情 | 久久99视频免费观看 | 黄色免费网站下载 | 日韩欧美视频免费观看 | 曰韩精品| 国产精品theporn | 久久图| 91麻豆精品国产91久久久久久 | 亚洲精品啊啊啊 | 在线免费观看国产视频 | 丁香花在线视频观看免费 | 伊人伊成久久人综合网小说 | 亚州精品天堂中文字幕 | 色老板在线 | 911久久香蕉国产线看观看 | 在线观看你懂的网址 | 在线不卡a | 色网免费观看 | 国产一性一爱一乱一交 | www.在线观看视频 | 色97在线 | 国产高清在线一区 | av先锋中文字幕 | 亚洲综合情 | 91女神的呻吟细腰翘臀美女 | 在线观看成人av | 国产高清免费观看 | 亚洲一二三久久 | 日批视频在线播放 | 精品国产视频在线 | 国内精品久久久久影院男同志 | 97人人精品 | 国产黄免费在线观看 | 国产精品爽爽久久久久久蜜臀 | 高清有码中文字幕 | 色天天综合久久久久综合片 | 黄色软件在线观看免费 | 丁香花在线观看视频在线 | 午夜久久久久久久久久久 | 欧美日韩高清一区 | 日日骑 | 在线中文字幕网站 | 亚洲精品国产精品久久99 | 日韩国产精品一区 | 亚洲精品中文在线资源 | 午夜成人免费电影 | 久久精品伊人 | 国产视频中文字幕 | 丁香激情综合 | 精品久久久国产 | 夜夜操夜夜干 | 国偷自产视频一区二区久 | 久久久国产精品一区二区中文 | 亚洲精品88欧美一区二区 | av福利在线导航 | 久久国产精品免费一区 | av电影一区二区三区 | 日本三级在线观看中文字 | 天天操网站| 色网站在线 | 国产精品99久久免费黑人 | 久久视频精品 | 91久久奴性调教 | 99精品视频一区 | 亚洲精品视频在线看 | 精品在线看 | 91桃色在线观看视频 | 亚洲精品在线免费观看视频 | 日韩午夜电影 | 久久久国产精品一区二区中文 | 99在线免费视频观看 | 午夜日b视频 | 日韩欧美视频免费在线观看 | 国产亚洲精品久久久久久移动网络 | 五月开心色 | 中文国产在线观看 | 欧美性大胆 | 99激情网| 欧美日本不卡视频 | 久久精品视频4 | 亚洲黄色小说网 | 在线观看理论 | 亚洲另类视频在线观看 | 日韩一区二区三免费高清在线观看 | 国产日韩精品一区二区 | 午夜久久福利 | 天天色天天综合 | 综合伊人av | 射久久 | 玖玖综合网 | 欧美日韩免费视频 | 欧美日韩中文国产一区发布 | 亚洲激情在线视频 | 国产精品电影一区 | 国产精品免费看久久久8精臀av | 精品999在线观看 | 亚洲成人精品影院 | 日本精a在线观看 | 日韩欧美一区二区三区在线观看 | 99精品视频在线看 | 97在线精品国自产拍中文 | 亚洲综合欧美激情 | 欧美日韩国产精品一区二区三区 | 国产在线观看污片 | 999视频网| 久久国产精品免费观看 | 亚洲综合一区二区精品导航 | 六月色丁香 | 久久精品视频18 | 五月激情av| 日韩精品大片 | 色婷婷视频 | 国产精品成人a免费观看 | 毛片区| 精品国产乱码一区二 | 久久伊人爱 | 毛片二区 | 国产小视频网站 | 午夜色性片 | 日韩av资源站| 免费亚洲黄色 | 日日操操 |