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

分布式事務的六種解決方案,寫得非常好!

開發 后端 分布式
在分布式系統、微服務架構大行其道的今天,服務間互相調用出現失敗已經成為常態。如何處理異常,如何保證數據一致性,成為微服務設計過程中,繞不開的一個難題。

[[407285]]

介紹

在分布式系統、微服務架構大行其道的今天,服務間互相調用出現失敗已經成為常態。如何處理異常,如何保證數據一致性,成為微服務設計過程中,繞不開的一個難題。 

在不同的業務場景下,解決方案會有所差異,常見的方式有:

  1.  阻塞式重試;
  2.  2PC、3PC 傳統事務;
  3.  使用隊列,后臺異步處理;
  4.  TCC 補償事務;
  5.  本地消息表(異步確保);
  6.  MQ 事務。

本文側重于其他幾項,關于 2PC、3PC 傳統事務,網上資料已經非常多了,這里不多做重復。

阻塞式重試

在微服務架構中,阻塞式重試是比較常見的一種方式。

偽代碼示例: 

  1. :db.Insert(sql)  
  2. err :request(B-Service,m)  
  3. func request(url string,body interface{}){  
  4.   for i:=0; i<3; i ++ {  
  5.     result, err = request.POST(url,body)  
  6.     if err == nil {  
  7.         break   
  8.     }else {  
  9.       log.Print()  
  10.     }  
  11.   }  

如上,當請求 B 服務的 API 失敗后,發起最多三次重試。如果三次還是失敗,就打印日志,繼續執行下或向上層拋出錯誤。

這種方式會帶來以下問題:

  1.  調用 B 服務成功,但由于網絡超時原因,當前服務認為其失敗了,繼續重試,這樣 B 服務會產生 2 條一樣的數據。
  2.  調用 B 服務失敗,由于 B 服務不可用,重試 3 次依然失敗,當前服務在前面代碼中插入到 DB 的一條記錄,就變成了臟數據。
  3.  重試會增加上游對本次調用的延遲,如果下游負載較大,重試會放大下游服務的壓力。

第一個問題:通過讓 B 服務的 API 支持冪等性來解決。

第二個問題:可以通過后臺定時腳步去修正數據,但這并不是一個很好的辦法。

第三個問題:這是通過阻塞式重試提高一致性、可用性,必不可少的犧牲。

阻塞式重試適用于業務對一致性要求不敏感的場景下。如果對數據一致性有要求的話,就必須要引入額外的機制來解決。

異步隊列

在解決方案演化的過程中,引入隊列是個比較常見也較好的方式。如下示例: 

  1. :db.Insert(sql)  
  2. err :mq.Publish("B-Service-topic",m) 

在當前服務將數據寫入 DB 后,推送一條消息給 MQ,由獨立的服務去消費 MQ 處理業務邏輯。和阻塞式重試相比,雖然 MQ 在穩定性上遠高于普通的業務服務,但在推送消息到 MQ 中的調用,還是會有失敗的可能性,比如網絡問題、當前服務宕機等。這樣還是會遇到阻塞式重試相同的問題,即 DB 寫入成功了,但推送失敗了。

理論上來講,分布式系統下,涉及多個服務調用的代碼都存在這樣的情況,在長期運行中,調用失敗的情況一定會出現。這也是分布式系統設計的難點之一。另外,MQ 系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發送:面試,可以在線閱讀。

TCC 補償事務

在對事務有要求,且不方便解耦的情況下,TCC 補償式事務是個較好的選擇。

TCC 把調用每個服務都分成 2 個階段、 3 個操作:

  •  階段一、Try 操作:對業務資源做檢測、資源預留,比如對庫存的檢查、預扣。
  •  階段二、Confirm 操作:提交確認 Try 操作的資源預留。比如把庫存預扣更新為扣除。
  •  階段二、Cancel 操作:Try 操作失敗后,釋放其預扣的資源。比如把庫存預扣的加回去。

TCC 要求每個服務都實現上面 3 個操作的 API,服務接入 TCC 事務前一次調用就完成的操作,現在需要分 2 階段完成、三次操作來完成。

比如一個商城應用需要調用 A 庫存服務、B 金額服務、C 積分服務,如下偽代碼: 

  1. :db.Insert(sql)  
  2. aResult, aErr :A.Try(m)  
  3. bResult, bErr :B.Try(m)  
  4. cResult, cErr :C.Try(m)  
  5. if cErr != nil {  
  6.     A.Cancel()  
  7.     B.Cancel()  
  8.  C.Cancel()  
  9. } else {  
  10.     A.Confirm()  
  11.     B.Confirm()  
  12.     C.Confirm()  

代碼中分別調用 A、B、C 服務 API 檢查并保留資源,都返回成功了再提交確認(Confirm)操作;如果 C 服務 Try 操作失敗后,則分別調用 A、B、C 的 Cancel API 釋放其保留的資源。

TCC 在業務上解決了分布式系統下,跨多個服務、跨多個數據庫的數據一致性問題。但 TCC 方式依然存在一些問題,實際使用中需要注意,包括上面章節提到的調用失敗的情況。

空釋放

上面代碼中如果 C.Try() 是真正調用失敗,那下面多余的 C.Cancel() 調用會出現釋放并沒有鎖定資源的行為。這是因為當前服務無法判斷調用失敗是不是真的鎖定 C 資源了。如果不調用,實際上成功了,但由于網絡原因返回失敗了,這會導致 C 的資源被鎖定,一直得不到釋放。

空釋放在生產環境經常出現,服務在實現 TCC 事務 API 時,應支持空釋放的執行。

時序

上面代碼中如果 C.Try() 失敗,接著調用 C.Cancel() 操作。因為網絡原因,有可能會出現 C.Cancel() 請求會先到 C 服務,C.Try() 請求后到,這會導致空釋放問題,同時引起 C 的資源被鎖定,一直得不到釋放。

所以 C 服務應拒絕釋放資源之后的 Try() 操作。具體實現上,可以用唯一事務ID來區分第一次 Try() 還是釋放后的 Try()。

調用失敗

Cancel 、Confirm 在調用過程中,還是會存在失敗的情況,比如常見的網絡原因。

Cancel() 或 Confirm() 操作失敗都會導致資源被鎖定,一直得不到釋放。這種情況常見解決方案有:

  1.  阻塞式重試。但有同樣的問題,比如宕機、一直失敗的情況。
  2.  寫入日志、隊列,然后有單獨的異步服務自動或人工介入處理。但一樣會有問題,寫日志或隊列時,會存在失敗的情況。

理論上來講非原子性、事務性的二段代碼,都會存在中間態,有中間態就會有失敗的可能性。

本地消息表

本地消息表最初是 ebay 提出的,它讓本地消息表與業務數據表處于同一個數據庫中,這樣就能利用本地事務來滿足事務特性。

具體做法是在本地事務中插入業務數據時,也插入一條消息數據。然后在做后續操作,如果其他操作成功,則刪除該消息;如果失敗則不刪除,異步監聽這個消息,不斷重試。

本地消息表是一個很好的思路,可以有多種使用方式:

配合MQ

示例偽代碼: 

  1. messageTx :tc.NewTransaction("order")  
  2. messageTxSql :tx.TryPlan("content")  
  3. m,err :db.InsertTx(sql,messageTxSql)  
  4. if err!=nil {  
  5.  return err  
  6.  
  7. aErr :mq.Publish("B-Service-topic",m) 
  8. if aErr!=nil { // 推送到 MQ 失敗  
  9.  messageTx.Confirm() // 更新消息的狀態為 confirm  
  10. }else {  
  11.  messageTx.Cancel() // 刪除消息  
  12.   
  13. // 異步處理 confirm 的消息,繼續推送  
  14. func OnMessage(task *Task){  
  15.    err :mq.Publish("B-Service-topic", task.Value()) 
  16.    if err==nil {  
  17.      messageTx.Cancel()  
  18.    }  

上面代碼中其 messageTxSql 是插入本地消息表的一段 SQL : 

  1. insert into `tcc_async_task` (`uid`,`name`,`value`,`status`)   
  2. values ('?','?','?','?') 

它和業務 SQL 在同一個事務中去執行,要么成功,要么失敗。

成功則推送到隊列,推送成功,則調用 messageTx.Cancel() 刪除本地消息;推送失敗則標記消息為 confirm。本地消息表中 status 有 2 種狀態 try、confirm, 無論哪種狀態在 OnMessage 都可以監聽到,從而發起重試。

本地事務保障消息和業務一定會寫入數據庫,此后的執行無論宕機還是網絡推送失敗,異步監聽都可以進行后續處理,從而保障了消息一定會推到 MQ。

而 MQ 則保障一定會到達消費者服務中,利用 MQ 的 QOS 策略,消費者服務一定能處理,或繼續投遞到下一個業務隊列中,從而保障了事務的完整性。

配合服務調用

示例偽代碼: 

  1. messageTx :tc.NewTransaction("order")  
  2. messageTxSql :tx.TryPlan("content")  
  3. body,err :db.InsertTx(sql,messageTxSql)  
  4. if err!=nil {  
  5.     return err  
  6.  
  7. aErr :request.POST("B-Service",body)  
  8. if aErr!=nil { // 調用 B-Service 失敗  
  9.  messageTx.Confirm() // 更新消息的狀態為 confirm  
  10. }else {  
  11.  messageTx.Cancel() // 刪除消息  
  12.  
  13. // 異步處理 confirm 或 try 的消息,繼續調用 B-Service   
  14. func OnMessage(task *Task){  
  15.   // request.POST("B-Service",body)  

這是本地消息表 + 調用其他服務的例子,沒有 MQ 的引入。這種使用異步重試,并用本地消息表保障消息的可靠性,解決了阻塞式重試帶來的問題,在日常開發中比較常見。

如果本地沒有要寫 DB 的操作,可以只寫入本地消息表,同樣在 OnMessage中處理: 

  1. messageTx :tc.NewTransaction("order")  
  2. messageTx :tx.Try("content")  
  3. aErr :request.POST("B-Service",body) 
  4. // .... 

消息過期

配置本地消息表的 Try 和 Confirm 消息的處理器: 

  1. TCC.SetTryHandler(OnTryMessage())  
  2. TCC.SetConfirmHandler(OnConfirmMessage()) 

在消息處理函數中要判斷當前消息任務是否存在過久,比如一直重試了一小時,還是失敗,就考慮發郵件、短信、日志告警等方式,讓人工介入。 

  1. func OnConfirmMessage(task *tcc.Task) {  
  2. if time.Now().Sub(task.CreatedAt) > time.Hour {  
  3.     err :task.Cancel()  // 刪除該消息,停止重試。  
  4.    // doSomeThing() 告警,人工介入  
  5.     return  
  6.  }  

在 Try 處理函數中,還要單獨判斷當前消息任務是否存在過短,因為 Try狀態的消息,可能才剛剛創建,還沒被確認提交或刪除。這會和正常業務邏輯的執行重復,意味著成功的調用,也會被重試;為盡量避免這種情況,可以檢測消息的創建時間是否很短,短的話可以跳過。

重試機制必然依賴下游 API 在業務邏輯上的冪等性,雖然不處理也可行,但設計上還是要盡量避免干擾正常的請求。另外,推薦 Java 核心技術教程和示例源碼:https://github.com/javastacks/javastack

獨立消息服務

獨立消息服務是本地消息表的升級版,把本地消息表抽離成一個獨立的服務。所有操作之前先在消息服務添加個消息,后續操作成功則刪除消息,失敗則提交確認消息。

然后用異步邏輯去監聽消息,做對應的處理,和本地消息表的處理邏輯基本一致。但由于向消息服務添加消息,無法和本地操作放到一個事務里,所以會存在添加消息成功,后續失敗,則此時的消息就是個無用消息。

如下示例場景: 

  1. err :request.POST("Message-Service",body)  
  2. if err!=nil {  
  3.   return err  
  4.  
  5. aErr :request.POST("B-Service",body)  
  6. if aErr!=nil { 
  7.   return aErr  

這個無用的消息,需要消息服務去確認這個消息是否執行成功,沒有則刪除,有繼續執行后續邏輯。相比本地事務表 try 和 confirm ,消息服務在前面多了一種狀態 prepare。

MQ 事務

有些 MQ 的實現支持事務,比如 RocketMQ 。MQ 的事務可以看作獨立消息服務的一種具體實現,邏輯完全一致。

所有操作之前先在 MQ 投遞個消息,后續操作成功則 Confirm 確認提交消息,失敗則Cancel刪除消息。MQ 事務也會存在 prepare狀態,需要 MQ 的消費處理邏輯來確認業務是否成功。

總結

從分布式系統實踐中來看,要保障數據一致性的場景,必然要引入額外的機制處理。

TCC 的優點是作用于業務服務層,不依賴某個具體數據庫、不與具體框架耦合、資源鎖的粒度比較靈活,非常適用于微服務場景下。缺點是每個服務都要實現 3 個 API,對于業務侵入和改動較大,要處理各種失敗異常。開發者很難完整處理各種情況,找個成熟的框架可以大大降低成本,比如阿里的 Fescar。

本地消息表的優點是簡單、不依賴其他服務的改造、可以很好的配合服務調用和 MQ 一起使用,在大多業務場景下都比較實用。缺點是本地數據庫多了消息表,和業務表耦合在一起。文中本地消息表方式的示例,來源于作者寫的一個庫,有興趣的同學可以參考下 https://github.com/mushroomsir/tcc

MQ 事務和獨立消息服務的優點是抽離出一個公共的服務來解決事務問題,避免每個服務都有消息表和服務耦合在一起,增加服務自身的處理復雜性。缺點是支持事務的 MQ 很少;且每次操作前都先調用 API 添加個消息,會增加整體調用的延遲,在絕大多數正常響應的業務場景下,是一種多余的開銷。

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2025-04-29 04:00:00

分布式事務事務消息

2024-03-26 12:08:53

分布式事務存儲

2019-07-25 15:32:35

分布式事務微服務系統架構

2023-09-14 15:44:46

分布式事務數據存儲

2020-05-28 09:35:05

分布式事務方案

2020-03-31 16:13:26

分布式事務方案TCC

2025-04-28 00:44:04

2019-04-28 11:01:05

云安全云計算CASB

2010-07-21 13:53:41

SQL Server分

2025-05-07 00:10:00

分布式事務TCC模式

2022-07-06 12:03:55

事務解決方案

2023-11-30 07:19:08

.NET開源

2021-09-28 09:43:11

微服務架構技術

2019-01-11 18:22:07

阿里巴巴技術開源

2024-06-13 08:04:23

2021-04-30 20:10:46

類加載Java代碼

2021-06-28 10:03:44

分布式數據庫架構

2025-08-27 09:11:48

2024-12-09 09:35:00

2019-09-09 10:09:51

分布式事務 數據庫
點贊
收藏

51CTO技術棧公眾號

国产成人自拍视频在线观看| 欧美视频在线观看一区| 99re国产在线播放| 日本网站在线免费观看| 午夜精品福利影院| 欧美色图天堂网| 蜜臀av性久久久久蜜臀av| 手机看片国产1024| 久久精品国产99国产| 欧美日韩成人在线播放| b站大片免费直播| 亚洲欧美在线人成swag| 精品久久久一区| 影音先锋亚洲视频| 日夜干在线视频| 精品亚洲porn| 日韩美女毛茸茸| 久久久.www| 日韩综合一区| 亚洲国产精品字幕| 亚洲第一成肉网| 欧美精品总汇| 精品日韩美女的视频高清| 正在播放一区| 波多野结衣在线网站| 波多野结衣中文字幕一区二区三区| 国产日产久久高清欧美一区| www.日本精品| 红桃视频欧美| 超碰91人人草人人干| 特级西西www444人体聚色| 露出调教综合另类| 欧美成人国产一区二区| 97人人爽人人| 欧美特黄色片| 在线观看亚洲精品| 亚洲中文字幕无码不卡电影| 免费影视亚洲| 一区二区免费在线| 国产日产欧美一区二区| 日本三级在线播放完整版| www国产成人| 国内精品视频在线播放| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 日韩有码av| 欧美xxxxx牲另类人与| 亚洲高清在线不卡| 国产精品白丝久久av网站| 欧美色男人天堂| 三年中国国语在线播放免费| 少妇一区视频| 欧美性猛交xxxx黑人交| av视屏在线播放| 搜成人激情视频| 在线免费视频一区二区| 欧美自拍小视频| 亚洲综合av一区二区三区| 欧美在线看片a免费观看| 成人性视频欧美一区二区三区| 三级成人黄色影院| 欧美亚洲一区二区在线观看| 嫩草影院国产精品| 日韩国产一二三区| 在线播放一区二区三区| 亚洲av毛片在线观看| 玖玖玖视频精品| 亚洲成年人在线| 久久偷拍免费视频| 久久最新网址| 中文字幕亚洲天堂| 北条麻妃在线观看视频| 久久精品国内一区二区三区水蜜桃| 久久精品国产成人| 免费三片在线播放| 亚洲作爱视频| 国产精品久久二区| 国产精品污视频| 成人丝袜18视频在线观看| 国产日韩在线一区二区三区| 三级毛片在线免费看| 国产精品亲子乱子伦xxxx裸| 最近中文字幕免费mv| 五月天激情在线| 日韩欧美国产网站| 欧美成人福利在线观看| 伊人久久影院| 亚洲美女激情视频| 亚洲一区电影在线观看| 亚洲国产一区二区三区a毛片| 91精品国产色综合久久不卡98| 国产精品免费无遮挡无码永久视频| 久久99久久精品| 爱情岛论坛亚洲入口| 欧美男男同志| 亚洲男人天堂av网| 国产 福利 在线| 成人在线日韩| 日韩高清中文字幕| 亚洲综合图片一区| 最新成人av网站| 国产色综合天天综合网 | 日韩久久精品视频| 久久国产综合精品| 国内精品**久久毛片app| 欧美激情午夜| 欧美丝袜第一区| 国内av免费观看| 精品国产91乱码一区二区三区四区 | 国产精品久久久久久久久免费| www.成人在线观看| 国产亚洲1区2区3区| 日韩成人手机在线| 久久精品97| 亚洲美女视频网站| 九九在线观看视频| 免费观看一级特黄欧美大片| 国产一区二区无遮挡| 免费av在线| 色香蕉久久蜜桃| 国产精品入口麻豆| 91精品国产视频| 国产精品视频免费观看www| 蜜桃视频久久一区免费观看入口| 亚洲欧洲精品一区二区三区不卡| 国内自拍在线观看| 久久99国产精品久久99大师| 麻豆国产va免费精品高清在线| 老熟妇一区二区三区| av电影在线观看不卡| 日本福利视频网站| 精品一区二区三区视频在线播放 | 中文字幕免费高清电视剧网站在线观看 | 久久精品日韩一区二区三区| 国内自拍中文字幕| 成人开心激情| 亚洲乱码av中文一区二区| 国产性一乱一性一伧一色| 国产中文一区二区三区| 一区国产精品| 日本免费一区二区三区等视频| 国产一区二区三区在线看| 一级片视频在线观看| 91视视频在线直接观看在线看网页在线看| 国产91视频一区| 亚洲国产欧美国产第一区| 久久精品电影网| 国产视频在线观看免费| 亚洲视频免费在线| 网站在线你懂的| 亚洲深深色噜噜狠狠爱网站| 成人午夜在线视频一区| 国产在线一区二区视频| 7777精品伊人久久久大香线蕉最新版| 国产福利在线导航| 精品中文av资源站在线观看| 一区二区三区四区久久| 精品中文视频| 欧美激情一区二区三区在线视频观看| 草草视频在线播放| 亚洲成人你懂的| www.免费av| 久久免费黄色| 一区不卡字幕| 日韩精品一区二区三区中文在线 | 国产成人亚洲欧洲在线| 99在线精品观看| 激情五月开心婷婷| 成人情趣视频网站| 91精品美女在线| 日本动漫理论片在线观看网站| 精品精品欲导航| 久久免费激情视频| 国产蜜臀97一区二区三区| 亚洲va综合va国产va中文| 欧美成人日韩| 国内精品久久国产| 99re久久| 欧美激情手机在线视频| 亚洲AV第二区国产精品| 日本道色综合久久| 精品国产视频在线观看| 成人av手机在线观看| 99蜜桃臀久久久欧美精品网站| 日韩片欧美片| 国产精品日韩欧美一区二区| 久九九久频精品短视频| 久久精品视频播放| 日本美女一级视频| 欧美三级视频在线观看| 久久久久久天堂| 久久精品夜色噜噜亚洲aⅴ| 成年人三级黄色片| 亚洲麻豆视频| 一区二区在线观看网站| 任你躁在线精品免费| 国产日韩欧美影视| 国产拍在线视频| 久久久999国产| 日本人妖在线| 日韩欧美成人激情| 五月天中文字幕| 亚洲在线视频免费观看| 亚洲av熟女国产一区二区性色| 国产激情91久久精品导航| av天堂永久资源网| 欧美日韩第一区| 日韩精品久久一区二区三区| 成人18夜夜网深夜福利网| 国产精品一区二区三区久久久| 91白丝在线| yellow中文字幕久久| 日韩电影免费| 亚洲精品在线三区| av av片在线看| 欧美唯美清纯偷拍| 亚洲伊人成人网| 亚洲成国产人片在线观看| 国产又粗又长又黄的视频| 久久人人97超碰com| 国内自拍偷拍视频| 激情成人午夜视频| 国产精品天天av精麻传媒| 99热这里只有成人精品国产| 亚洲激情免费视频| 久久人体视频| 视频在线99re| 狠狠色丁香婷婷综合影院| 好吊色欧美一区二区三区四区 | 免费一级欧美片在线观看| 日本免费不卡一区二区| 国产一区日韩一区| 亚洲五码在线观看视频| 99精品视频在线观看播放| 视频一区二区综合| 国产精选一区| 欧美日韩在线观看一区| 色婷婷狠狠五月综合天色拍| 国产精品日韩欧美一区二区| 国产精品久久久久av蜜臀| 91文字幕巨乱亚洲香蕉| 国产一区一区| 亚洲淫片在线视频| 国产一区二区三区国产精品| 国产欧美日韩精品丝袜高跟鞋| 91成人在线| 国产欧美精品日韩精品| 精品亚洲a∨| 国产精品免费久久久| 国产亚洲人成a在线v网站| 国产精品亚洲激情| 涩涩涩久久久成人精品| 国产一区在线播放| 国产一区二区三区| y111111国产精品久久婷婷| 成人性生交大片免费看96| 国产欧美综合精品一区二区| 国内视频在线精品| 精品亚洲欧美日韩| 女厕嘘嘘一区二区在线播放| 日韩在线三区| 亚洲第一偷拍| 91免费黄视频| 模特精品在线| 午夜两性免费视频| 国产美女精品人人做人人爽| 国产成人精品一区二区在线小狼| 成人av先锋影音| 国产精品揄拍100视频| 日本一区二区在线不卡| 婷婷伊人五月天| 亚洲国产乱码最新视频| 日韩在线播放中文字幕| 欧美三级电影在线看| 国产喷水福利在线视频| 亚洲精品按摩视频| 精品亚洲成a人片在线观看| 色噜噜久久综合伊人一本| 99在线视频观看| 97在线免费观看视频| 成人看片网页| 99久久自偷自偷国产精品不卡| 精品福利网址导航| 亚洲精蜜桃久在线| 国产精品s色| 成人在线免费播放视频| 狠狠色丁香久久婷婷综| 亚洲av人人澡人人爽人人夜夜| 久久久久国产精品麻豆 | 欧美日韩国产中文字幕| 中文字幕av网站| 精品久久久久久久人人人人传媒| 日本黄在线观看| 麻豆成人在线看| 写真福利精品福利在线观看| 亚洲一区中文字幕| 欧美猛男男男激情videos| 99久久久无码国产精品性色戒| 日韩午夜免费视频| 久久撸在线视频| 91在线视频播放地址| 国产精品国产精品88| 欧美小视频在线观看| av官网在线观看| 国产亚洲人成a一在线v站| gogo高清在线播放免费| 国产精品亚洲网站| 一本色道久久综合狠狠躁的番外| 亚洲国产精品女人| 丝袜美腿亚洲一区| 尤物网站在线观看| 亚洲欧美激情小说另类| 无码人妻久久一区二区三区| 亚洲成色777777女色窝| 日本福利在线| 国产精品av网站| 亚洲盗摄视频| 国产精品专区在线| 国产精品一区二区三区99| 天天干天天操天天拍| 精品美女久久久久久免费| 精品国产伦一区二区三区| 色阁综合伊人av| 伊人久久高清| 欧美日韩国产免费一区二区三区| 国产精品www994| av地址在线观看| 亚洲日本欧美天堂| 在线观看亚洲国产| 一区二区三区动漫| 色老太综合网| 欧美日韩在线精品| 久久精品盗摄| 国产精品无码毛片| 精品久久久久久久久久久久| 后入内射欧美99二区视频| 久久国产天堂福利天堂| 95精品视频| 一区二区视频在线播放| 免费亚洲电影在线| 国产18无套直看片| 欧美日韩日本视频| 91美女视频在线| 国产噜噜噜噜久久久久久久久| 成人在线电影在线观看视频| 爱情岛论坛vip永久入口| 国产农村妇女毛片精品久久麻豆 | 国产精品毛片视频| 日韩亚洲欧美一区二区| 国产在线精品一区二区夜色| 精品无码一区二区三区蜜臀| 911国产精品| 国产美女av在线| 亚洲xxxx3d| 欧美日韩精品免费观看视频完整| 午夜影院免费版| 亚洲国产精品欧美一二99| 理论片中文字幕| 欧美在线激情视频| 精品国产日韩欧美| 精品亚洲一区二区三区四区| 国产精品国产精品国产专区不蜜 | www.日本精品| 国产偷国产偷亚洲清高网站 | 国产日韩综合一区二区性色av| 日韩片欧美片| 国产伦精品一区二区三区妓女下载| 一区二区三区中文字幕| 懂色av蜜臀av粉嫩av分享吧 | 嫩草伊人久久精品少妇av杨幂| 日韩亚洲视频| 国产美女在线观看一区| 国产精品不卡av| 亚洲性夜色噜噜噜7777| 巨大黑人极品videos精品| 蜜臀av性久久久久蜜臀av| eeuss国产一区二区三区| 精品久久久久久久久久久久久久久久久久| 国产亚洲综合久久| 日韩中文在线| 北条麻妃视频在线| 亚洲天堂免费在线观看视频| 丰满肉嫩西川结衣av| 国产精品激情av在线播放| 亚洲激情久久| 亚洲一区二区观看| 欧美精品乱码久久久久久按摩| 丁香花在线高清完整版视频| 日本一区二区三区www| 国产91在线|亚洲| 午夜视频网站在线观看| 久久久久久一区二区三区| 国产中文字幕一区二区三区| 中文字幕55页| 在线视频国产一区| a级片免费在线观看| 亚洲精品中字| 91热门视频在线观看| 国产jzjzjz丝袜老师水多| 国产高清在线不卡| 激情综合网址|