成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分布式事務(wù)如何實(shí)現(xiàn)?深入解讀 Seata 的 XA 模式

開發(fā) 架構(gòu) 分布式
XA 模式的加入,補(bǔ)齊了 Seata 在 全局一致性 場(chǎng)景下的缺口,形成 AT、TCC、Saga、XA 四大 事務(wù)模式 的版圖,基本可以滿足所有場(chǎng)景的分布式事務(wù)處理訴求。

Seata 1.2.0 版本重磅發(fā)布新的事務(wù)模式:XA 模式,實(shí)現(xiàn)對(duì) XA 協(xié)議的支持。

[[324167]]

這里,我們從三個(gè)方面來深入解讀這個(gè)新的特性:

  • 是什么(What):XA 模式是什么?
  • 為什么(Why):為什么支持 XA?
  • 怎么做(How):XA 模式是如何實(shí)現(xiàn)的,以及怎樣使用?

1. XA 模式是什么?

這里有兩個(gè)基本的前置概念:

  1. 什么是 XA?
  2. 什么是 Seata 定義的所謂 事務(wù)模式?

基于這兩點(diǎn),再來理解 XA 模式就很自然了。

1.1 什么是 XA?

XA 規(guī)范 是 X/Open 組織定義的分布式事務(wù)處理(DTP,Distributed Transaction Processing)標(biāo)準(zhǔn)。

XA 規(guī)范 描述了全局的事務(wù)管理器與局部的資源管理器之間的接口。 XA規(guī)范 的目的是允許的多個(gè)資源(如數(shù)據(jù)庫(kù),應(yīng)用服務(wù)器,消息隊(duì)列等)在同一事務(wù)中訪問,這樣可以使 ACID 屬性跨越應(yīng)用程序而保持有效。

XA 規(guī)范 使用兩階段提交(2PC,Two-Phase Commit)來保證所有資源同時(shí)提交或回滾任何特定的事務(wù)。

XA 規(guī)范 在上世紀(jì) 90 年代初就被提出。目前,幾乎所有主流的數(shù)據(jù)庫(kù)都對(duì) XA 規(guī)范 提供了支持。

1.2 什么是 Seata 的事務(wù)模式?

Seata 定義了全局事務(wù)的框架。

全局事務(wù) 定義為若干 分支事務(wù) 的整體協(xié)調(diào): 

  1. TM 向 TC 請(qǐng)求發(fā)起(Begin)、提交(Commit)、回滾(Rollback)全局事務(wù)。
  2. TM 把代表全局事務(wù)的 XID 綁定到分支事務(wù)上。
  3. RM 向 TC 注冊(cè),把分支事務(wù)關(guān)聯(lián)到 XID 代表的全局事務(wù)中。
  4. RM 把分支事務(wù)的執(zhí)行結(jié)果上報(bào)給 TC。(可選)
  5. TC 發(fā)送分支提交(Branch Commit)或分支回滾(Branch Rollback)命令給 RM。

Seata 的 全局事務(wù) 處理過程,分為兩個(gè)階段:

  • 執(zhí)行階段 :執(zhí)行 分支事務(wù),并 保證 執(zhí)行結(jié)果滿足是 可回滾的(Rollbackable) 和 持久化的(Durable)。
  • 完成階段: 根據(jù) 執(zhí)行階段 結(jié)果形成的決議,應(yīng)用通過 TM 發(fā)出的全局提交或回滾的請(qǐng)求給 TC,TC 命令 RM 驅(qū)動(dòng) 分支事務(wù) 進(jìn)行 Commit 或 Rollback。

Seata 的所謂 事務(wù)模式 是指:運(yùn)行在 Seata 全局事務(wù)框架下的 分支事務(wù) 的行為模式。準(zhǔn)確地講,應(yīng)該叫作 分支事務(wù)模式。

不同的 事務(wù)模式 區(qū)別在于 分支事務(wù) 使用不同的方式達(dá)到全局事務(wù)兩個(gè)階段的目標(biāo)。即,回答以下兩個(gè)問題:

  • 執(zhí)行階段 :如何執(zhí)行并 保證 執(zhí)行結(jié)果滿足是 可回滾的(Rollbackable) 和 持久化的(Durable)。
  • 完成階段: 收到 TC 的命令后,如何做到分支的提交或回滾?

