日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Seata TCC分布式事務(wù)實戰(zhàn):從原理到生產(chǎn)環(huán)境避坑指南

Seata TCC分布式事務(wù)實戰(zhàn):從原理到生產(chǎn)環(huán)境避坑指南 1. 從“分布式事務(wù)”這個老難題說起如果你做過幾年后端開發(fā)尤其是在微服務(wù)架構(gòu)下折騰過數(shù)據(jù)一致性那“分布式事務(wù)”這個詞對你來說大概率不是什么美好的回憶。訂單創(chuàng)建了庫存沒扣積分增加了優(yōu)惠券沒核銷這種“一半成功一半失敗”的爛攤子處理起來比寫業(yè)務(wù)代碼本身還頭疼。我最早接觸分布式事務(wù)解決方案時試過基于消息隊列的最終一致性也折騰過兩階段提交2PC各有各的麻煩。消息隊列方案對業(yè)務(wù)侵入大補償邏輯復(fù)雜而傳統(tǒng)的2PC對數(shù)據(jù)庫和中間件要求高性能瓶頸明顯在云原生和微服務(wù)拆得越來越細的今天顯得有點力不從心。正是在這種背景下像Seata這樣的分布式事務(wù)框架開始流行起來。它把那些復(fù)雜的協(xié)調(diào)、回滾邏輯封裝起來給我們提供了一套相對統(tǒng)一的編程模型。Seata支持好幾種模式比如AT自動補償、TCCTry-Confirm-Cancel、Saga長事務(wù)等。今天我們不聊別的就聚焦在TCC模式上。為什么是TCC因為在我看來它是業(yè)務(wù)侵入性、性能和數(shù)據(jù)強一致性之間一個非常不錯的平衡點。它不像AT模式那樣嚴(yán)重依賴數(shù)據(jù)庫的undo log對某些不支持undo log的數(shù)據(jù)庫或中間件不友好也不像Saga模式那樣一階段就提交可能產(chǎn)生臟讀。TCC要求我們開發(fā)者自己定義三個明確的階段Try、Confirm、Cancel雖然多寫了一些代碼但換來了對事務(wù)邊界的絕對掌控和對各種異構(gòu)數(shù)據(jù)源比如Redis、ES、MQ的支持能力。網(wǎng)上關(guān)于Seata TCC的教程不少但很多要么是官網(wǎng)示例的簡單復(fù)刻要么只講通了Demo一遇到生產(chǎn)環(huán)境的復(fù)雜場景——比如嵌套調(diào)用、并發(fā)沖突、空回滾、冪等控制——就語焉不詳。這篇文章我就結(jié)合自己最近在一個電商履約系統(tǒng)中落地Seata TCC 1.4.2的真實經(jīng)歷把從環(huán)境搭建、代碼編寫、到各種坑的排查和填平過程給你完整地捋一遍。我們的目標(biāo)是讓你看完之后不僅能跑通一個TCC示例更能理解其內(nèi)在機制具備在實際項目中設(shè)計和駕馭TCC事務(wù)的能力。2. 環(huán)境與項目骨架避開第一個坑在開始寫一行業(yè)務(wù)代碼之前先把環(huán)境搭對能省掉后面80%的莫名其妙的問題。我這次用的是Seata 1.4.2版本部署方式選擇了Docker Compose這比直接下載jar包運行要方便和干凈得多。2.1 部署Seata Server (TC)TC是Transaction Coordinator事務(wù)協(xié)調(diào)器是Seata的大腦必須最先啟動。很多人卡在第一步就是因為沒搞清楚配置。首先你需要一個docker-compose.yml文件。網(wǎng)上很多教程給的配置還是老版本的直接抄過來可能連服務(wù)都起不來。下面是我驗證過可用的1.4.2版本配置version: 3.8 services: seata-server: image: seataio/seata-server:1.4.2 container_name: seata-server ports: - 8091:8091 # 事務(wù)協(xié)調(diào)器默認(rèn)端口 - 7091:7091 # 控制臺端口1.4.2開始自帶控制臺 environment: - SEATA_IP你的服務(wù)器IP # 重要如果是云服務(wù)器填內(nèi)網(wǎng)IP本地測試填127.0.0.1 - SEATA_PORT8091 - STORE_MODEfile # 事務(wù)日志存儲模式單機測試用file最簡單。生產(chǎn)環(huán)境請用db或redis - SERVER_NODE1 # 節(jié)點編號單機就是1 volumes: - ./seata-config:/seata-server/resources networks: - seata-net networks: seata-net: driver: bridge這里有幾個關(guān)鍵點SEATA_IP這是最大的坑。這個IP是TC服務(wù)對外暴露的地址Client你的業(yè)務(wù)服務(wù)要靠這個地址來連接TC。如果你在本地用Docker跑Client是宿主機上的Spring Boot應(yīng)用那么這里應(yīng)該填宿主機的IP127.0.0.1或本機局域網(wǎng)IP而不是容器內(nèi)部的IP。如果填錯了Client會連不上TC報“no available server to connect”錯誤。存儲模式STORE_MODEfile表示將事務(wù)日志全局事務(wù)會話、分支事務(wù)記錄等存在本地文件。這對于開發(fā)測試完全沒問題重啟容器數(shù)據(jù)就沒了。生產(chǎn)環(huán)境絕對不要用file模式因為無法支持集群和高可用。生產(chǎn)環(huán)境應(yīng)該用db模式并配置好對應(yīng)的數(shù)據(jù)庫連接信息。控制臺從1.4.2開始Seata Server自帶了一個簡單的控制臺訪問http://你的IP:7091即可默認(rèn)賬號密碼是seata/seata??梢栽谏厦娌榭慈质聞?wù)列表和狀態(tài)對于調(diào)試非常有用。啟動命令很簡單docker-compose up -d。用docker logs -f seata-server查看日志看到 “Server started...” 的字樣就說明啟動成功了。2.2 準(zhǔn)備業(yè)務(wù)項目TM/RMTC搭好了接下來是事務(wù)參與者也就是我們的業(yè)務(wù)服務(wù)。我們需要創(chuàng)建一個簡單的多模塊Spring Boot項目來模擬分布式場景。假設(shè)我們有一個“訂單服務(wù)”和一個“庫存服務(wù)”。項目依賴是關(guān)鍵。在父pom中引入Spring Cloud和Spring Cloud Alibaba的依賴管理。注意版本兼容性我用的組合是Spring Boot: 2.3.12.RELEASESpring Cloud: Hoxton.SR12Spring Cloud Alibaba: 2.2.7.RELEASE在訂單服務(wù)和庫存服務(wù)的pom中都需要引入以下核心依賴!-- Seata 客戶端 -- dependency groupIdio.seata/groupId artifactIdseata-spring-boot-starter/artifactId version1.4.2/version /dependency !-- Spring Cloud Alibaba Nacos 作為配置和注冊中心也可用Eureka等 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency配置文件application.yml是另一個容易出錯的地方。訂單服務(wù)作為事務(wù)發(fā)起者TM的配置示例spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 # Nacos地址 config: server-addr: localhost:8848 file-extension: yaml seata: application-id: ${spring.application.name} tx-service-group: my_test_tx_group # 事務(wù)組需要和TC配置對應(yīng) enable-auto-data-source-proxy: false # TCC模式不需要數(shù)據(jù)源代理設(shè)為false config: type: nacos # 從Nacos讀取TC配置 nacos: server-addr: ${spring.cloud.nacos.config.server-addr} group: SEATA_GROUP >dependency groupIdio.seata/groupId artifactIdseata-rm-tcc/artifactId version1.4.2/version /dependency然后定義接口。這個接口必須被業(yè)務(wù)實現(xiàn)類實現(xiàn)并且方法要遵循特定規(guī)則LocalTCC // 聲明這是一個本地TCC接口 public interface InventoryTccAction { /** * Try 方法 * param businessKey 業(yè)務(wù)唯一鍵用于標(biāo)識本次操作 * param productId 商品ID * param count 扣減數(shù)量 * return 是否成功 */ TwoPhaseBusinessAction(name inventoryTccAction, commitMethod commit, rollbackMethod cancel) boolean prepare(BusinessActionContext actionContext, BusinessActionContextParameter(paramName productId) String productId, BusinessActionContextParameter(paramName count) Integer count); /** * Confirm 方法 * param actionContext 業(yè)務(wù)上下文框架自動注入包含prepare方法的參數(shù) * return 是否成功 */ boolean commit(BusinessActionContext actionContext); /** * Cancel 方法 * param actionContext 業(yè)務(wù)上下文 * return 是否成功 */ boolean cancel(BusinessActionContext actionContext); }關(guān)鍵注解解析LocalTCC: 標(biāo)識這是一個TCC接口可以是Spring Bean。TwoPhaseBusinessAction: 核心注解標(biāo)注在Try方法上。name: TCC事務(wù)的名稱全局唯一用于標(biāo)識這個業(yè)務(wù)動作。commitMethod: Confirm方法的方法名。rollbackMethod: Cancel方法的方法名。BusinessActionContextParameter: 標(biāo)注在Try方法的參數(shù)上框架會將這些參數(shù)值保存到BusinessActionContext中并自動傳遞給后續(xù)的Confirm/Cancel方法。這是TCC模式能正確回滾的關(guān)鍵因為Cancel方法需要知道Try階段凍結(jié)的是哪個商品、多少數(shù)量。3.2 實現(xiàn)TCC接口接下來是實現(xiàn)類。這里的設(shè)計直接關(guān)系到事務(wù)的可靠性。Service public class InventoryTccActionImpl implements InventoryTccAction { Autowired private InventoryMapper inventoryMapper; Override Transactional(rollbackFor Exception.class) public boolean prepare(BusinessActionContext actionContext, String productId, Integer count) { // 1. 檢查庫存是否充足 Inventory inventory inventoryMapper.selectById(productId); if (inventory null || inventory.getAvailable() count) { throw new RuntimeException(庫存不足); } // 2. 執(zhí)行預(yù)留操作凍結(jié)庫存 int frozen inventory.getFrozen() null ? 0 : inventory.getFrozen(); int newFrozen frozen count; int newAvailable inventory.getAvailable() - count; int updateCount inventoryMapper.updateFrozenAndAvailable(productId, newFrozen, newAvailable); if (updateCount ! 1) { throw new RuntimeException(凍結(jié)庫存失敗可能并發(fā)沖突); } // 3. 記錄預(yù)留日志可選但推薦用于冪等和排查 // 可以將 xid, branchId, productId, count, status(try) 插入一張單獨的日志表 log.info(TCC Try 成功。xid{}, productId{}, count{}, actionContext.getXid(), productId, count); return true; } Override Transactional(rollbackFor Exception.class) public boolean commit(BusinessActionContext actionContext) { String xid actionContext.getXid(); String productId (String) actionContext.getActionContext(productId); Integer count (Integer) actionContext.getActionContext(count); log.info(TCC Confirm 開始。xid{}, productId{}, count{}, xid, productId, count); // 1. 冪等性檢查查詢?nèi)罩颈砣绻搙id和branchId已經(jīng)執(zhí)行過confirm則直接返回true // if (tccLogService.isConfirmed(xid, branchId)) { return true; } // 2. 執(zhí)行真正的扣減將凍結(jié)的庫存清零總庫存減少 int updateCount inventoryMapper.confirmDeduct(productId, count); if (updateCount ! 1) { // 這里可能因為Try階段數(shù)據(jù)被篡改等原因失敗需要告警和人工介入 log.error(TCC Confirm 失敗xid{}, xid); // 通常Confirm不允許失敗失敗后應(yīng)不斷重試直到成功??蚣軙卦?。 throw new RuntimeException(Confirm扣減庫存失敗); } // 3. 更新日志表狀態(tài)為 commit // tccLogService.updateStatus(xid, branchId, commit); log.info(TCC Confirm 成功。xid{}, xid); return true; } Override Transactional(rollbackFor Exception.class) public boolean cancel(BusinessActionContext actionContext) { String xid actionContext.getXid(); String productId (String) actionContext.getActionContext(productId); Integer count (Integer) actionContext.getActionContext(count); log.info(TCC Cancel 開始。xid{}, productId{}, count{}, xid, productId, count); // 1. 冪等性檢查查詢?nèi)罩颈砣绻搙id和branchId已經(jīng)執(zhí)行過cancel則直接返回true // if (tccLogService.isCancelled(xid, branchId)) { return true; } // 2. 執(zhí)行取消操作釋放凍結(jié)的庫存 int updateCount inventoryMapper.cancelDeduct(productId, count); if (updateCount ! 1) { // Cancel失敗也需要重試。但這里有個“空回滾”問題需要處理見下文。 log.error(TCC Cancel 失敗xid{}, xid); throw new RuntimeException(Cancel釋放庫存失敗); } // 3. 更新日志表狀態(tài)為 cancel // tccLogService.updateStatus(xid, branchId, cancel); log.info(TCC Cancel 成功。xid{}, xid); return true; } }實現(xiàn)要點與坑點數(shù)據(jù)庫操作Try階段是凍結(jié)Confirm是扣減凍結(jié)值Cancel是釋放凍結(jié)值。這三個操作必須是冪等的。這意味著即使網(wǎng)絡(luò)超時導(dǎo)致TC重復(fù)調(diào)用執(zhí)行多次也不會對數(shù)據(jù)狀態(tài)產(chǎn)生錯誤影響。上面的代碼通過“冪等性檢查”和“基于狀態(tài)的更新”如update table set frozen frozen - #{count} where product_id #{id} and frozen #{count}來保證。業(yè)務(wù)上下文BusinessActionContext是框架在Try階段幫你保存的參數(shù)包在Confirm/Cancel階段自動注入。務(wù)必用BusinessActionContextParameter注解標(biāo)記所有Cancel階段需要的參數(shù)。本地事務(wù)每個TCC方法prepare, commit, cancel都標(biāo)注了Transactional。這是因為每個階段本身可能包含多個數(shù)據(jù)庫操作需要保證其原子性。Seata的全局事務(wù)是由這些本地事務(wù)組合而成的。日志表強烈建議建立一張獨立的TCC事務(wù)日志表。記錄xid全局事務(wù)ID、branchId分支事務(wù)ID、業(yè)務(wù)鍵、狀態(tài)try/commit/cancel、創(chuàng)建時間。它的作用巨大冪等控制在Confirm/Cancel前先查日志避免重復(fù)執(zhí)行。問題排查當(dāng)出現(xiàn)異常時可以通過日志還原事務(wù)執(zhí)行鏈路。防懸掛配合“空回滾”檢查。4. 發(fā)起與管控全局事務(wù)TM的角色庫存服務(wù)的TCC接口準(zhǔn)備好了現(xiàn)在需要在訂單服務(wù)事務(wù)管理器TM中發(fā)起并管理這個全局事務(wù)。在訂單服務(wù)的業(yè)務(wù)方法上使用GlobalTransactional注解即可開啟一個Seata全局事務(wù)。Service public class OrderServiceImpl implements OrderService { Autowired private InventoryTccAction inventoryTccAction; // 通過Feign或Dubbo引入的遠程TCC接口代理 Autowired private OrderMapper orderMapper; Override GlobalTransactional(name createOrder, timeoutMills 60000, rollbackFor Exception.class) public Order createOrder(OrderDTO orderDTO) { // 1. 創(chuàng)建訂單本地事務(wù) Order order new Order(); // ... 設(shè)置訂單屬性 orderMapper.insert(order); // 2. 調(diào)用庫存服務(wù)執(zhí)行TCC Try階段 BusinessActionContext context new BusinessActionContext(); context.setActionName(inventoryTccAction); // 這里實際是通過RPC框架如Feign調(diào)用了 inventoryTccAction.prepare(context, ...) boolean tryResult inventoryTccAction.prepare(context, orderDTO.getProductId(), orderDTO.getCount()); if (!tryResult) { throw new RuntimeException(庫存預(yù)留失敗); } // 注意Try階段只是預(yù)留資源訂單創(chuàng)建和庫存預(yù)留都未最終提交。 // 3. 這里可以繼續(xù)調(diào)用其他TCC服務(wù)比如扣減積分、優(yōu)惠券... // 如果所有Try都成功GlobalTransactional 注解的方法正常結(jié)束Seata會自動觸發(fā)所有參與者的Confirm階段。 // 如果此處拋出異常Seata會自動觸發(fā)所有參與者的Cancel階段。 return order; } }TM端的關(guān)鍵點GlobalTransactional這是TM的標(biāo)識。它會在方法開始時向TC申請一個全局事務(wù)IDXID并將其通過線程上下文傳播到所有遠程調(diào)用中。超時控制timeoutMills很重要。它定義了整個全局事務(wù)的超時時間。如果超過這個時間事務(wù)還未完成所有分支未到達終態(tài)TC會主動發(fā)起回滾。需要根據(jù)業(yè)務(wù)鏈路的復(fù)雜度合理設(shè)置。異?;貪L默認(rèn)情況下只有RuntimeException和Error會觸發(fā)回滾。如果你希望受檢異常也回滾需要使用rollbackFor屬性指定。RPC調(diào)用調(diào)用inventoryTccAction.prepare看起來是本地調(diào)用但實際上它應(yīng)該是一個遠程服務(wù)的代理。你需要通過Feign或Dubbo將InventoryTccAction接口暴露為遠程服務(wù)并在訂單服務(wù)中通過FeignClient等方式引入。Seata的TCC組件會自動攔截這個調(diào)用將其注冊為一個分支事務(wù)到TC。5. 生產(chǎn)環(huán)境避坑指南空回滾、冪等與懸掛如果只是跑通Demo上面的知識就夠了。但一旦上生產(chǎn)你會遇到幾個經(jīng)典的“坑”。不處理好它們分布式事務(wù)的可靠性無從談起。5.1 空回滾Empty Rollback問題描述一個分支事務(wù)的Try方法因網(wǎng)絡(luò)超時等原因根本沒有執(zhí)行但TM卻發(fā)起了全局回滾導(dǎo)致TC調(diào)用了該分支的Cancel方法。后果Cancel方法執(zhí)行了“釋放凍結(jié)資源”的操作但Try根本沒凍結(jié)過任何資源。這可能導(dǎo)致數(shù)據(jù)不一致比如庫存被錯誤地增加了。解決方案在Cancel方法中必須進行空回滾判斷。Override public boolean cancel(BusinessActionContext actionContext) { String xid actionContext.getXid(); Long branchId actionContext.getBranchId(); // 1. 查詢事務(wù)日志表判斷Try是否執(zhí)行過 TccLog tccLog tccLogService.getByXidAndBranchId(xid, branchId); if (tccLog null) { // Try沒執(zhí)行過是空回滾 log.warn(收到空回滾請求xid{}, branchId{}. 插入一條取消記錄防止懸掛。, xid, branchId); // 插入一條狀態(tài)為‘cancel’的記錄目的是為了“占位”防止后續(xù)的懸掛問題 tccLogService.insertCancelLog(xid, branchId, productId, count); return true; // 空回滾直接返回成功 } // 2. 如果已經(jīng)執(zhí)行過Cancel冪等返回 if (cancel.equals(tccLog.getStatus())) { return true; } // 3. 正常執(zhí)行Cancel邏輯... }核心就是Cancel時檢查Try是否已執(zhí)行。沒執(zhí)行過就是空回滾記錄一條Cancel日志后直接返回不執(zhí)行業(yè)務(wù)邏輯。5.2 冪等控制Idempotence問題描述由于網(wǎng)絡(luò)抖動或TC重試機制Confirm或Cancel接口可能會被重復(fù)調(diào)用。后果如果不做冪等重復(fù)的Confirm會導(dǎo)致資源被多次扣減重復(fù)的Cancel會導(dǎo)致資源被多次釋放。解決方案利用事務(wù)日志表實現(xiàn)冪等。在Try成功后插入一條狀態(tài)為try的記錄。在Confirm/Cancel執(zhí)行前先查日志。如果狀態(tài)已經(jīng)是commit/cancel則直接返回成功。執(zhí)行完Confirm/Cancel業(yè)務(wù)邏輯后更新日志狀態(tài)為commit/cancel。所有數(shù)據(jù)庫更新操作盡量使用帶狀態(tài)的更新語句例如-- Confirm: 扣減凍結(jié)值同時確保凍結(jié)值足夠 UPDATE inventory SET frozen frozen - #{count}, total total - #{count} WHERE product_id #{productId} AND frozen #{count}; -- Cancel: 釋放凍結(jié)值同時確保凍結(jié)值足夠 UPDATE inventory SET frozen frozen - #{count}, available available #{count} WHERE product_id #{productId} AND frozen #{count};這樣即使重復(fù)執(zhí)行只要條件不滿足影響行數(shù)就是0不會破壞數(shù)據(jù)。5.3 懸掛Hanging問題描述空回滾發(fā)生后之前被阻塞的Try請求終于到達了服務(wù)端并執(zhí)行成功。后果Try在Cancel之后執(zhí)行導(dǎo)致資源被凍結(jié)但再也沒有Confirm或Cancel來釋放它了因為全局事務(wù)已結(jié)束造成資源永久鎖定。解決方案在Try方法中進行懸掛判斷。Override public boolean prepare(BusinessActionContext actionContext, String productId, Integer count) { String xid actionContext.getXid(); Long branchId actionContext.getBranchId(); // 懸掛檢查在執(zhí)行業(yè)務(wù)前先查日志 TccLog tccLog tccLogService.getByXidAndBranchId(xid, branchId); if (tccLog ! null cancel.equals(tccLog.getStatus())) { // 發(fā)現(xiàn)已經(jīng)有一條Cancel日志說明發(fā)生了空回滾且Cancel先于Try到達 log.warn(檢測到懸掛Try方法被拒絕執(zhí)行。xid{}, branchId{}, xid, branchId); return true; // 或者拋出一個特定的異常讓TM感知 } // ... 正常的Try業(yè)務(wù)邏輯 // 執(zhí)行業(yè)務(wù)后插入狀態(tài)為‘try’的日志 tccLogService.insertTryLog(xid, branchId, productId, count); return true; }核心是Try執(zhí)行前檢查是否已有對應(yīng)xid和branchId的Cancel記錄。如果有說明是懸掛應(yīng)拒絕執(zhí)行Try業(yè)務(wù)邏輯??栈貪L、冪等、懸掛這三個問題是TCC模式在生產(chǎn)環(huán)境落地必須解決的“三座大山”。解決它們的核心工具就是那張TCC事務(wù)日志表。通過它記錄狀態(tài)所有操作都變成“先查后改”的模式從而保證最終一致性。6. 進階話題嵌套調(diào)用、并發(fā)與監(jiān)控解決了基本可靠性問題我們再看一些更復(fù)雜的場景。6.1 嵌套的TCC調(diào)用有時候一個TCC服務(wù)內(nèi)部需要調(diào)用另一個TCC服務(wù)。比如“創(chuàng)建訂單”事務(wù)中調(diào)用“庫存服務(wù)”的TCC接口而“庫存服務(wù)”的Try操作里又需要調(diào)用“倉儲服務(wù)”的TCC接口來鎖定庫位。Seata是支持這種嵌套的。關(guān)鍵在于XID的傳遞。只要確保RPC框架如Dubbo、Feign的過濾器正確地將當(dāng)前線程上下文中的XID傳遞到下游服務(wù)Seata就能自動識別并管理這個嵌套分支事務(wù)。它會形成一個調(diào)用樹TC會確保所有分支包括嵌套的一起提交或回滾。在代碼上不需要特殊處理只需確保每個服務(wù)都正確引入了Seata客戶端并配置了事務(wù)組。6.2 高并發(fā)下的資源競爭在TCC的Try階段我們經(jīng)常要“凍結(jié)”資源。在高并發(fā)場景下對同一條記錄比如同一商品庫存的凍結(jié)操作可能發(fā)生沖突。解決方案數(shù)據(jù)庫悲觀鎖在Try方法的SQL中使用SELECT ... FOR UPDATE先鎖定記錄再執(zhí)行更新。但這會嚴(yán)重影響性能。樂觀鎖在庫存表中增加一個版本號字段。Try操作時使用UPDATE ... SET frozen frozen #{count}, version version 1 WHERE id #{id} AND version #{oldVersion}。如果更新失敗影響行數(shù)為0說明發(fā)生了并發(fā)沖突可以重試或直接返回失敗。分布式鎖在進入Try業(yè)務(wù)邏輯前用Redis或Zookeeper對業(yè)務(wù)鍵如lock:inventory:{productId}加鎖。這是最常用的方式但要注意鎖的粒度、超時時間和釋放的可靠性。我個人更傾向于“樂觀鎖 有限重試”或“細粒度分布式鎖”的組合。在庫存凍結(jié)場景可以在應(yīng)用層用Redis分布式鎖控制同一商品ID的并發(fā)然后在數(shù)據(jù)庫層用樂觀鎖做最終保障。6.3 監(jiān)控與排查當(dāng)TCC事務(wù)出現(xiàn)問題時排查鏈路比普通調(diào)用復(fù)雜。你需要關(guān)注幾個點Seata TC控制臺訪問http://tc-server:7091查看全局事務(wù)列表。你可以看到每個全局事務(wù)的XID、狀態(tài)、開始時間、耗時以及其下所有分支事務(wù)的狀態(tài)。這是最直觀的定位工具。業(yè)務(wù)日志在TCC接口的三個方法中務(wù)必打印包含XID和BranchId的日志。這是串聯(lián)整個事務(wù)鏈路的唯一標(biāo)識。通過ELK或類似的日志聚合系統(tǒng)用XID可以輕松搜出該事務(wù)在所有微服務(wù)中的執(zhí)行痕跡。事務(wù)日志表你業(yè)務(wù)庫里的那張TCC日志表是最終的證據(jù)。通過它可以清楚地看到每個分支事務(wù)走到了哪一步try/commit/cancel以及執(zhí)行時間。如果發(fā)現(xiàn)一個事務(wù)長時間處于“try”狀態(tài)那很可能發(fā)生了懸掛如果大量“cancel”日志沒有對應(yīng)的“try”日志那可能是空回滾頻發(fā)需要檢查網(wǎng)絡(luò)或超時配置。Metrics監(jiān)控Seata客戶端會暴露一些Metrics需要額外配置比如全局事務(wù)提交/回滾次數(shù)、分支事務(wù)注冊次數(shù)、各種模式的耗時等??梢越尤隤rometheus和Grafana對分布式事務(wù)的健康度進行監(jiān)控和告警。7. 總結(jié)與個人體會走完這一整套流程從環(huán)境搭建、代碼編寫到填坑進階你應(yīng)該對Seata TCC模式有了比較立體的認(rèn)識。它不是銀彈需要你付出額外的設(shè)計設(shè)計TCC接口和資源預(yù)留邏輯和編碼實現(xiàn)三階段方法成本。但換來的是對復(fù)雜業(yè)務(wù)場景更強的掌控力以及對異構(gòu)數(shù)據(jù)源的支持。我個人在項目中的體會是設(shè)計階段多花時間在寫代碼前一定要和業(yè)務(wù)方、架構(gòu)師一起把每個分布式事務(wù)的邊界、每個參與服務(wù)的Try/Confirm/Cancel具體操作畫清楚。特別是資源預(yù)留的粒度是鎖整條記錄還是鎖部分字段這直接影響并發(fā)性能。日志表是生命線那張小小的TCC事務(wù)日志表在開發(fā)和排查階段的價值遠超你的想象。一定要建而且要設(shè)計好查詢索引xid, branch_id, status, create_time。超時時間要合理全局事務(wù)超時時間timeoutMills不能設(shè)得太短否則長鏈路業(yè)務(wù)容易超時回滾也不能設(shè)得太長否則出問題時資源鎖定時間過長。需要根據(jù)壓測和線上監(jiān)控來調(diào)整。做好降級和熔斷分布式事務(wù)框架本身也可能成為故障點。如果TC集群不可用你的業(yè)務(wù)應(yīng)該有降級方案比如切到基于消息的最終一致性或者記錄異常工單人工處理。在調(diào)用TCC服務(wù)時也要配置好Feign/Dubbo的超時和熔斷避免一個分支事務(wù)的阻塞拖垮整個全局事務(wù)。最后TCC模式的思想——先試探后確認(rèn)——其實是一種非常普適的解決分布式問題的思路。即使未來你不使用Seata這種通過業(yè)務(wù)日志和狀態(tài)機來實現(xiàn)最終一致性的模式在設(shè)計和處理復(fù)雜業(yè)務(wù)邏輯時依然會給你帶來啟發(fā)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天躁日日躁狠狠狠躁| 久操操| 99色悠悠| www.久久制服糖| 香蕉一区二区三区在线视频| 蜜臀久久99精品久久久久久-DVD| 成人精品在线观看| 日本操逼无码| 久久欧美1卡2卡3| 伦理第一页| 伊人五月天| 成人天天爽| 一区操逼| 亚州色图欧美| 亚洲免费成人精品电影| 成熟熟女国产精品一区二区| 99热99在线| 东北女人高潮视频| www超碰| 四虎884| 国产 丝袜 欧美中文 另类| 欧洲亚洲人人爽爽视频| 91成人在线免费视频| 久久亚洲色图中文字幕| 国产精点久久久成人| 日韩二区三四区五区六区在线看| 久久av成人无码免费| 劲爆欧美人妖三区91| 婷婷影院入口| 九九五月天| 狠狠五月天| 国产一区二区在线播放| 国产夜夜艹| 香蕉国产精品麻豆亚洲欧美日韩| 天天舔天天日天天射| 国产精品久久久久久久黄无码| 夜夜 中文视频rt| 亚洲一区日韩| 成人97人人超碰人人| 97日视频| 91|九色|国产熟女| 少妇综合网| 熟妇高潮一区二| 另类一区| 欧美性第一页| chaopen97久久| A久久| 中国农村熟妇毛片视频| 性欧美91| 欧美白嫩女HD| 91站街按摩店老熟女熟女| 婷婷五月天激情四射| 色第一页| 色综合色| 日本精品网站在线中文| 亚洲丝袜二区在线| 欧美综合色站| 欧美成人黄网色网站| 无码一区二区三区四区五区六区七区八区九区十区视频 | 夜夜综合| 婷婷丁香六月天| 亚洲97成人在线观看| 黄呦呦在线| 五月天婷婷基地| 国产女大学生AV| 伊人网在线视频| 激情第四色| 黄色片A级一区二区三区| 亭亭在线资源| 人人摸人人干| 欧美亚洲手机在线| www.99中文字幕| 玖玖爱免费观看视频| 亚洲日本韩国在线| 久久久久元码视频| 午夜操一操| 男人的午夜天堂| 午夜视频久久久久一区| 亚洲图片视频小说| 欧美人妖内射| 国产一二三福利视频网| 国产精品懂色tv影视免费观看| 人妻无码一区二区三区久久99| 青青草导航在线视频| 熟妇色99| 亚洲综合婷婷| 日本啊啊啊啊啊视频| 搞中出久久| 精品久久艹| 日韩成人综合网| 成人免费视瓶| 大香蕉综合在线| 婷婷导航| www.色婷婷色综合| 精品女同一区| 国产深喉视频一区二区| 久草精品国产99| 亚洲国产欧美一区二区潘金莲| 中文字幕精品日韩中文字幕| 乱人伦 国语对白:视频直接看| 国产精品经典一卡久久久| 国产亚卅97| 屁股久久久久久| 国产成人91一区二区三区| 久9re热视频这里只有精品| 伦伦成年午夜免费视频| 日本福利社| 天堂亚洲精品久久老牛| 五十路熟女人妻一区二区在线观看| 成年无码动漫av片无尽在线 | 日韩图区 偷拍| 啊…啊…操我用力操我| 在线综合 亚洲 欧美中文字幕| 人妻系列无码专区中文有码| 激情小说成人日本无码一| 欧美国产伊人久久久久| 日韩成人小视频| 欧洲Au麻豆| 美女91av| 亚洲精品美女久久久久久久久| 人妻偷拍一区二区三区| 天天操av懂色| 乱伦一二三区| 9I1性色影院| 欧洲乱码视频| 综合网,亚洲,欧美| 精品人妻15区| 91精品久久久久久77777| 中文字幕一区二区无码成人| 天天操女人| 天天干天天拍| 久久人妻一区二区三区高清 | 日韩中文字墓| 亚洲一区二区av| 青青草玖玖爱| 天天干天天日天天射黄色| 久久精品国产亚洲AV高清演员表| 中文字幕丰满人妻日本| 国产一区二区三区高清视频| 绯色一区二区三区不卡少妇| www.91人妻.com| 黄色AV免费| 2017人人操,人人摸| 成人精品在线免费视频| 久久亚洲中文字幕视频| 青椒国产97在线熟女| 亚洲日韩美女中文字幕乱| 国产精品一区午夜福利| 丝袜美腿丝袜| 综合av社区| 先锋激情∨在线视频播放| 亚川综合视频| 久久久国产成人一区二区三区在线| 国产亚洲精品美女久久久m| 国产真实野战在线视频| 免费综合亚洲中文| 久久99亚洲精品久久99果| 国产福利第一视频| 久久婷婷一区二| 97资源欧美| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 色 亚洲 91| 欧美九一精品久久久熟妇| 欧美天天影院| 国产精品久久妻无码网站| 伊人网在线点播| 欧美78p| 97超碰欧美| 国产久久av| 亚洲无 码A片在线观看麻豆| 国产女人和拘做爰视频| 色色无码| 天天综合网1| 亚州综合图片| 欧美色网| 少妇特黄一区二区三区| 欧美色三级片91| 亚洲精品97久久| 青春草莓视频在线观看网址| 嗯啊抽插大香蕉网页| 丝袜加勒比| 嗯,啊。舔我逼| 亚洲97精品| 女优大全 - 91n| 100啪啪视频大全| 欧美,亚洲,日韩,v,天堂,手机在线观看| 另类图片五月天| 一起草三级AV电影在线观看 | 在线观看中文字幕| 全免费a敌肛交毛片免费| 另类在线| 大屁股熟女一区二区三区| 清纯唯美综合| 久久99人妖视频国产| 九九热免费国产视频婷婷伊人五月 | 日韩无码三级影院| 色综合中文字幕不卡| 久久风骚城市| 日韩福利综合一区| 欧美日韩免费专区在线| 亚洲欧洲综合| 大奶啊啊好爽| 蜜臀在线网站| 一起草精品人妻| 麻豆影音天美视频| 亲子敌伦对白在线播放| 国产精品免费视频不卡| 欧美亚洲宗合色性图| 91亚洲人| 97干97色| 亚欧国产无码精品在线| 久久只有精品一区二区三区| 国产97在线视频| 欧美日本一区二区a人| 91最新综合| 久久系列| 久久欧美按摩999| 亚洲另类色综合网站| 国产无码精品无码| 久久久久精| 亚洲人人夜夜澡人人爽| 日韩欧美综合激情| 学生妹天天看| 欧美另类精品xxxx| 狠狠亚洲| 亚洲伊人a线观看视频| 欧美性天天影视| 国产熟女无套内射| 人妻-91porn| 欧美一品道| 天天激情干| 蜜臀99999| 另类亚洲一区二区三区| 躁躁日曰躁2020| 日本东京热久久久电影| 玖玖97综合| 性色综合网| 亚洲精品视频在线播放| 殴美色网| 无遮挡h肉动漫在线观看| 五月丁香影院| 麻豆 亚洲 97| 亚洲综合五月天| 欧美色五月| 在线观看一级α片刺激高潮视频| 青青操97| 青青草吊丝| 啊啊啊好湿久久| 国产欧美伊人| 国产精品3| 四虎 精品 WWW| 国产av激情无码久久天堂| 九九九九一区| 尤物视频视频官网| 久久一二三四五六七八九区区| 欧美色www亚洲国产阿娇要播| 蜜桃久久久久久久| 日本黄色精品专区网站| 污污污8888| 一类无码操逼视频| 校园春色美腿丝袜 | 亚洲精品 欧美精品| 国产日韩精品人妻久久久久色欲网站| 99久久9| 国产情侣自拍在线播放| 久久久蜜桃臀无码视频| 婷婷在线播放| 国产后入| 美女黄码视频午夜| 91色色色| 亚洲九九九| 久久久久久久久久久999| 操B在线观看| 国产97av| 久久精品视频久久久| 成人精品无码| 欧美色图片欧美色图| 90后性网国产欧美| 色香av| 中文字幕版| 日韩精品人妻一| 国产熟码AV| 69超碰综合| 丰满熟女一区二区三区在线播放| 91高跟美女在线播放| 无码丰满熟妇一区二区浪潮AV| 欧美色日| 插入综合网| 久操91视频| 欧美女同在线| 色哟哟1区2区| 九九热免费国产视频婷婷伊人五月| 国内精品a| 欧美日韩中国x| 吻戏激情性巴克| 亚洲成人精品在线一区| 亚洲第一页综合在线| 日韩成人网址| 久久久精品电影| 久久久亚洲熟妇资源| 欧美久久婷| 欧美十八禁网站| 超碰在线一区二区| 久久超碰av在线| 国产 日韩 欧美 人妻 熟女 中文| 国产日韩无码一区二区三区久久区| 97av,com| 亚洲91亚洲| 九九久久99| 亚洲欧美小说| 精品无码一区二区三区| 天天看特黄的免费网站| 国产欧美第五页| 国产精品香蕉热久久新品| a'v在线资源| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 蜜桃色院一区久久 | 8050午夜少妇无码| 草草草草视频| 熟女少妇视频| 人妻喷水| 亚洲精品97中文字幕| 99热综合| 欧美性爱www免费版| 亚州91| 亚洲成人在线乱码色午夜| 欧亚久久偷拍视频| 最新加勒比丝袜在线| 久久精视频美日韩在线视频| ji熟女.com| 91狠狠综合网| 偷拍视频青青草在线视频| 日日碰视频网| 天天操人人操骚逼网站| 久久亚洲不卡一区二区三区| 日日夜夜国产综合| 精品久久久av| 国产欧美伊人| 毛片视频白嫩| 亚洲精品819| 激情五月天视频| 五月天玖玖资源站| 国产亚洲日本精品在线| 麻豆国产视频精品观看| 欧美一级黄色免费专区| 狠狠久久手机视频精品| 日韩 国产 欧美自拍| 亚洲国产精品无码AV久久| 蜜臀99久久国产| 久久久久久久久女黄| 日本不卡免费二区| 久久久一区二区三区麻豆| 97在线欧| 97久久超碰亚洲| 中文字幕伊人| 久久婷婷成人综合色怡春院| 超碰97首页| 91精品婷婷国产综合久久竹菊| 亚洲情色婷婷五月天| 国产欧美伊人| 91 国产丝袜在线放观看| 日韩无码嘿咻黑热久| 再深点灬舒服灬太大了好硬好爽| www色色色com| 中文字幕一区日韩精| 无遮挡h肉动漫在线观看| 思思热免费在线视频| 先锋激情∨在线视频播放| 精品日韩人妻精品一二三区| 欧美伊人久久综合网| 美女黄网| 久久这里只精品免费福利| 亚洲国产成人精品999| 曰韩人妻中文字幕在线| 精品人妻一区二区三区日产| 色屁屁影院www国产| 日韩一二三区| 370p日韩欧美亚洲精品| 97色伦97色伦国产欧美| 国产AV激情无码久久无码 | 亚洲天堂男人天堂网| w w w.久久精品| 天天色黄色影院天天操| 日本在线不卡v二区| 久久露脸国产老熟女| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 九九九九热| 8x福利精品第一福利视频导航| 大黄片做爱的大的| 日韩中文欧美| 伊蕉97蜜桃97狠狠综合干| 超碰97综合网| 五月天我淫我色av| 国产成人无码网站在线视频| 无码欧美有限公司| 91成人久久| 综合亚洲欧美| 成人性爱av.com| 99自拍视频在线观看| 亚洲天堂女优在线| 国产精品高朝久久久久久久| 国产精品96| 99久久久久久亚洲精品不卡| 一区二区三区欧美激情| 亚洲精品天天影视综合网| 丝袜美腿射精91| 精品人妻一区二区三区四区不卡在| 天天操人人操狠狠插| 三级片网站在线播放| 欧亚乱色熟一区二区三四区| 亚洲天堂久| 欧美精品三级黄片| 丁香五月性| 精品十三区| 国产精品日日摸天天碰| 国产第12页| 日韩久久激情精品| 国产精品色哟哟| 大香蕉中文201| 色天使亚洲综合在线观看| 激情色播| 伊人久久大香蕉线AV五月天| 无码人妻精品酒店| 操人91| 亚洲欧美日韩电影网站一区 | 久草婷婷| 69一区二区| 婷婷丁香在线| 国产99999久久精品| 99久久精品国产系列| 久久婷婷影院| 中出人妻中文字幕91在线| 先锋激情∨在线视频播放| 超碰人人在线| 蜜桃臀一区二区三区久久| 亚洲人妻中文在线视频| 人人澡人人爽人人精品| 少妇被c 黄 免费观看| 99re国产中文字幕| 91美女视频电影| 91东京热男人的天堂| 99国产精品人妻人伦| 老熟妇一区二区三区| 国产高清无码一区三区二区| 嗯嗯嗯啊啊啊操的我好爽| 蜜臀AV午夜精品久| 91狼人| 蜜臀av网址| 婷婷超| 日韩精品国产精品五码一区二区| 蜜臀va69| 成人网址在线观看| 精品少妇一区二区| 综合色图区| 一区二区无码视频| 日本午夜久久电影| 欧美人妻熟女在线| 精品国产精品一区二区| 夜夜无码| www99热| 熟女少妇一区二区三区| 99热综合| 97精品视频| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 600国产精品视频| 成人综合久久精品色婷婷| 激情久久日韩精品中文字幕麻豆| 国产日韩欧美亚洲精品95 | 爱爱久久| 日韩人妻播放| 97综合久第一页| 99久久婷婷国产综合精品草原| 丝袜美腿91| 久久精彩视频| www亚洲欧美| 蜜桃视频精品一区二区| 欧美欧美少妇| 一区二区首页| 成人七区| 欧亚 另类 久| 99色视频| 搡老熟女免费视频| 国产精品丝袜久久亚洲不卡| A 天堂在线观看视频| 男人天堂最新手机版在线青青草| 99∨VTV| 午夜操一操| 96爱综合| 性爱精品一区| 国产精品福利视频| 五月天综合网| 色五月激情网| 1769一区| 色噜噜人妻av中文字幕| 久操综合在线| 日韩免费高清大片在线| 人澡逼| 首页亚洲国产高跟丝袜诱惑视频| 国产福利合集| 久久同城AV| 花野真衣| 国产aⅴ无码片毛片一级网站| 久超碰这里只有精品| 亚州国产精品乱| 青娱乐欧美激情一区二区| 92大香蕉| 不卡九肏| 国产免费久久久久| 老熟女乱伦片| 亚洲中文字幕一区二区| 91嫩草欧美| 日韩黄色成人性爱| 一级做a爰片性色毛片久久| 97国产精品久久久久| 日本特黄f c2| 99久久久er直播网址| 97视频免费播放| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 青女在线| 激情综合97| 日韩av在线免费网站| 天天久久| 男人天堂免费| 91成人在线| 精品国产肉丝袜在线拍国语| 老外又粗又长一晚做五次| 亚洲色欧| 女人的天堂大香蕉网| 日韩精品区二区三区不卡| 久久透逼视频| 国产精品96| 偷拍新久久| 99re在线观看| 日本熟妇熟色97一本在线观看| 日韩AV无码中文一区二区| 精品国产乱码久久| 青青草依人大香蕉| 天天做天天爱天天爽AV| 亚洲一区二区麻豆影院| 日韩丝袜二区| 久草免费福利在线播放| 国产强奸乱伦欧美| 色香欲影| 亚州欧美在线| 蜜桃午夜视频一区二区| 久色99999| 色香在线| 欧美激情片一区二区| 欧美淫穴| 中文字幕精品一区二区精品| www色日本| av午夜影院在线播放| 欧美爆乳精品一区二区| 欧美性高潮在线| A片大香蕉在线| 中文字幕狠狠玩| 2024人人操人人摸| 超碰色中文| 97碰碰日本乱偷人妻中文的| 超碰538| 91少妇通奸网站| 91无码西班牙视频在线| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | AV乱伦专区| 色香色香欲天天天影视综合网| 舔人妻中文免费视频| 上海一级黄片| 伊人aaa| 飘花国产午夜精品不卡| 99精彩视频| 精品人妻一区二区三区蜜桃视频| 午夜爽爽爽在线观看永久入口姬片| 白丝AV网站| 欧美成人免费在线观看| 欧美 亚洲 制服 精品| 91美| 激情综合网激情五月天| 九色 蝌蚪 熟女自| 免费看日本操逼视频| 少妇精品久久久| 香蕉热人人精品| 日韩 欧美 校园一区| 2019精品国产无码成人| 青青草伊人久久| 超碰97人人cao| 欧洲乱码一区二区| 国产91av在线播放| 超碰精品| 日韩AV无码网站| 欧美性爱一内片一区二区三区| 久久久久久久免费A片国产成a人亚洲精∨品无码| 97精品国产97久久久久久| 欧洲精品一级二级精品综合视频综合| 男人的天堂亚洲| 欧美中出| 亚洲自拍另类丝袜综合| 91香蕉视频在线观看免费| 2017大香蕉国产精品久久| 操逼操逼逼操操逼91 | 91天天综合网,天天综合网| 1000部熟女视频在线观看| 超碰97玖玖爱| 八戒午夜福利理论片| 青青伊人久久| 中日韩熟女| 青青草在线视频播放器| 欧美色五月| 五月丁香激情四射| a人欧美综合天堂麻豆| 69视频入口| 欧美色天堂网在线视频| 日韩午夜精品一区二区三区电影| 加勒比无码毛片| 99久久综合| 极品销魂美女一区二区| 亚洲精品一区二区免费在线观看| 国产精品不卡一区二区三区av| 99国产精品免费| 大香网站| 午夜在线播放| 99操| 欧美在线观看综合国产| 78久久| 国产最新AV| gogogo免费高清看中国国语| 97情超碰色| 人妻AV 中文字幕的| 精品国产无码中文| 欧美日韩人妻精品一区二区三区| 夜夜中出国产| 亚欧成人综合影院| 国产一区二区在线看| 性爱动态120秒| 影音先锋少妇| 色97综合中文字幕| 久9re热视频这里只有精品| 欧美色图 人妻| 99色天堂| 99老司机精品视频在线观看| 9美女超碰在线免费观看| 国产人伦精品一区二区三区| 国产自产自拍| 亚洲国产97| 久久久99999久网站| 激情五月婷| 国产人伦a片信息免费片| 人妻91少妇| 后入式在线免费观看60秒| 久久婷五月天| 性爱乱伦视频免费| 久久久久久加勒比| 亚av顶级裸体一区二区三区四区五区| 欧美专区第一页| 久久久无码av精| 精品无码久久久久久久久果冻糖心| 精吧天堂| 日韩三级网址| www色色com| 亚洲色性| 久久蜜桃综合网| 久热伊人| 欧美日韩国产高清在线一二三区| 本道综合精品| 国产精品久久久久久久久久久久久久久久 | 丁香五月偷拍| 黄在线| 98人妻精品一区二区色欲| 91日韩网站| 裸体美女久久久| 欧美综合加勒比在线| 美日韩成人| 激情综合网五月婷婷五月天| 国语对白露脸XXXXXX| 亚洲毛片久久| 午夜久久久| 久久久久久中文版| 青草视频在线看看看看看看看看看| 亚洲五码一区二区三区| 无码外流操逼视频| 欧美性爱第1 页| 日韩99999| 夜夜嗨免费视频| 亚洲欧美setu| 亚洲国男人的天堂| 无码日韩网站| 国产亚洲精品A在线观看下载| 亚洲人妻五月丁香婷婷| 黑人精品久久97| 久久欧美1卡2卡3| 五月丁香啪啪| 国产综合网站在线播放| 国产日韩区| 麻豆国产精品午夜视频| 久草在线| 天天看片青娱乐| ji熟女.com| 91香蕉国产尤物视频| 97色操| 精品二区三四区五电影 | 中文字幕在线观看第二页| 中文伊人大香蕉视频| www网站黄| 午夜爽爽爽在线观看永久入口姬片| 色官网色综合| 免费一级黄色录像影片| 欧美一级美片在线观看免费| 97久久国产精品女不卡| 日本高清视频在线观看黄已三辽| 手机看av网站在线看| 第二页中文字幕| 青青草依人大香蕉| 欧美色偷拍| 在免费jIzzjIzz在线视频| 亚洲AV麻豆Aⅴ无码电影一| 国产偷人妻精品一区二区在线| 色色婷婷丁香| 亚洲高清无码免费观看视频| 欧美成人性爱视频大全| 日韩人妻一区二区精品| 久久久少妇诱惑精品视频| 手机av亚洲丝袜美腿日韩第一页二页| 亚洲日韩少妇一道本视频| 丰满搜索结果 -第18页- 久久高清无码| 二级久久网| 欧洲与亚洲欧美精品中文字幕| 久久国99999| 91麻豆天美传媒HD| 国产妇女精品视频青青草| 学生妹天天看| 伊人久大| 人妻丝袜美腿中文字幕| 国产91福利小视频在线观看| 亚洲日韩精品久久久久一区壹牛 | 久久青青草原免费视频| 五月丁香拍拍激情综合三级| 亚洲精品精品一区二区| 色综合色色| 五月婷婷基地| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 综合91网| 欧美第五页| 大奶的诱惑| 88xx成人精品视频| 99re公开精品免费视频| 5278欧美一区二区三区| 狠狠色丁香| 大香蕉在线视频15| 啊啊啊97视频| 久久久久久99999国产精品| 羞答答AV中文字| 熟女久久久| 精品一区二区三区蜜桃| 成人羞羞视频国产| 26uuu性物| 欧美另类精品xxxx| 丁香五月天啪啪| 一区黄二区黄| 天欧美在线| 天堂av最新电影网| 99re9| 五月婷婷六月丁香网址| 亚洲AV成人无码久久精品播放| 亚洲宅男天堂| 日夜啪电影| 最新精品久久蜜桃 | 偷拍精品一区二区三区| 亚洲91在线播放影院| 日本99久久| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 日韩免费三级黄片电影| 牛黄色久午久| 熟妇亚洲一区二区三区| wuyechaopeng| 久久高潮妇女视频| 一本久道在线综合视频| 丁香五月婷婷基地| 欧美老妇女内射网址| 亚洲熟女一区二区| 日本中文字幕不卡视频| 五月丁香啪啪网| 乱老熟女一区二区三区| 国产精品日日摸天天碰| 欧美日韩亚洲一区二区在线观看| 久久大香蕉| 精品久久九| 午夜啪| 色小视频蜜乳| 天天干天天日天天射黄色片| 欧美色图 色综合图| 国产精品成人福利在线| 猛交交| 国偷自 一区| 天天射天天操天天干天天吃2018| 园内精品自拍视频在线播放| 99国内精品| 九九九精品一区二区无码| 亚洲天堂男人天堂网| 国产精品亚洲高清在线| 国产精品久久久亚洲一区| 屁股久久久久久久久| 亚洲一区中文精品| 九九久久九九久久| 久草草一二三四区久久| 欧美91精品国产自产| 色婷婷久久| 天天影视网色欲色香| 日韩一级性爱无码| 麻豆天美国美国产AV| 精品无码久久久久| w w w.久久精品| 可以免费观看的AV| 人妻在线大香蕉| 久久久久亚洲Av无码专区老牛影视 | 色色国产| 蜜桃臀一区二区三区久久| 日韩性爱免费观看视频| 丝袜美腿欧美| 国产精品乱码久久久、久久| 1人人看人人摸人人操| 偷拍 精品 另类 四区| 日韩无码AB| 影音先锋每日最新资源在线观看 | 久久久久国产| 八戒午夜福利理论片| 91久久久久久| 国产精品97超碰| 亚洲无码?第一页| 欧美熟女妇同| 18禁在线视频| 国产自产91区13区| 性色亚洲| 小草三级久久观看| 亚洲牲交| 蜜臀久久99精品久久综合| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 在线观看日韩av不卡| 欧美大色交| 国产欧美精选自拍一区| 亚洲视频小说| 性爱视频啪啪啪啪| www.99热在线只有精品| 亚洲影院无码在线| 日本不卡三级网在线播放| 欧美色涩| 狠狠躁AV| 亚洲精品99999| 鲁鲁色综合网| 一区二区三| 青苹果影院男人的天堂| 久久伊人最新网址视频| 一区久久久二区| 中文字幕熟女人妻丝袜| 天天综合精品| A级片日韩欧美国产欧美视频精选观看 | 久久丁香| 天堂综合网| 夜夜中出国产| 曰韩人妻中文字幕在线 | 亚洲男人的天堂va亚洲男人社| aⅴ日韩成人电影av在线免费看av大全| 操淫穴亚洲五月丁香| 少妇干B| 男人的天堂2000| 最新中文字幕在线亚洲| 狠狠操狠狠燥| 亚洲欧美国产日本一区二区三区| 一本久久久精品| 国产精品熟女乱伦| 亚洲一区二区中文字幕| 大胆91| 大香蕉免费3| 精品久久久不卡一区二区| 国产麻豆福利av在线播放| 九久久精| 台湾佬激情综合| 国产一级137片内射麻豆| 日韩精品人妻中文字有码在线| 秋霞影音一区二区三区| 免费视频观看60秒| 久久亚洲影院一区二区| 人人人摸人人| 97精品中文字幕| 五月天综合在线| 人妻久久| 免费农村成人少妇人妻Aa一区二区视频| 欧美人人曰人人操人人射射| 激情文学小说一区二区| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 大香蕉中文在线| 丁香五月婷婷五月| 国产精品视频内谢女人| 97免费视频在线观看视频| 五月天综合在线| 视频一区二区免费在线| 福利天堂| 国产免费一区二区在线A片视频| 欧美第五页| 国产高清1234区| 国产精品爽爽v| 欧美激情 亚洲色图| 久操视频免费在线观看| 久久亚洲AV无码专区首页| 淫纸中9区| 97激情97激情| 国人欧美精品一区二区| 亚洲成人在线乱码色午夜| 久久伊人在线五区| 国产精品久久久久久久毛片1| 久久中文字幕在线观看| 屌妞视频久久久久久久久久久久| 狠狠爱综合网| 国产Av超碰| 婷婷人妻激情| 97色诱| 激情专区综合| 亚洲色系另类精品国产| 熟人人妻少妇精品久久| 熟妇视频一区二区三区在线观看| 日本国产欧美高清在线| 国产强奸乱伦第1页| 欧美精品不卡一二三四在线91| 91女在线观看| 欧美 亚洲 偷拍自拍| 超碰精品日韩欧美国产| 亚洲风情综合网| 久久久av爱| 免费看日本操逼视频| 性色AV网站| 天堂亚洲精品| 嗯嗯,好大,好爽,好骚| 柠檬AV导航| 日韩有码 一区二区三区| 久久久久921| 天天干一区二区| 天堂8在线新版官网| 久久精品 六十路 熟女 欧美| 超碰97久| 三级网站超变态精品| 干婷婷综合网| 欧美一区二区三区互相| 九九九九精品精| 亚洲精品人伦一区二区| 亚洲综合图文| 亚洲情色五月天 | 久久水蜜臀亚洲AV无码精品| 人妻少妇色综合| 人妻精品一区二区在线| 人人操 欧美| 久久老女人| 国产97色在线 | 亚洲| 超碰97男人| 3571色综合一区二区二区| 日本性爱少妇| japan日本高清乱xxxx| 国产真乱mangent| 青娱乐啪啪视频| 97网址97| 久久中日麻豆| 91色女| 丁香六月天| 日本精品成人无码| 日韩欧美加勒比| 99re视频在线播放青草| 蜜桃臀一区二区aV | 蘋果手機免費看成人Av| 国产免费大片| 欧亚综合一卡二卡中文字幕| 熟女人妻一区二区三区| 国产Aα| 91香蕉视频在线观看免费| 青娱乐休闲视频在线观看| 伊人麻豆传媒| 啪啪啪综合| 偷拍99| 99精品综合久久久久五月天| 少妇第一页| 亚州色图欧美| 91黑丝美女| 91/欧美| 91黑丝美女| 久久久久中出| 一区二区三区 丝袜 高跟 美腿| 发朗少妇买婬全视频中文| 丁香五月天堂网| 91精品久久久久久77777| 九九综合色| 狠狠爱综合网| 黄色网址久久精品欧美喷水| 欧美一级三级| 97在线免费看| 欧美亚洲国产自久久| 精品人妻一区二区免费蜜桃| 春色校园综合网| 99这里只有精品| 91 刺激在线| 影音先锋国产精品| 日本综合色图| 亚洲无线码一区国产欧美国| 热99这里只有精品| 最新的亚洲无吗| 333kkkk·亚洲com久久| 欧美性爱视频免费一区一A| 美女国产一区二区久久| 岛园激情| 欧美在线播放aaaa| AA丁香综合激情| 在线观看一卡二卡| 美女啊啊啊啊pc| 国产人伦精品一区二区三区| 清柠毛片| 99re3这里只有精品| 亚洲无套久久嗯嗯| 日韩99神马视频播放片在线播放| 精品国产一区二区久久| 久草视频制服诱惑| 99国产精品久久久久久久成人热| 天天色怡春院| 91模特在线观看| 啊啊啊爽爽| 日本色色视频网站| 中日韩熟女| 91国产精品在线看| 久草视频制服诱惑| 麻豆天美在线喷水AV| 干b网| 熟女探花啪啪| 一本大道不卡一二三区| 亚洲最大的综合性av| 9999久久久久| 亚洲国产综合久久久性感熟妇| 天天舔九色婷婷| 久热大香蕉网站| 日韩精品亚洲一二三| 2017天天插| 少妇一区二区三区高速| 国产超碰人人爽人人做| 欧美九九爱| 久久久99999久网站| 天天综合青苹果| 麻豆视频国产一区二区| 俺去俺来也在线www| 天天综合色电影| 国产后入清纯| 天天日天天干天天摸天天操| 男插女青青影院| 啪啪啪东京| 91久久婷婷| 热天堂一区二区| 99最新日韩偷拍视频| 91美女在线| 亚洲AV成人无码一二三久久 | 国产按摩一区二区三区| 国产传媒美日韩av| 视频黄站| 在线视频 亚洲精品| 日本黄大片在线观看视频| 亚洲综合中文字幕有码 | 亚洲毛片基地专区| 中文精品一区二去| www.色婷婷| 国产乱人妻精品入口| 91老司机精品| 黑人狂躁日本妞一区二区三区| 91日韩在线| 欧亚日韩三区| 国产夫妻性生活视频| 欧美一级黄色免费专区| 亚洲成aⅴ人片不卡无码| 激情AV| 天天综合在线4| 中文字幕午夜精品久久久| 97视频免费在线| 中文AV制服乱伦| 99热伊人| 久久夜夜夜| 性色亚洲| 91精品国产麻豆国产自产在| 精品国产一区二区三区久久久蜜臀 | 一级黄色性爱A级片| 天天综合~91入口| 中文日韩欧美熟| 日韩欧美福利视频看看| 婷婷亚洲综合| 亚av顶级裸体一区二区三区四区五区 | 美女黄色一级A视频| 欧美性天天影院| 国内偷拍精品一区二区| 色情综合| 超碰97首页| 黄片免费视频2019| 激情文学网伊人| 少妇特黄一区二区三区| 芊芊操逼视频无码| 97视频在线免费看| 亚洲乱妇p22| 国产精品亚洲美女久久久久| 黄久在线| 国产精品麻豆免费视频| 九久久精品| 中文字幕三四五区| 亚洲色图殴美色图激情乱伦| 天天摸天天碰天天添青青| 高清孕妇孕交 交| 亚洲中文字幕精品久久久久久直播| 久久久久久久九九九九九九| 久久人妻熟女一区二区| 久久精品国产72国产精品福利| 97精品97久久| 无遮挡男女激烈动态图| 欧美第一页性| 青青久久艹| 激情综合婷婷| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 精品传媒在线一区| 2018色综合天天操| 亚洲天堂久久| 性爱Av免费| 中国熟女网站| 久久男人精品| 亚洲第91页| 电家庭影院午夜69久久夜色精品国产69乱 | 大屁股xxxxx| KK色在线影院| 日本道久久综合色色| 久肏视频字幕| 欧美性爱系列| 加勒比综合在线| 女人高潮大叫一级毛片| 岛国天天午夜影院传媒网| 国产欧美日韩一区二区三区| 欧美久久人妻少妇一区二区| 91性高朝久久久久久久久| 亚洲男人天堂网久久| 国产精品久久久啊| 97人肏| 婷婷操视频| 国产性刺激| а√天堂资源官网在线资源| 性色高清在线| 人人操人人插人人摸人人干| 黄色不卡视频| 377p欧洲日本亚洲大胆| 情侣操 逼视频99| 伊人久操| 天天综合站| 综合色啪| 97日韩| 91丝袜在线观看视频在线观看| 黄色香蕉视频网站一区| 人人贴人人摸| 另类视频在线| 亚洲最大的综合性av| 天躁夜夜躁2021| 亚洲色图超碰在线| 欧美v日韩v亚洲v最新在线| 久插综合| 国产精品免费日韩| 天天干夜夜操一区二区| 超碰人人在线| 亚洲无码精品AV久久久|