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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

《分布式事務科普》是我在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 日志即可,這個步驟非??焖俚乜梢酝瓿?#xff1b;當 TM 決議全局回滾時,RM 收到 TC 發送的回滾請求,RM 通過 XID 找到對應的 undo log 回滾日志,然后執行回滾日志完成回滾操作。

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

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

    第一階段

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

    第二階段

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

    如果決議是全局回滾,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異??刂?/h3>

    在有了一套完備的 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柔性事務。柔性事務的理念則是通過業務邏輯將互斥鎖操作從資源層面上移至業務層面。通過放寬對強一致性要求,來換取系統吞吐量的提升。另外提供自動的異?;謴蜋C制,可以在發生異常后也能確保事務的最終一致。

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

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

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

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

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

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

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

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

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

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

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

    • ......

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

    總結

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

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

    国产三级在线播放 | 成人久久国产 | 视频在线观看99 | 人人干人人超 | 国产在线高清 | 不卡精品视频 | 在线观看久草 | 久草视频在线免费看 | 欧美日韩免费观看一区二区三区 | 成人国产综合 | 黄色www | 亚州精品天堂中文字幕 | 免费三级影片 | 成人av教育| 91精品国产亚洲 | 91桃色免费视频 | 亚洲aⅴ在线 | 成人性生交大片免费观看网站 | 久久精品99北条麻妃 | 一区二区不卡视频在线观看 | www在线免费观看 | 日b视频国产 | 国产一区二区三区午夜 | 国产一级片免费观看 | 夜夜爽夜夜操 | 欧美精品乱码99久久影院 | 国产精品久久久久久久久久久久久 | 91av福利视频 | 久久涩涩网站 | 中文字幕av全部资源www中文字幕在线观看 | 亚洲美女精品视频 | 精品视频www| 中文字幕av播放 | 欧洲亚洲国产视频 | 午夜av免费观看 | www色,com | 久久久久久久久免费视频 | 国产成人在线播放 | 久草在线观看资源 | 欧美日韩久久不卡 | 免费精品在线视频 | 久久久精品久久日韩一区综合 | 91视频在线观看免费 | 一区二区三区动漫 | 亚洲精品美女久久久 | 久久久久久久久久久久影院 | 一区精品在线 | 中文字幕专区高清在线观看 | 亚洲视频 中文字幕 | 999视频在线播放 | 6080yy午夜一二三区久久 | 久久九九免费视频 | av女优中文字幕在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 天天伊人狠狠 | 精选久久 | 亚洲精品xxxx | 亚洲激情 欧美激情 | 黄色av一级 | 国产精品欧美久久久久天天影视 | 高清国产一区 | 成年人国产视频 | 久久精国产 | 国产精品激情 | 国产精品日韩在线 | 午夜精品久久久99热福利 | 日韩中文字幕91 | 国产精品婷婷午夜在线观看 | 国产黄色精品视频 | 在线观看成人国产 | 婷婷色综合网 | 永久黄网站色视频免费观看w | 97电影网站| 欧美污网站 | 操少妇视频 | 人人爽人人爽人人爽学生一级 | www.com.日本一级 | 日韩在线激情 | 午夜久久福利视频 | 97精品在线观看 | 日韩精品黄 | 免费久久99精品国产 | 婷婷综合 | 成人久久精品视频 | 人人爽人人 | 日日射av| 欧美91精品久久久久国产性生爱 | 欧美日韩精品在线观看视频 | 综合久久久久久 | 草久在线视频 | 中文字幕123区 | 999成人国产 | 亚洲精品合集 | 日日操操操 | 国产日韩精品一区二区 | 97国产精品| 国产一区二区三区 在线 | 国产精品 久久 | 欧美精品在线一区二区 | 欧美日本在线观看视频 | 国产不卡视频在线播放 | 欧美看片| 99久久精品午夜一区二区小说 | 一级性视频| 久久国产日韩 | 久久精品99国产 | 最新av在线网站 | 亚洲 成人 一区 | avcom在线 | 91免费看黄色 | 国产午夜三级一区二区三桃花影视 | www.91av在线 | 午夜视频在线网站 | 日韩综合第一页 | 91最新网址 | 日韩电影在线视频 | 国产亚洲精品久久久久久久久久 | av中文资源在线 | 午夜骚影 | 久久情侣偷拍 | 亚洲欧洲国产日韩精品 | av电影久久| 久草视频一区 | 91中文在线视频 | 国产精品电影一区 | 成人小视频在线播放 | 色噜噜狠狠狠狠色综合久不 | 久久影院精品 | 午夜精品久久久久久久久久久久久久 | 91尤物国产尤物福利在线播放 | 国产精品一区二区三区观看 | 97超碰人人澡人人 | 国产精品 中文字幕 亚洲 欧美 | 国产精品18久久久久久久网站 | 美腿丝袜一区二区三区 | 亚洲综合在线视频 | 国产成人久久av | 黄色av在 | 精品国产三级 | 亚洲激精日韩激精欧美精品 | 在线播放av网址 | 91av视频在线播放 | 精品欧美小视频在线观看 | 黄色一及电影 | 99热官网 | av成年人电影 | 国产精品第一视频 | 日韩国产精品久久 | 中文字幕日韩一区二区三区不卡 | 欧洲一区精品 | 天天干天天天天 | 天天色综合久久 | 成年人免费av| 色在线免费观看 | 欧美在线aaa | h视频在线看 | 久草在线电影网 | 成人精品视频久久久久 | 91大神精品视频在线观看 | 中文字幕在线看视频国产 | 亚洲国产一区在线观看 | 日本护士三级少妇三级999 | 天天操月月操 | 激情视频区 | 777视频在线观看 | 黄色国产在线 | 久久理论电影 | 999久久久免费精品国产 | 51久久夜色精品国产麻豆 | 男女免费视频观看 | 麻豆免费视频观看 | 久久国产手机看片 | 国产黄色在线网站 | 欧美a级在线免费观看 | 在线成人一区 | 国产热re99久久6国产精品 | 久久成人欧美 | 激情丁香综合 | 久久精品中文字幕免费mv | 992tv又爽又黄的免费视频 | 日本中文乱码卡一卡二新区 | 精品极品在线 | 中文字幕在线观看一区二区 | 色午夜| 亚洲成av人影院 | 日本中文在线播放 | 激情深爱.com | 9ⅰ精品久久久久久久久中文字幕 | 成人av在线播放网站 | 中文字幕 国产专区 | 国产一级久久久 | 日韩精品亚洲专区在线观看 | 中文字幕免费高清在线 | 日日射av| 天天色天 | 婷婷婷国产在线视频 | 午夜丁香视频在线观看 | 永久免费毛片在线观看 | 九九亚洲视频 | 激情影音 | 久久久免费播放 | 免费看一级特黄a大片 | 欧美日本在线观看视频 | 亚洲九九九 | 亚洲欧美日韩中文在线 | 国产黄色资源 | 国产视频黄 | 国产一区不卡在线 | 久久综合久久鬼 | 亚洲精品高清一区二区三区四区 | 色婷婷电影网 | 亚洲aⅴ在线观看 | 久久精品成人 | 久艹视频免费观看 | 欧美亚洲xxx| 五月天com | 国产精品观看视频 | 国产精品密入口果冻 | 久久人人做 | 天天爽天天爽天天爽 | 伊人久久一区 | 久久丁香网 | 日韩精品中文字幕av | 99久久99久久精品国产片 | 中文字幕在线视频一区二区三区 | 国产成人精品电影久久久 | 久久国产精品一区二区 | 亚洲精品自拍视频在线观看 | 久久久久久久久久久综合 | 欧美日韩国产一区二区在线观看 | 免费在线观看一区二区三区 | 男女拍拍免费视频 | 国产福利在线不卡 | 亚在线播放中文视频 | 免费影视大全推荐 | 日批网站免费观看 | 国产一区二区三区在线 | 狠狠色丁香婷婷综合久小说久 | 日韩丝袜 | 欧美综合久久久 | 久久成人一区二区 | 欧美一级乱黄 | 久久久久久久影视 | 久久精品艹 | 五月色综合 | 99热99re6国产在线播放 | 国产一区二区高清 | 久久久www成人免费精品 | 99久久精品视频免费 | av日韩国产 | 久久人人97超碰国产公开结果 | 99在线观看免费视频精品观看 | 久久午夜免费观看 | 国产精品欧美激情在线观看 | 精品网站999www | 午夜精品一区二区三区在线视频 | 深爱激情av | 成年人av在线播放 | 91亚洲精品久久久中文字幕 | 亚洲精品综合久久 | 在线国产一区 | 成人性生交大片免费观看网站 | 97热久久免费频精品99 | 久久草网站 | 日韩欧美xxxx | 在线免费国产 | 丁香激情综合国产 | 中文字幕一区二区三区四区在线视频 | 在线看黄色av | 国产日韩欧美综合在线 | 2018亚洲男人天堂 | 综合在线亚洲 | 在线电影日韩 | 久久精品中文字幕少妇 | 一区二区三区四区久久 | 国产福利一区二区在线 | 天堂在线一区二区 | 天天激情在线 | 黄色av网站在线免费观看 | 欧美日韩一区二区在线 | 国产经典 欧美精品 | 国产精品美女久久久久aⅴ 干干夜夜 | 国产毛片久久 | 亚洲精品字幕在线观看 | 久久三级毛片 | 色五婷婷| 精品综合久久 | 国产精品久久久影视 | 丁香视频在线观看 | 在线观看免费av网站 | 狠狠综合久久av | 中文字幕a∨在线乱码免费看 | 亚洲国产精品久久久 | 久久国产网站 | 欧美色图另类 | 超碰伊人网 | 免费91在线 | 在线观看视频色 | 又长又大又黑又粗欧美 | av电影免费观看 | 亚洲黑丝少妇 | 中文av资源站 | 久久丁香 | 在线日韩亚洲 | 国产无套精品久久久久久 | 国产xxxx性hd极品 | 国产精品一区二区久久精品爱微奶 | 久久一区二区三区国产精品 | 一区二区三区影院 | 美女黄频在线观看 | 中文字幕乱码视频 | 天天综合色网 | 久久99亚洲精品久久 | 2021国产在线 | 国产特级毛片aaaaaa高清 | 国产精品美女免费看 | 国产又粗又猛又色又黄视频 | 精品一区二区三区久久 | 久草在线观 | 黄色三几片 | 国产九九在线 | 最近中文字幕视频网 | 日韩亚洲国产中文字幕 | 久久九九影视网 | 久久9999久久免费精品国产 | av电影av在线 | 综合网成人 | 97成人精品视频在线播放 | 99热这里是精品 | 国产亚洲日 | 中文一二区 | 91精品网站 | 欧美性生交大片免网 | 国产精品成 | 久久男人中文字幕资源站 | 久久久官网 | 天堂网av 在线 | 国产精品av电影 | 夜夜夜夜操 | 日韩大片免费观看 | 99r精品视频在线观看 | 91福利视频久久久久 | 视频二区在线 | 人人超碰人人 | 国产日产av| 日韩大片在线播放 | 中文字幕在线观看三区 | 欧美小视频在线观看 | 天天干夜夜爽 | 婷婷色在线视频 | 午夜国产在线 | 99在线精品免费视频九九视 | 青青河边草免费视频 | 2023天天干| 狠狠色伊人亚洲综合成人 | 韩国精品一区二区三区六区色诱 | 99免费精品视频 | 日本最新高清不卡中文字幕 | 中文字幕在线日亚洲9 | 麻豆视频国产在线观看 | 欧美在线一二区 | 久久久久国产精品www | 夜夜躁日日躁 | 免费进去里的视频 | 欧美在线久久 | 在线视频手机国产 | 国产视频精品视频 | 全黄网站| 天天色天天干天天 | 97超级碰 | 成人精品影视 | 91禁在线看 | 97超碰人人澡人人爱 | 精品福利在线视频 | 免费看的黄色的网站 | 99久久精品免费看国产四区 | av在线最新 | 97超在线 | 欧美一性一交一乱 | 91在线中字 | 亚洲五月 | 亚洲砖区区免费 | 永久免费av在线播放 | 97精品国产 | 中文字幕电影一区 | 国产精品高潮久久av | 成人黄色小说网 | 日韩在线观看高清 | 免费观看国产精品 | 欧美日韩免费视频 | 麻豆国产露脸在线观看 | 欧美日韩一区二区三区在线观看视频 | 91精品在线免费观看视频 | 六月丁香婷婷网 | 最近中文字幕视频完整版 | 国产99久久久国产精品免费看 | 综合五月婷婷 | 国色综合| 在线观看免费观看在线91 | 亚洲色图22p| 欧美天天综合 | 草樱av | 国产激情小视频在线观看 | 色wwww| 五月天综合网 | 五月婷婷丁香网 | 狠狠色丁香婷婷综合久小说久 | 日韩免费一区二区在线观看 | 最新av在线网站 | 欧美一级片在线播放 | 亚洲aⅴ一区二区三区 | 亚洲视屏在线播放 | 激情综合五月天 | av超碰在线| 国产精品综合久久久久久 | 97成人免费视频 | 久久婷婷综合激情 | a久久久久久 | 成年人黄色免费网站 | av日韩av| 国产一区在线视频观看 | 国产黑丝一区二区三区 | 亚洲伦理中文字幕 | 成人国产电影在线观看 | 91免费在线视频 | 激情五月综合 | 精品久久久免费视频 | 国产精品久久久久久久久久久免费看 | 国产91亚洲 | 欧美在线视频免费 | 成人久久18免费网站图片 | 欧美激情片在线观看 | 天堂在线一区二区 | 欧美日产在线观看 | 国产美女精彩久久 | 六月丁香在线视频 | 久久精品5| 亚州精品国产 | 久久婷婷综合激情 | 亚洲国产精品成人av | 网址你懂的在线观看 | 久久人操| 日韩精品无 | 国产精品对白一区二区三区 | 国产精品成人免费精品自在线观看 | 久久精品99久久久久久 | 成 人 免费 黄 色 视频 | 看片的网址 | 97人人澡人人添人人爽超碰 | 久热国产视频 | 成人av av在线 | 国产免费又爽又刺激在线观看 | 久久激情五月丁香伊人 | 日韩午夜av | 国产精品久久久久久吹潮天美传媒 | 久久久久综合网 | 久久久国产一区二区三区四区小说 | 成人av在线影视 | 久久免费国产精品 | 久久深爱网 | 久久免费观看少妇a级毛片 久久久久成人免费 | 日本久热 | 国产精品电影在线 | 西西人体4444www高清视频 | 免费成人在线电影 | 伊人电影在线观看 | 婷婷深爱| av短片在线观看 | 波多野结衣精品 | 韩国一区二区三区在线观看 | 97色婷婷| 最新日韩电影 | 色偷偷88欧美精品久久久 | 四虎在线永久免费观看 | 国产在线中文 | 欧美日在线观看 | 国产精品免费麻豆入口 | 精品一区三区 | 国产精品久久久久久久久婷婷 | 一区二区电影在线观看 | 国产精品福利在线观看 | 四虎永久免费网站 | 亚洲精品综合在线观看 | 97国产大学生情侣酒店的特点 | 国产精品免费视频网站 | 97手机电影网 | 91av视频在线观看免费 | 欧美日韩一区二区三区不卡 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 日本精a在线观看 | 亚洲综合在线播放 | 久久成人资源 | 国产成人精品午夜在线播放 | 最新日韩在线观看视频 | 久久综合色播五月 | 欧美亚洲一区二区在线 | 香蕉视频在线观看免费 | 亚洲不卡在线 | 97av色 | 亚洲国产av精品毛片鲁大师 | 99国产精品久久久久久久久久 | 色综合在| 天天天天天干 | 久久美女精品 | 在线观看视频一区二区三区 | 久久久久久久久久久影视 | 欧美精品乱码久久久久久按摩 | 一区二区中文字幕在线观看 | 天天干天天摸天天操 | 精选久久 | 日韩欧美一区二区三区视频 | 亚洲一二三在线 | 丁香婷婷激情国产高清秒播 | av电影一区二区三区 | 亚洲高清视频在线观看免费 | 欧美成人日韩 | 久久电影网站中文字幕 | 国产成人免费精品 | 97超碰人人模人人人爽人人爱 | 99精品视频在线观看视频 | 五月天久久婷 | av综合站 | 精品国产视频在线 | 日韩在线视频网址 | 精品视频在线播放 | 免费福利视频网站 | 国产日韩欧美在线一区 | 91porny九色在线播放 | 久久精品99久久久久久2456 | 日本精品一区二区 | 久久草视频 | 欧美福利网址 | 亚洲欧洲一区二区在线观看 | 高清不卡一区二区在线 | 精品国产综合区久久久久久 | 亚洲激情视频在线观看 | 国产精品18久久久 | 国产中文字幕视频在线观看 | 五月天国产 | 在线看av网址| 97超碰人人澡人人 | 国产伦精品一区二区三区照片91 | av丝袜制服| 人人干人人干人人干 | 亚洲成a人片综合在线 | 久久综合中文字幕 | 国产精品成人免费精品自在线观看 | 国产尤物在线视频 | 午夜久久久久久久久久影院 | 欧美小视频在线观看 | 成年人看片网站 | 久久999精品| 中文字幕永久免费 | 人人玩人人爽 | 99精品观看| 丁香色婷| 97超碰人人澡人人爱学生 | 国产精品久久久久久久久婷婷 | 在线天堂日本 | 国产一区二区精品在线 | 亚洲国产成人久久综合 | 免费成视频 | 亚洲综合欧美精品电影 | 波多野结衣在线播放一区 | 免费观看一区二区 | 97在线观看免费视频 | 99久热在线精品 | av网站在线观看播放 | 一区二区三区 中文字幕 | 欧美日韩国产区 | 日本中文字幕影院 | 欧美男女爱爱视频 | 天天干 天天摸 天天操 | 国产免费嫩草影院 | 色综合久久五月天 | 一区二区三区四区精品视频 | 亚洲国产黄色片 | 丁香资源影视免费观看 | 亚洲精品国产精品久久99 | www.成人精品 | 色姑娘综合天天 | 丁香综合五月 | 久久久亚洲电影 | 亚洲精品在线观 | 丁香花中文在线免费观看 | www久久 | 欧美精品二| 成人av免费在线看 | 911久久| 欧美成人黄色片 | 香蕉网在线 | 久久国产精品一区二区三区 | 国产成人免费精品 | 亚洲另类视频在线 | 国产色小视频 | 波多野结衣亚洲一区二区 | 正在播放久久 | 福利在线看片 | 国产精品99在线播放 | 91在线一区二区 | 水蜜桃亚洲一二三四在线 | 91亚洲成人| 999抗病毒口服液 | 亚洲欧美日韩在线看 | 一区二区三区高清在线 | 99 久久久久 | 国产字幕在线看 | 久久久免费观看完整版 | 午夜黄色| 国产又粗又猛又黄又爽视频 | 成人黄色在线 | 91精品国产一区二区在线观看 | 天天综合色 | www.久热| www免费网站在线观看 | 青草视频在线免费 | 日精品| 久久久久久久久黄色 | 91九色在线观看视频 | 天天亚洲| 九九热免费观看 | 日本成人黄色片 | 国产精品久久久久永久免费 | 一级一片免费看 | 免费看网站在线 | 久久久久久久久国产 | 91在线视频免费 | 欧美成人久久 | 天堂av在线网址 | 日韩欧美一区二区三区免费观看 | 天天干天天想 | 免费色网站 | 免费日韩 精品中文字幕视频在线 | 国产精品涩涩屋www在线观看 | 久久五月精品 | 日本色小说视频 | 成人免费观看网站 | 欧美日韩91 | 国产精品综合久久 | 综合网婷婷| 美女视频永久黄网站免费观看国产 | www色av| 97人人模人人爽人人喊网 | 欧美一级黄色视屏 | 最新国产一区二区三区 | 久草免费在线视频 | 97碰在线| 日韩免费一级电影 | 综合网婷婷 | 人人看人人草 | 天天视频亚洲 | 国产一区二区不卡视频 | 99视频在线免费看 | 久久久香蕉视频 | 日韩视频一区二区 | 欧美大片在线观看一区 | 国产日产欧美在线观看 | 69绿帽绿奴3pvideos | 中文字幕人成乱码在线观看 | 日韩网站在线观看 | 午夜精品久久久久久久99 | 午夜av在线播放 | 免费久久99精品国产 | 国产精品久久久久久久久免费看 | 久久久影片| 99视频播放 | 9999精品视频 | 亚洲精品在线免费看 | 久久久国产视频 | 曰本免费av| 日韩精品一区二区不卡 | 亚洲综合色激情五月 | 国产黄色免费在线观看 | 高清精品久久 | 99av国产精品欲麻豆 | 99久久久成人国产精品 | 99久久精品电影 | 91精彩视频在线观看 | 国产精品99久久久久的智能播放 | 亚洲精品在线视频 | 亚洲一区尤物 | 2021国产精品 | 在线观看www. | 激情久久综合网 | 99这里只有精品99 | 粉嫩高清一区二区三区 | 九九视频这里只有精品 | 天天综合导航 | 久久久噜噜噜久久久 | 少妇性xxx| 一级免费看视频 | 欧美色精品天天在线观看视频 | 一级特黄aaa大片在线观看 | 超碰在线人人艹 | 国产精品美女免费视频 | 69av在线播放 | 国产理伦在线 | 丰满少妇在线观看资源站 | 国产精品一区二区免费看 | 免费精品国产va自在自线 | 操操操com | 国产精品 日韩 欧美 | 免费在线观看成人小视频 | 97碰在线视频 | 99亚洲国产| 国产日韩在线播放 | 日韩av一区二区在线影视 | 亚洲精品xx | 日本在线观看视频一区 | 全黄网站| 免费网址你懂的 | 亚洲国产一区av | 欧美日韩高清一区二区三区 | 亚洲精品久久久久中文字幕m男 | 久久久综合精品 | 亚洲三级网 | 成人小电影在线看 | 欧美色图亚洲图片 | 91看成人 | 久久久久久久久久久久久久av | a级片韩国 | 国产精品久久久久久久久岛 | 黄色av一区二区 | 亚洲精品视频www | 中文在线免费看视频 | 免费av在线网站 | 午夜影院在线观看18 | 成人久久 | 欧美日本啪啪无遮挡网站 | 久久久久久久av麻豆果冻 | 五月婷婷.com | 在线免费观看涩涩 | 亚洲视频1区2区 | 日韩av在线不卡 | 亚洲成人av电影在线 | av丁香| 精品国产激情 | 中文字幕欧美日韩va免费视频 | 成人久久影院 | 欧美日韩不卡在线 | 91麻豆精品国产91久久久无限制版 | 色天堂在线视频 | 久久无码av一区二区三区电影网 | 国产精品福利在线 | 看av免费网站 | 日韩欧美在线观看 | 91视频 - v11av | 国产 欧美 日韩 | 九九视频免费在线观看 | 国产精品国产三级在线专区 | 久久精品精品电影网 | 日韩理论在线观看 | 四虎国产精品永久在线国在线 | 日韩av中文 | 国产精品日韩久久久久 | 亚洲成色 | 国产美女在线精品免费观看 | 91在线视频导航 | 免费看国产一级片 | 人人干人人草 | 久久99久久99精品免观看软件 | 亚洲久草视频 | 精品91| 手机色在线 | av成人动漫在线观看 | 亚洲人成在线电影 | 视频在线观看入口黄最新永久免费国产 | 国产高清不卡一区二区三区 | 最新在线你懂的 | 色噜噜在线观看视频 | 久久久久久久久影视 | 久久精品综合网 | 国产精品美女 | 美女中文字幕 | 韩日精品视频 | 狠狠躁夜夜a产精品视频 | 国产精品久久久 | 成人在线视频免费观看 | 五月天堂色 | 米奇四色影视 | 久久久久久久久久久久亚洲 | 亚洲日本va午夜在线影院 | 69av在线播放 | 欧美色噜噜 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 探花视频在线观看免费 | 99色人 | 国产精品6 | 精品一区免费 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 色婷婷国产精品一区在线观看 | 91视频下载 | 国产精品视频地址 | 又湿又紧又大又爽a视频国产 | 国产精品一区二区在线观看免费 | 在线免费黄网站 | 99精品色 | 久久人人插 | 狠狠色丁香婷婷综合最新地址 | 国产欧美精品一区二区三区 | 91免费在线播放 | 视频一区二区免费 | 亚洲精品国产第一综合99久久 | 久久影视网 | 日韩欧美一区二区三区免费观看 | 91视频国产免费 | 天天爽天天碰狠狠添 | 欧美日韩中文另类 | 免费美女av | 午夜色婷婷 | 国产一区精品在线观看 | avove黑丝| 日韩精品久久久久久久电影竹菊 | 蜜臀av一区二区 | 亚洲免费色 | 91视频高清| 99热在线国产精品 | 国产精品乱码高清在线看 | 欧美激情精品久久久久久免费印度 | 久久免费精彩视频 | 九草在线观看 | 日韩成人免费在线 | 国产精品一区二区在线观看 | 国产精品黄网站在线观看 | 中文字幕在线观看免费高清电影 | 久久高清 | 国产精品区在线观看 | 69夜色精品国产69乱 | 国产精品成人a免费观看 | 久久视频免费观看 | 亚洲视频综合 | 免费视频a | 激情欧美一区二区三区免费看 | 日韩欧美黄色网址 | 在线 影视 一区 | 日本在线观看中文字幕 | 日韩色视频在线观看 | 天天干夜夜 | 成人9ⅰ免费影视网站 | 一级黄色av | 欧美精品色 | 狠狠色丁香婷婷综合久久片 | 国产精品18久久久久久首页狼 | 五月情婷婷| 欧美日在线观看 | 麻豆视频免费观看 | 欧美一二三区在线观看 | 国产午夜精品一区二区三区四区 | 婷婷综合视频 | 欧美一级黄大片 | 亚洲婷婷免费 | 99视频在线 | 天天看天天干 | 中文字幕日韩一区二区三区不卡 | 天天鲁天天干天天射 | 久久一本综合 | 国产精品一区二区三区观看 | avv天堂| 开心色停停 | 亚洲天堂网站 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 精品久久久精品 | 国产黄色a | 久久五月精品 | 久久久久国产精品一区 | 美女中文字幕 | 亚洲精品大片www | 欧美在线视频一区二区三区 | 2018好看的中文在线观看 | 国产高清免费在线播放 | 麻豆视频在线 | 一区精品在线 | 成人免费电影 | 在线免费观看黄色小说 | 激情综合电影网 | 亚洲国产福利视频 | 婷婷伊人综合亚洲综合网 | 亚欧洲精品视频在线观看 | 久久婷婷国产色一区二区三区 | 99久久毛片| 久久香蕉电影 | 国产一级a毛片视频爆浆 | 黄色午夜 | 99久久国产免费,99久久国产免费大片 | 免费国产在线观看 | 国产在线观看91 | 五月天色综合 | 99热这里只有精品1 av中文字幕日韩 | www.色午夜.com| 国产中文在线播放 | 波多野结衣视频一区二区三区 | 在线视频你懂 | 一区二区不卡视频在线观看 | 天天射天天射天天 | 国产精品青青 | 在线中文字幕av观看 | 人人爽人人干 | 欧美日韩破处 | 99热免费在线 | 久久精品免费观看 | 九九久久精品视频 | 亚洲精品在线播放视频 | 国产欧美精品一区二区三区 | 国产精品自产拍在线观看网站 | 日韩免费二区 | 欧洲亚洲女同hd | 色国产精品一区在线观看 | 亚洲精品乱码久久久久久蜜桃欧美 | 在线观看精品一区 | 91视频免费播放 | 日韩欧美电影在线观看 | 日韩视频一区二区三区在线播放免费观看 | 九色在线视频 | 色六月婷婷 | 日韩久久午夜一级啪啪 | 在线观看免费黄色 | 欧洲一区精品 | 最新99热| 国产视频一区在线免费观看 | 国产在线久久久 | 97精品国产91久久久久久久 | 伊人天堂网 | 亚洲欧美日韩精品久久久 | 天天操比 | 亚洲一区二区三区四区精品 | 日韩丝袜视频 | 免费福利片 | 亚洲精品乱码久久久一二三 | 麻豆视频在线 | 97视频在线观看视频免费视频 | 久久久国产精品人人片99精片欧美一 | 91成人免费在线 | 精品久久久一区二区 | 奇米先锋 | 午夜国产在线 | 国产高清在线一区 | 国产在线精品视频 | 欧美三级高清 | 久久高清 | 激情 婷婷| 日韩在线免费播放 | 国产精品毛片一区二区三区 | 天天草夜夜 | 国产精品视频全国免费观看 | 欧洲精品二区 | 久久久污 | 香蕉视频免费在线播放 | 日韩精品一区二区在线观看 | 99精品视频精品精品视频 | 国产系列在线观看 | 人人草在线视频 | 免费视频一级片 | 成人av一区二区在线观看 | 国产精品1区2区 | 成人一区二区三区中文字幕 | 麻豆超碰 | 成人资源在线 | 亚洲在线黄色 | 久久99深爱久久99精品 | 久久久久成人精品 | 91精品国产高清自在线观看 | 久久这里只有精品首页 | 在线色亚洲 | 国产99久久久久久免费看 | 国产成人精品一区二区三区免费 | 成 人 黄 色视频免费播放 | 日韩在线观看你懂的 | 久久人人爽人人爽 | 香蕉97视频观看在线观看 | 91黄色免费网站 | 婷婷六月网 | 久久久久久久久久久久影院 | 欧美精品久久久久久久久久 | 国产在线观看xxx | 视频1区2区 | 在线免费黄色av | free,性欧美| 黄色网在线免费观看 | 久久激情视频 久久 | 99久久激情视频 | 在线观看色网 | 99久久婷婷国产综合亚洲 | 久久久www成人免费毛片 | 99在线视频观看 | 97视频精品 | 精品黄色视 | 国产一区二区在线免费 | 国内精品久久久久久久影视麻豆 | 亚洲六月丁香色婷婷综合久久 | 免费看国产一级片 | 日韩一区二区免费在线观看 | 一级精品视频在线观看宜春院 | 国产精品99精品久久免费 | 国产美女网 | 国产精品毛片一区视频播 | 久久伊人国产精品 | 中文字幕乱码电影 | 久久亚洲国产精品 |