以我們 Seata 的 AT 模式和 TCC 模式為例來理解:

AT 模式

執(zhí)行階段:

  • 可回滾:根據(jù) SQL 解析結(jié)果,記錄回滾日志
  • 持久化:回滾日志和業(yè)務(wù) SQL 在同一個(gè)本地事務(wù)中提交到數(shù)據(jù)庫(kù)

完成階段:

  • 分支提交:異步刪除回滾日志記錄
  • 分支回滾:依據(jù)回滾日志進(jìn)行反向補(bǔ)償更新

TCC 模式

執(zhí)行階段:

  • 調(diào)用業(yè)務(wù)定義的 Try 方法(完全由業(yè)務(wù)層面保證 可回滾 和 持久化)

完成階段:

  • 分支提交:調(diào)用各事務(wù)分支定義的 Confirm 方法
  • 分支回滾:調(diào)用各事務(wù)分支定義的 Cancel 方法

1.3 什么是 Seata 的 XA 模式?

XA 模式:

在 Seata 定義的分布式事務(wù)框架內(nèi),利用事務(wù)資源(數(shù)據(jù)庫(kù)、消息服務(wù)等)對(duì) XA 協(xié)議的支持,以 XA 協(xié)議的機(jī)制來管理分支事務(wù)的一種 事務(wù)模式。

執(zhí)行階段:

  • 可回滾:業(yè)務(wù) SQL 操作放在 XA 分支中進(jìn)行,由資源對(duì) XA 協(xié)議的支持來保證 可回滾
  • 持久化:XA 分支完成后,執(zhí)行 XA prepare,同樣,由資源對(duì) XA 協(xié)議的支持來保證 持久化(即,之后任何意外都不會(huì)造成無法回滾的情況)

完成階段:

  • 分支提交:執(zhí)行 XA 分支的 commit
  • 分支回滾:執(zhí)行 XA 分支的 rollback

2. 為什么支持 XA?

為什么要在 Seata 中增加 XA 模式呢?支持 XA 的意義在哪里呢?

2.1 補(bǔ)償型事務(wù)模式的問題

本質(zhì)上,Seata 已經(jīng)支持的 3 大事務(wù)模式:AT、TCC、Saga 都是 補(bǔ)償型 的。

補(bǔ)償型 事務(wù)處理機(jī)制構(gòu)建在 事務(wù)資源 之上(要么在中間件層面,要么在應(yīng)用層面),事務(wù)資源 本身對(duì)分布式事務(wù)是無感知的。

事務(wù)資源 對(duì)分布式事務(wù)的無感知存在一個(gè)根本性的問題:無法做到真正的 全局一致性 。

比如,一條庫(kù)存記錄,處在 補(bǔ)償型 事務(wù)處理過程中,由 100 扣減為 50。此時(shí),倉(cāng)庫(kù)管理員連接數(shù)據(jù)庫(kù),查詢統(tǒng)計(jì)庫(kù)存,就看到當(dāng)前的 50。之后,事務(wù)因?yàn)楫愅饣貪L,庫(kù)存會(huì)被補(bǔ)償回滾為 100。顯然,倉(cāng)庫(kù)管理員查詢統(tǒng)計(jì)到的 50 就是 臟 數(shù)據(jù)。

可以看到,補(bǔ)償型 分布式事務(wù)機(jī)制因?yàn)椴灰?事務(wù)資源 本身(如數(shù)據(jù)庫(kù))的機(jī)制參與,所以無法保證從事務(wù)框架之外的全局視角的數(shù)據(jù)一致性。

2.2 XA 的價(jià)值

與 補(bǔ)償型 不同,XA 協(xié)議 要求 事務(wù)資源 本身提供對(duì)規(guī)范和協(xié)議的支持。

因?yàn)?事務(wù)資源 感知并參與分布式事務(wù)處理過程,所以 事務(wù)資源(如數(shù)據(jù)庫(kù))可以保障從任意視角對(duì)數(shù)據(jù)的訪問有效隔離,滿足全局?jǐn)?shù)據(jù)一致性。

比如,上一節(jié)提到的庫(kù)存更新場(chǎng)景,XA 事務(wù)處理過程中,中間態(tài)數(shù)據(jù)庫(kù)存 50 由數(shù)據(jù)庫(kù)本身保證,是不會(huì)倉(cāng)庫(kù)管理員的查詢統(tǒng)計(jì) 看 到的。(當(dāng)然隔離級(jí)別需要 讀已提交 以上)

除了 全局一致性 這個(gè)根本性的價(jià)值外,支持 XA 還有如下幾個(gè)方面的好處:

  • 業(yè)務(wù)無侵入:和 AT 一樣,XA 模式將是業(yè)務(wù)無侵入的,不給應(yīng)用設(shè)計(jì)和開發(fā)帶來額外負(fù)擔(dān)。
  • 數(shù)據(jù)庫(kù)的支持廣泛:XA 協(xié)議被主流關(guān)系型數(shù)據(jù)庫(kù)廣泛支持,不需要額外的適配即可使用。
  • 多語言支持容易:因?yàn)椴簧婕?SQL 解析,XA 模式對(duì) Seata 的 RM 的要求比較少,為不同語言開發(fā) SDK 較之 AT 模式將更 薄,更容易。
  • 傳統(tǒng)基于 XA 應(yīng)用的遷移:傳統(tǒng)的,基于 XA 協(xié)議的應(yīng)用,遷移到 Seata 平臺(tái),使用 XA 模式將更平滑。

2.3 XA 廣泛被質(zhì)疑的問題

不存在某一種分布式事務(wù)機(jī)制可以完美適應(yīng)所有場(chǎng)景,滿足所有需求。

XA 規(guī)范早在上世紀(jì) 90 年代初就被提出,用以解決分布式事務(wù)處理這個(gè)領(lǐng)域的問題。

現(xiàn)在,無論 AT 模式、TCC 模式還是 Saga 模式,這些模式的提出,本質(zhì)上都源自 XA 規(guī)范對(duì)某些場(chǎng)景需求的無法滿足。

XA 規(guī)范定義的分布式事務(wù)處理機(jī)制存在一些被廣泛質(zhì)疑的問題,針對(duì)這些問題,我們是如何思考的呢?

1. 數(shù)據(jù)鎖定:數(shù)據(jù)在整個(gè)事務(wù)處理過程結(jié)束前,都被鎖定,讀寫都按隔離級(jí)別的定義約束起來。

思考:

數(shù)據(jù)鎖定是獲得更高隔離性和全局一致性所要付出的代價(jià)。

補(bǔ)償型 的事務(wù)處理機(jī)制,在 執(zhí)行階段 即完成分支(本地)事務(wù)的提交,(資源層面)不鎖定數(shù)據(jù)。而這是以犧牲 隔離性 為代價(jià)的。

另外,AT 模式使用 全局鎖 保障基本的 寫隔離,實(shí)際上也是鎖定數(shù)據(jù)的,只不過鎖在 TC 側(cè)集中管理,解鎖效率高且沒有阻塞的問題。

2. 協(xié)議阻塞:XA prepare 后,分支事務(wù)進(jìn)入阻塞階段,收到 XA commit 或 XA rollback 前必須阻塞等待。

思考:

協(xié)議的阻塞機(jī)制本身并不是問題,關(guān)鍵問題在于 協(xié)議阻塞 遇上 數(shù)據(jù)鎖定。

如果一個(gè)參與全局事務(wù)的資源 “失聯(lián)” 了(收不到分支事務(wù)結(jié)束的命令),那么它鎖定的數(shù)據(jù),將一直被鎖定。進(jìn)而,甚至可能因此產(chǎn)生死鎖。

這是 XA 協(xié)議的核心痛點(diǎn),也是 Seata 引入 XA 模式要重點(diǎn)解決的問題。

基本思路是兩個(gè)方面:避免 “失聯(lián)” 和 增加 “自解鎖” 機(jī)制。(這里涉及非常多技術(shù)細(xì)節(jié),暫時(shí)不展開,在后續(xù) XA 模式演進(jìn)過程中,會(huì)專門拿出來討論)

3. 性能差:性能的損耗主要來自兩個(gè)方面:一方面,事務(wù)協(xié)調(diào)過程,增加單個(gè)事務(wù)的 RT;另一方面,并發(fā)事務(wù)數(shù)據(jù)的鎖沖突,降低吞吐。

思考:

和不使用分布式事務(wù)支持的運(yùn)行場(chǎng)景比較,性能肯定是下降的,這點(diǎn)毫無疑問。

本質(zhì)上,事務(wù)(無論是本地事務(wù)還是分布式事務(wù))機(jī)制就是拿部分 性能的犧牲 ,換來 編程模型的簡(jiǎn)單 。

與同為 業(yè)務(wù)無侵入 的 AT 模式比較:

首先,因?yàn)橥瑯舆\(yùn)行在 Seata 定義的分布式事務(wù)框架下,XA 模式并沒有產(chǎn)生更多事務(wù)協(xié)調(diào)的通信開銷。

其次,并發(fā)事務(wù)間,如果數(shù)據(jù)存在熱點(diǎn),產(chǎn)生鎖沖突,這種情況,在 AT 模式(默認(rèn)使用全局鎖)下同樣存在的。

所以,在影響性能的兩個(gè)主要方面,XA 模式并不比 AT 模式有非常明顯的劣勢(shì)。

AT 模式性能優(yōu)勢(shì)主要在于:集中管理全局?jǐn)?shù)據(jù)鎖,鎖的釋放不需要 RM 參與,釋放鎖非常快;另外,全局提交的事務(wù),完成階段 異步化。

3. XA 模式如何實(shí)現(xiàn)以及怎樣用?

3.1 XA 模式的設(shè)計(jì)

3.1.1 設(shè)計(jì)目標(biāo)

XA 模式的基本設(shè)計(jì)目標(biāo),兩個(gè)主要方面:

  1. 從 場(chǎng)景 上,滿足 全局一致性 的需求。
  2. 從 應(yīng)用上,保持與 AT 模式一致的無侵入。
  3. 從 機(jī)制 上,適應(yīng)分布式微服務(wù)架構(gòu)的特點(diǎn)。

整體思路:

與 AT 模式相同的:以應(yīng)用程序中 本地事務(wù) 的粒度,構(gòu)建到 XA 模式的 分支事務(wù)。

通過數(shù)據(jù)源代理,在應(yīng)用程序本地事務(wù)范圍外,在框架層面包裝 XA 協(xié)議的交互機(jī)制,把 XA 編程模型 透明化。

把 XA 的 2PC 拆開,在分支事務(wù) 執(zhí)行階段 的末尾就進(jìn)行 XA prepare,把 XA 協(xié)議完美融合到 Seata 的事務(wù)框架,減少一輪 RPC 交互。

3.1.2 核心設(shè)計(jì)

1. 整體運(yùn)行機(jī)制

XA 模式 運(yùn)行在 Seata 定義的事務(wù)框架內(nèi):

執(zhí)行階段(E xecute):

  • XA start/XA end/XA prepare + SQL + 注冊(cè)分支

完成階段(F inish):

  • XA commit/XA rollback

2. 數(shù)據(jù)源代理

XA 模式需要 XAConnection。

獲取 XAConnection 兩種方式:

  • 方式一:要求開發(fā)者配置 XADataSource
  • 方式二:根據(jù)開發(fā)者的普通 DataSource 來創(chuàng)建

第一種方式,給開發(fā)者增加了認(rèn)知負(fù)擔(dān),需要為 XA 模式專門去學(xué)習(xí)和使用 XA 數(shù)據(jù)源,與 透明化 XA 編程模型的設(shè)計(jì)目標(biāo)相違背。

第二種方式,對(duì)開發(fā)者比較友好,和 AT 模式使用一樣,開發(fā)者完全不必關(guān)心 XA 層面的任何問題,保持本地編程模型即可。

我們優(yōu)先設(shè)計(jì)實(shí)現(xiàn)第二種方式:數(shù)據(jù)源代理根據(jù)普通數(shù)據(jù)源中獲取的普通 JDBC 連接創(chuàng)建出相應(yīng)的 XAConnection。

類比 AT 模式的數(shù)據(jù)源代理機(jī)制,如下:

但是,第二種方法有局限:無法保證兼容的正確性。

實(shí)際上,這種方法是在做數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序要做的事情。不同的廠商、不同版本的數(shù)據(jù)庫(kù)驅(qū)動(dòng)實(shí)現(xiàn)機(jī)制是廠商私有的,我們只能保證在充分測(cè)試過的驅(qū)動(dòng)程序上是正確的,開發(fā)者使用的驅(qū)動(dòng)程序版本差異很可能造成機(jī)制的失效。

這點(diǎn)在 Oracle 上體現(xiàn)非常明顯。參見 Druid issue:https://github.com/alibaba/druid/issues/3707

綜合考慮,XA 模式的數(shù)據(jù)源代理設(shè)計(jì)需要同時(shí)支持第一種方式:基于 XA 數(shù)據(jù)源進(jìn)行代理。

類比 AT 模式的數(shù)據(jù)源代理機(jī)制,如下:

3. 分支注冊(cè)

XA start 需要 Xid 參數(shù)。

這個(gè) Xid 需要和 Seata 全局事務(wù)的 XID 和 BranchId 關(guān)聯(lián)起來,以便由 TC 驅(qū)動(dòng) XA 分支的提交或回滾。

目前 Seata 的 BranchId 是在分支注冊(cè)過程,由 TC 統(tǒng)一生成的,所以 XA 模式分支注冊(cè)的時(shí)機(jī)需要在 XA start 之前。

將來一個(gè)可能的優(yōu)化方向:

把分支注冊(cè)盡量延后。類似 AT 模式在本地事務(wù)提交之前才注冊(cè)分支,避免分支執(zhí)行失敗情況下,沒有意義的分支注冊(cè)。

這個(gè)優(yōu)化方向需要 BranchId 生成機(jī)制的變化來配合。BranchId 不通過分支注冊(cè)過程生成,而是生成后再帶著 BranchId 去注冊(cè)分支。

小結(jié)

這里只通過幾個(gè)重要的核心設(shè)計(jì),說明 XA 模式的基本工作機(jī)制。

此外,還有包括 連接保持、異常處理 等重要方面,有興趣可以從項(xiàng)目代碼中進(jìn)一步了解。

以后會(huì)陸續(xù)寫出來和大家交流。

3.1.3 演進(jìn)規(guī)劃

XA 模式總體的演進(jìn)規(guī)劃如下:

第 1 步(已經(jīng)完成):首個(gè)版本(1.2.0),把 XA 模式原型機(jī)制跑通。確保只增加,不修改,不給其他模式引入的新問題。

第 2 步(計(jì)劃 5 月完成):與 AT 模式必要的融合、重構(gòu)。

第 3 步(計(jì)劃 7 月完成):完善異常處理機(jī)制,進(jìn)行上生產(chǎn)所必需的打磨。

第 4 步(計(jì)劃 8 月完成):性能優(yōu)化。

第 5 步(計(jì)劃 2020 年內(nèi)完成):結(jié)合 Seata 項(xiàng)目正在進(jìn)行的面向云原生的 Transaction Mesh 設(shè)計(jì),打造云原生能力。

3.2 XA 模式的使用

從編程模型上,XA 模式與 AT 模式保持完全一致。

可以參考 Seata 官網(wǎng)的樣例:seata-xa

樣例場(chǎng)景是 Seata 經(jīng)典的,涉及庫(kù)存、訂單、賬戶 3 個(gè)微服務(wù)的商品訂購(gòu)業(yè)務(wù)。

在樣例中,上層編程模型與 AT 模式完全相同。只需要修改數(shù)據(jù)源代理,即可實(shí)現(xiàn) XA 模式與 AT 模式之間的切換。

  1. @Bean("dataSourceProxy"
  2.    public DataSource dataSource(DruidDataSource druidDataSource) { 
  3.        // DataSourceProxy for AT mode 
  4.        // return new DataSourceProxy(druidDataSource); 
  5.  
  6.        // DataSourceProxyXA for XA mode 
  7.        return new DataSourceProxyXA(druidDataSource); 
  8.    } 

4. 總結(jié)

在當(dāng)前的技術(shù)發(fā)展階段,不存一個(gè)分布式事務(wù)處理機(jī)制可以完美滿足所有場(chǎng)景的需求。

一致性、可靠性、易用性、性能等諸多方面的系統(tǒng)設(shè)計(jì)約束,需要用不同的事務(wù)處理機(jī)制去滿足。

Seata 項(xiàng)目最核心的價(jià)值在于:構(gòu)建一個(gè)全面解決分布式事務(wù)問題的 標(biāo)準(zhǔn)化 平臺(tái)。

基于 Seata,上層應(yīng)用架構(gòu)可以根據(jù)實(shí)際場(chǎng)景的需求,靈活選擇合適的分布式事務(wù)解決方案。

XA 模式的加入,補(bǔ)齊了 Seata 在 全局一致性 場(chǎng)景下的缺口,形成 AT、TCC、Saga、XA 四大 事務(wù)模式 的版圖,基本可以滿足所有場(chǎng)景的分布式事務(wù)處理訴求。

當(dāng)然 XA 模式和 Seata 項(xiàng)目本身都還不盡完美,有很多需要改進(jìn)和完善的地方。非常歡迎大家參與到項(xiàng)目的建設(shè)中,共同打造一個(gè)標(biāo)準(zhǔn)化的分布式事務(wù)平臺(tái)。

作者簡(jiǎn)介:煊檍,GitHub ID:sharajava,阿里巴巴中件間 GTS 研發(fā)團(tuán)隊(duì)負(fù)責(zé)人,SEATA 開源項(xiàng)目發(fā)起人,曾在 Oracle 北京研發(fā)中心多年,從事 WebLogic 核心研發(fā)工作。長(zhǎng)期專注于中間件,尤其是分布式事務(wù)領(lǐng)域的技術(shù)實(shí)踐。

本文轉(zhuǎn)載自微信公眾號(hào)「高可用架構(gòu)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系高可用架構(gòu)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 高可用架構(gòu)
相關(guān)推薦

2021-04-23 08:15:51

Seata XA AT

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2025-04-28 00:44:04

2022-06-21 08:27:22

Seata分布式事務(wù)

2023-01-06 09:19:12

Seata分布式事務(wù)

2022-07-03 14:03:57

分布式Seata

2025-05-07 00:10:00

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

2022-03-24 07:51:27

seata分布式事務(wù)Java

2022-01-12 10:02:02

TCC模式 Seata

2022-07-10 20:24:48

Seata分布式事務(wù)

2023-11-06 13:15:32

分布式事務(wù)Seata

2025-04-30 10:44:02

2024-10-09 14:14:07

2024-01-26 08:18:03

2021-08-06 08:33:27

Springboot分布式Seata

2024-08-19 09:05:00

Seata分布式事務(wù)

2021-12-13 11:07:10

鴻蒙HarmonyOS應(yīng)用

2024-12-02 09:19:44

2025-01-26 00:00:40

Seata分布式事務(wù)

2020-12-09 09:14:57

SpringCloudSeata 分布式
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲欧洲色视频 | av黄色在线| 羞羞视频在线观看 | 麻豆亚洲 | 精品一区二区三区在线视频 | 国产在线视频在线观看 | 婷婷丁香在线视频 | 国产一区二区三区四区五区加勒比 | 久久精品国产一区 | 久久久久99 | 欧美激情久久久 | 成年人在线播放 | 先锋资源在线 | 91精品国产综合久久久动漫日韩 | 久久亚洲国产精品日日av夜夜 | 免费视频99 | 国内精品久久久久久 | 国产在线视频在线观看 | 99视频在线免费观看 | 久久精品一区二区三区四区 | 国产成人综合在线 | 午夜爽爽男女免费观看hd | 国产精品美女久久久久aⅴ国产馆 | 日本小电影在线 | 亚洲高清在线视频 | 日韩国产一区 | 日韩精品一区二区三区中文字幕 | 国产九九精品 | 伊人中文字幕 | 欧美一级片在线 | 国产精品美女久久久 | 欧美a级成人淫片免费看 | 国产一区二区三区免费 | 国产精品久久久乱弄 | 成人九色 | 欧美视频二区 | 电影91久久久 | 天天操网 | 国产精品一区在线观看 | 精品国产乱码一区二区三区a | 自拍偷拍中文字幕 |