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

本地消息表:Spring Boot 實現分布式事務的優雅方案

云計算 分布式
TCC要求每個分支事務實現三個操作:預處理Try、確認Confirm、撤銷Cancel。Try操作做業務檢查及資源預留,Confirm做業務確認操作,Cancel實現一個與Try相反的操作即回滾操作。

前言

在微服務架構中,分布式事務一直是一個棘手的問題,常見的分布式事務解決方案包括:

2PC(兩階段提交)

2PC即兩階段提交協議,是將整個事務流程分為兩個階段,準備階段(Prepare phase)、提交階段(commit phase):

  • 準備階段(Prepare phase):事務管理器給每個參與者發送Prepare消息,每個數據庫參與者在本地執行事務,并寫本地的Undo/Redo日志,此時事務沒有提交。 (Undo日志是記錄修改前的數據,用于數據庫回滾,Redo日志是記錄修改后的數據,用于提交事務后寫入數據文件)
  • 提交階段(commit phase):如果事務管理器收到了參與者的執行失敗或者超時消息時,直接給每個參與者發送回滾(Rollback)消息;否則,發送提交(Commit)消息;參與者根據事務管理器的指令執行提交或者回滾操作,并釋放事務處理過程中使用的鎖資源。注意:必須在最后階段釋放鎖資源。
當所有參與者均反饋yes,提交事務

圖片圖片

當任何階段1一個參與者反饋no,中斷事務

圖片圖片

TCC(Try-Confirm-Cancel)

TCC要求每個分支事務實現三個操作:預處理Try、確認Confirm、撤銷Cancel。Try操作做業務檢查及資源預留,Confirm做業務確認操作,Cancel實現一個與Try相反的操作即回滾操作。TM首先發起所有的分支事務的try操作,任何一個分支事務的try操作執行失敗,TM將會發起所有分支事務的Cancel操作,若try操作全部成功,TM將會發起所有分支事務的Confirm操作,其中Confirm/Cancel操作若執行失敗,TM會進行重試。

  • Try階段是做業務檢查(一致性)及資源預留(隔離),此階段僅是一個初步操作,它和后續的Confirm一起才能真正構成一個完整的業務邏輯。
  • Confirm階段是做確認提交,Try階段所有分支事務執行成功后開始執行Confirm。通常情況下,采用TCC則認為Confirm階段是不會出錯的。即:只要Try成功,Confirm一定成功。若Confirm階段真的出錯了,需引入重試機制或人工處理。
  • Cancel階段是在業務執行錯誤需要回滾的狀態下執行分支事務的業務取消,預留資源釋放。通常情況下,采用TCC則認為Cancel階段也是一定成功的。若Cancel階段真的出錯了,需引入重試機制或人工處理。
  • TM事務管理器可以實現為獨立的服務,也可以讓全局事務發起方充當TM的角色,TM獨立出來是為了成為公用組件,是為了考慮系統結構和軟件復用。
當Try階段服務全部正常執行, 執行確認業務邏輯操作

圖片圖片

當Try階段存在服務執行失敗, 進入Cancel階段

圖片圖片

可靠消息最終一致性

可靠消息最終一致性方案是指當事務發起方執行完成本地事務后并發出一條消息,事務參與方(消息消費者)一定能夠接收消息并處理事務成功,此方案強調的是只要消息發給事務參與方最終事務要達到一致。

正常情況——事務主動方發消息

圖片圖片

異常情況——事務主動方消息恢復

圖片圖片

本地消息表

本地消息表這個方案最初是eBay提出的,此方案的核心是通過本地事務保證數據業務操作和消息的一致性,然后通過定時任務將消息發送至消息中間件,待確認消息發送給消費方成功再將消息刪除。

本地消息表的核心思想是:將分布式事務拆分為多個本地事務,并通過消息表記錄事務狀態。具體流程如下:

  • 業務操作與消息記錄:在同一個本地事務中,執行業務操作并記錄消息到本地數據庫的消息表中
  • 消息發送:事務提交后,通過定時任務或事件監聽機制,將消息發送到消息隊列
  • 消息消費:下游服務從消息隊列消費消息并執行業務操作
  • 消息確認:下游服務處理完成后,通過某種機制確認消息已處理

圖片圖片

這種方案的最大優勢是將分布式事務轉換為本地事務,利用數據庫的ACID特性保證業務操作和消息記錄的原子性。

實現步驟

本地消息表因其實現簡單、可靠性高、性能良好,成為中小型項目的首選方案,本文將詳細介紹本地消息表的原理,并結合Spring Boot提供完整的實現方案。

數據庫設計

-- 消息表結構
CREATE TABLE message (
    id VARCHAR(32) PRIMARY KEY,
    content TEXT NOT NULL,
    topic VARCHAR(100) NOT NULL,
    status VARCHAR(20) NOT NULL COMMENT 'INIT, SENDING, SENT, FAILED',
    retry_count INT DEFAULT 0,
    next_retry_time DATETIME,
    create_time DATETIME NOT NULL,
    update_time DATETIME NOT NULL,
    INDEX idx_status (status),
    INDEX idx_next_retry_time (next_retry_time)
);

-- 業務表示例(如訂單表)
CREATE TABLE orders (
    id VARCHAR(32) PRIMARY KEY,
    user_id VARCHAR(32) NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    status VARCHAR(20) NOT NULL,
    create_time DATETIME NOT NULL,
    update_time DATETIME NOT NULL
);

消息結構

public enum MessageStatus {
    INIT("初始化"),
    SENDING("發送中"),
    SENT("已發送"),
    FAILED("發送失敗");

    private final String description;

    MessageStatus(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }
}

public interface MessageRepository extends JpaRepository<Message, String> {

    List<Message> findByStatusAndNextRetryTimeLessThanEqual(String status, LocalDateTime now);

    @Transactional
    @Modifying
    @Query("UPDATE Message m SET m.status = ?2, m.updateTime = ?3 WHERE m.id = ?1")
    int updateStatus(String id, String status, LocalDateTime updateTime);

    @Transactional
    @Modifying
    @Query("UPDATE Message m SET m.status = ?2, m.retryCount = m.retryCount + 1, " +
            "m.nextRetryTime = ?3, m.updateTime = ?3 WHERE m.id = ?1")
    int updateForRetry(String id, String status, LocalDateTime nextRetryTime);

    @Transactional
    @Modifying
    @Query("DELETE FROM Message m WHERE m.createTime < ?1")
    int deleteOlderThan(LocalDateTime threshold);
}
  • MessageStatus枚舉:定義消息的四種狀態
  • MessageRepository接口:繼承JPA的JpaRepository,提供基本CRUD操作,并定義自定義查詢方法

消息服務實現

@Service
public class MessageServiceImpl implements MessageService {

    @Autowired
    private MessageRepository messageRepository;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Value("${message.retry.interval:60000}")
    private long retryInterval;

    @Value("${message.max.retry:10}")
    private int maxRetry;

    @Value("${message.retention.days:30}")
    private int retentionDays;

    @Override
    @Transactional
    public Message saveMessage(String content, String topic) {
        Message message = new Message();
        message.setId(UUID.randomUUID().toString().replace("-", ""));
        message.setContent(content);
        message.setTopic(topic);
        message.setStatus(MessageStatus.INIT.name());
        message.setCreateTime(LocalDateTime.now());
        message.setUpdateTime(LocalDateTime.now());
        return messageRepository.save(message);
    }

    @Override
    public void sendMessage(Message message) {
        try {
            // 更新消息狀態為發送中
            messageRepository.updateStatus(message.getId(), MessageStatus.SENDING.name(), LocalDateTime.now());
            
            // 發送消息到RabbitMQ
            rabbitTemplate.convertAndSend(message.getTopic(), message.getContent());
            
            // 更新消息狀態為已發送
            messageRepository.updateStatus(message.getId(), MessageStatus.SENT.name(), LocalDateTime.now());
        } catch (Exception e) {
            // 發送失敗,更新重試信息
            handleSendFailure(message, e);
        }
    }

    @Override
    public void processPendingMessages() {
        List<Message> pendingMessages = messageRepository.findByStatusAndNextRetryTimeLessThanEqual(
                MessageStatus.INIT, LocalDateTime.now());
        
        for (Message message : pendingMessages) {
            sendMessage(message);
        }
    }

    @Override
    public void retryFailedMessages() {
        List<Message> failedMessages = messageRepository.findByStatusAndNextRetryTimeLessThanEqual(
                MessageStatus.FAILED, LocalDateTime.now());
        
        for (Message message : failedMessages) {
            if (message.getRetryCount() < maxRetry) {
                try {
                    // 更新消息狀態為發送中
                    messageRepository.updateStatus(message.getId(), MessageStatus.SENDING.name(), LocalDateTime.now());
                    
                    // 重試發送消息
                    rabbitTemplate.convertAndSend(message.getTopic(), message.getContent());
                    
                    // 更新消息狀態為已發送
                    messageRepository.updateStatus(message.getId(), MessageStatus.SENT.name(), LocalDateTime.now());
                } catch (Exception e) {
                    // 重試失敗,更新重試信息
                    handleSendFailure(message, e);
                }
            } else {
                // 超過最大重試次數,記錄日志并標記為永久失敗
                // 可以添加告警機制
                System.err.println("Message exceeded max retry count: " + message.getId());
            }
        }
    }

    @Override
    public void cleanOldMessages() {
        LocalDateTime threshold = LocalDateTime.now().minusDays(retentionDays);
        int deletedCount = messageRepository.deleteOlderThan(threshold);
        System.out.println("Deleted " + deletedCount + " old messages");
    }

    @Override
    public void updateMessageStatus(String messageId, MessageStatus status) {
        messageRepository.updateStatus(messageId, status.name(), LocalDateTime.now());
    }

    private void handleSendFailure(Message message, Exception e) {
        // 計算下一次重試時間
        LocalDateTime nextRetryTime = LocalDateTime.now().plusSeconds(retryInterval);
        
        // 更新消息狀態為失敗并增加重試次數
        messageRepository.updateForRetry(
                message.getId(), 
                MessageStatus.FAILED.name(), 
                nextRetryTime
        );
        
        // 記錄錯誤日志
        System.err.println("Failed to send message: " + message.getId() + ", error: " + e.getMessage());
    }
}
  • saveMessage:創建并保存新消息,設置初始狀態為INIT
  • sendMessage:發送消息到消息隊列,處理發送成功和失敗的情況
  • processPendingMessages:處理待發送的消息
  • retryFailedMessages:重試發送失敗的消息,實現最大重試次數控制
  • cleanOldMessages:清理過期消息,防止消息表過大
  • handleSendFailure:處理發送失敗的情況,更新重試信息

定時任務配置

@Component
public class MessageScheduler {

    @Autowired
    private MessageService messageService;


    /**
     * 定時處理待發送的消息
     */
    @Scheduled(fixedRate = 10000) // 每10秒執行一次
    public void processPendingMessages() {
        messageService.processPendingMessages();
    }

    /**
     * 定時重試失敗的消息
     */
    @Scheduled(fixedRate = 30000) // 每30秒執行一次
    public void retryFailedMessages() {
        messageService.retryFailedMessages();
    }

    /**
     * 定時清理過期消息
     */
    @Scheduled(fixedRateString = "${message.clean.interval}")
    public void cleanOldMessages() {
        messageService.cleanOldMessages();
    }
}
  • processPendingMessages:每 10 秒檢查一次待發送的消息
  • retryFailedMessages:每 30 秒檢查一次需要重試的消息
  • cleanOldMessages:按配置的間隔清理過期消息

業務邏輯

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private MessageService messageService;

    @Override
    @Transactional
    public Order createOrder(String userId, Double amount) {
        // 創建訂單
        Order order = new Order();
        order.setId(UUID.randomUUID().toString().replace("-", ""));
        order.setUserId(userId);
        order.setAmount(amount);
        order.setStatus("CREATED");
        order.setCreateTime(LocalDateTime.now());
        order.setUpdateTime(LocalDateTime.now());
        
        // 保存訂單
        orderRepository.save(order);
        
        // 在同一事務中保存消息(關鍵:確保訂單創建和消息記錄在同一個本地事務中)
        String messageContent = String.format("{\"orderId\":\"%s\",\"userId\":\"%s\",\"amount\":%.2f}", 
                order.getId(), userId, amount);
        messageService.saveMessage(messageContent, "order.created");
        
        return order;
    }
}

消息消費處理

@Component
public class OrderCreatedConsumer {

    @Autowired
    private PaymentService paymentService;

    @Autowired
    private MessageService messageService;

    @Autowired
    private ObjectMapper objectMapper;

    @RabbitListener(queues = "order.created")
    public void handleOrderCreated(String message) {
        try {
            // 解析消息內容
            Map<String, Object> messageData = objectMapper.readValue(message, Map.class);
            String orderId = (String) messageData.get("orderId");
            String userId = (String) messageData.get("userId");
            Double amount = Double.parseDouble(messageData.get("amount").toString());
            
            // 處理訂單創建事件(例如:創建支付記錄)
            paymentService.createPayment(orderId, userId, amount);
            
            // 可以在這里添加其他業務邏輯,如扣減庫存、發送通知等
            
        } catch (Exception e) {
            // 消費失敗,記錄日志
            System.err.println("Failed to process order created message: " + e.getMessage());
            // 注意:RabbitMQ默認會重試,可能導致消息重復消費,需要在業務層處理冪等性
        }
    }
}

@Service
public class PaymentServiceImpl implements PaymentService {

    @Override
    @Transactional
    public void createPayment(String orderId, String userId, Double amount) {
        // 實現支付邏輯
        // 例如:創建支付記錄、調用支付網關、更新訂單狀態等
        
        System.out.println("Creating payment for order: " + orderId + ", amount: " + amount);
        
        // 這里只是示例,實際應用中需要根據業務需求實現具體邏輯
    }
}
  • @RabbitListener注解:監聽指定隊列的消息
  • 業務處理:根據消息內容執行業務邏輯

?

冪等性設計:消費端需要確保業務操作的冪等性,防止重復消費導致的數據不一致。

解決接口冪等問題,只需要記住一句口令"一鎖、二判、三更新",只要嚴格遵守這個過程,那么就可以解決并發問題。

//一鎖:先加一個分布式鎖
@DistributeLock(scene = "OEDER", keyExpression = "#request.identifier", expire = 3000)
public OrderResponse apply(OrderRequest request) {
    OrderResponse response = new OrderResponse();   
    //二判:判斷請求是否執行成功過
    OrderDTO orderDTO = orderService.queryOrder(request.getProduct(), request.getIdentifier());
    if (orderDTO != null) {
        response.setSuccess(true);
        response.setResponseCode("DUPLICATED");
        return response;
    }
    //三更新:執行更新的業務邏輯   
    return orderService.order(request);
}

總結

本地消息表方案的核心在于:

  • 將業務操作和消息記錄放在同一個本地事務中,確保原子性
  • 通過定時任務異步發送消息,避免阻塞業務流程
  • 實現消息重試機制,提高消息發送成功率
  • 消費端實現冪等性,保證數據一致性
責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-06-07 08:06:36

2025-04-29 04:00:00

分布式事務事務消息

2024-06-13 09:25:14

2022-06-27 08:21:05

Seata分布式事務微服務

2023-01-06 09:19:12

Seata分布式事務

2020-07-15 16:50:57

Spring BootRedisJava

2025-07-28 01:12:00

2025-01-26 00:00:40

Seata分布式事務

2021-02-03 10:49:34

JTA分布式事務

2025-04-28 00:44:04

2025-08-05 08:30:08

2025-06-11 08:01:06

2025-08-05 04:22:00

2023-09-14 15:44:46

分布式事務數據存儲

2020-05-28 09:35:05

分布式事務方案

2023-11-06 13:15:32

分布式事務Seata

2022-06-21 08:27:22

Seata分布式事務

2017-07-26 15:08:05

大數據分布式事務

2020-03-31 08:05:23

分布式開發技術

2025-09-01 08:28:41

點贊
收藏

51CTO技術棧公眾號

性高潮视频在线观看| 国产91精品精华液一区二区三区 | 97干在线视频| 日本在线播放视频| 久久丁香四色| 国产精品久久久久aaaa樱花| 91地址最新发布| 欧美三级午夜理伦三级老人| 国产污视频网站| 99re8这里有精品热视频8在线 | 亚洲精品123区| 4438x成人网最大色成网站| 麻豆av一区二区三区久久| 欧美高清视频一区二区三区| 欧美日韩破处视频| 久久久久99精品一区| 992tv成人免费视频| 欧美福利第一页| 偷拍中文亚洲欧美动漫| 91麻豆国产精品久久| 高清欧美性猛交xxxx黑人猛交| 久久久久久国产精品日本| 日本免费中文字幕在线| 国产最新精品| 一本色道久久综合精品竹菊| 国产日韩欧美亚洲一区| 久久久久久久久久综合| 视频亚洲一区二区| 一区二区三区四区高清精品免费观看 | 久久精品a一级国产免视看成人 | 欧美黄色免费影院| 高清乱码毛片入口| 激情文学一区| 日韩av网站导航| 国产精品宾馆在线精品酒店| 国产精品刘玥久久一区| 国产精品自在在线| 九九久久精品一区| av不卡中文字幕| 丁香花在线高清完整版视频| 成人av中文字幕| 国产91成人video| 波多野吉衣中文字幕| av片在线观看永久免费| 国产成人日日夜夜| 久久久女人电视剧免费播放下载| 在线观看日本黄色| 99re8精品视频在线观看| 亚洲精品一二三| 国产91精品入口17c| 欧美成人精品欧美一级乱黄| 视频福利一区| 欧美体内she精视频| 亚洲图片小说在线| 精品人妻一区二区三区浪潮在线 | 在线观看免费高清视频97| 三级a在线观看| 免费成人黄色| 成人精品国产免费网站| 亚洲综合中文字幕在线| 日本一区二区三区免费视频| 免费观看不卡av| 欧美色精品在线视频| 天天想你在线观看完整版电影免费 | 欧美一区二区| 亚洲免费在线视频观看| 一区二区影视| 亚洲欧美综合久久久| 精品国产成人系列| 69堂免费视频| 激情小视频在线| 99re8在线精品视频免费播放| 国产97在线视频| 欧美片一区二区| 精品一区亚洲| 亚洲情综合五月天| 特黄特色免费视频| 亚洲精品一级二级| 亚洲午夜三级在线| 欧美一区二区三区电影在线观看 | 亚洲一区二区三区四区在线| 99热这里只有精品免费| 一区二区三区中文| 久久亚洲国产精品| 网站免费在线观看| 96视频在线观看欧美| 欧美精品在线视频| 男人揉女人奶房视频60分| 超碰一区二区| 亚洲一区二区在线免费观看视频| 天堂8在线天堂资源bt| 国产永久免费高清在线观看 | 亚洲精品美女91| 欧美一区二区三区免费观看 | 天堂成人国产精品一区| 久久久精品久久久| 五月天精品视频| 日韩成人激情| 亚洲美女激情视频| 日本wwwwwww| 日韩高清成人在线| 日韩在线视频观看正片免费网站| 欧美无人区码suv| 欧美熟乱15p| 亚洲视频777| 日韩视频中文字幕在线观看| 成人精品影院| 欧美激情精品久久久久久黑人| 日本激情视频一区二区三区| 成人黄色小视频| 欧美日韩ab片| 成人黄色免费网| 波多野结衣视频一区| 亚洲乱码一区二区三区三上悠亚| 国产视频福利在线| 久久精品免视看| 日本一区二区三区精品视频| 亚洲按摩av| 一区二区在线看| 日本激情视频在线| 欧美久久香蕉| 日韩精品视频免费| 色欲人妻综合网| 视频一区二区欧美| 含羞草久久爱69一区| 天天操天天操天天干| www.日韩大片| 久久www免费人成精品| 亚洲 国产 欧美 日韩| 91最新地址在线播放| 欧美精品一区二区性色a+v| 电影网一区二区| 亚洲国产成人在线视频| 妖精视频一区二区| 欧美黄色网视频| 久久国产加勒比精品无码| 中文字幕电影av| 欧美伊人久久| 国产精品亚发布| 亚洲视频久久久| 狠狠色综合日日| 99re在线| 天天综合网天天综合| 亚洲欧美另类图片小说| 九九九在线观看视频| 精品中文字幕一区二区三区av| 韩国19禁主播vip福利视频| 欧美色图亚洲视频| 久久精品99国产精品| 99高清视频有精品视频| 日本高清视频在线观看| 欧美私人免费视频| 日韩女同一区二区三区| 日本中文字幕一区二区有限公司| 国产一区二区丝袜| 免费av网站观看| 欧美国产日韩一二三区| 水蜜桃一区二区三区| 国产精品刘玥久久一区| 欧美精品一卡二卡| 伊人久久久久久久久久久久久久| 久久se精品一区精品二区| 电影午夜精品一区二区三区| 在线播放蜜桃麻豆| 精品久久一二三区| 久久久久久成人网| 国内揄拍国内精品久久| 国产精品吊钟奶在线| 国产成人久久精品77777综合 | 亚洲色图欧美| yellow视频在线观看一区二区| 18网站在线观看| 精品国产1区2区3区| 亚洲天堂一区在线观看| 国产人成一区二区三区影院| 中日韩av在线播放| 欧美中文一区| 奇米4444一区二区三区| 国产999久久久| 亚洲影院在线观看| 亚洲国产高清av| 西瓜成人精品人成网站| 国产精品jizz在线观看麻豆| 蜜桃91麻豆精品一二三区| 亚洲成a人v欧美综合天堂| 网站在线你懂的| av资源久久| 日本成熟性欧美| 在线免费看av| 在线免费观看日韩欧美| 少妇户外露出[11p]| 日韩在线a电影| 久久综合九色99| 97成人超碰| 亚洲性av在线| 中文字幕一区在线播放| av成人老司机| 激情 小说 亚洲 图片: 伦| 一区二区中文| 欧美在线日韩精品| 日韩在线视频一区二区三区| 欧美中文在线观看国产| 国产在线观看免费麻豆| 日韩福利在线播放| 中文字幕一区二区久久人妻| 久久精品亚洲国产奇米99| 激情在线观看视频| 91精品国产91久久久久久黑人| 国产精品劲爆视频| 宅男在线观看免费高清网站| 日韩激情第一页| 国产精品视频在线观看免费| 亚洲欧洲日韩女同| 不卡中文字幕在线观看| 亚洲精品推荐| 国产精品私人影院| 三级性生活视频| 亚洲免费网址| 一区二区三区在线播| 伊人影院在线观看视频| 成人影院天天5g天天爽无毒影院| 亚洲最大的免费| 日本视频不卡| 亚洲男人av电影| 韩国av永久免费| 91精品国产综合久久香蕉麻豆| 日韩手机在线视频| 亚洲大片在线观看| 亚洲精品乱码久久久久久久| 国产在线观看一区二区| 日本丰满少妇黄大片在线观看| 亚洲春色h网| 国产一区自拍视频| 亚洲精品午夜| 欧美影院久久久| 牛牛精品在线视频| 亚洲精品日韩在线| 波多野结衣视频网址| 国产精品久久久久久久久动漫| 国产精品无码一区二区三区免费 | 99久久精品一区| 丰满少妇中文字幕| 国产美女精品在线| 午夜精品免费看| 麻豆成人综合网| 99热这里只有精品在线播放| 日韩精品亚洲专区| 久久久精品在线视频| 成人精品影院| 午夜老司机精品| 国产一区99| 日韩国产精品一区二区三区| 日日夜夜一区| 国语自产在线不卡| caoprom在线| 亚洲香蕉伊综合在人在线视看| 亚洲 欧美 精品| 日韩av影院在线观看| 亚洲日本香蕉视频| 亚洲欧美日韩中文在线制服| 你懂的在线免费观看| 5月丁香婷婷综合| 国产精品免费无遮挡| 91精品视频网| 精品人妻一区二区三区三区四区| 日韩一区二区麻豆国产| 一级做a爰片久久毛片| 日韩欧美国产黄色| 久久久久久av无码免费网站| 一区二区三区日本| 日本中文字幕免费观看| 黄色91在线观看| 九九热最新地址| 亚洲一区在线观看免费| 日韩三级免费看| 色偷偷久久一区二区三区| 久久精品国产亚洲av麻豆蜜芽| 欧美三级中文字| 国产女主播福利| 91成人在线免费观看| 欧美日韩偷拍视频| 艳妇臀荡乳欲伦亚洲一区| 国产成人精品a视频一区| 色国产精品一区在线观看| 一级黄色a视频| 精品国产乱码久久久久久1区2区 | 成人在线视频首页| 亚洲18在线看污www麻豆| 国产精选一区二区三区 | 中文字幕巨乱亚洲| 国内偷拍精品视频| 色综合中文字幕国产| 97人妻精品一区二区三区动漫| 精品粉嫩aⅴ一区二区三区四区| 美国成人毛片| 九九视频这里只有精品| 国产精品专区免费| 91丨九色丨国产在线| 欧美日韩精品一区二区三区视频| 97成人超碰免| 国产69精品久久| 国产亚洲福利社区| 欧美www视频在线观看| 日韩成人在线资源| 91精品一区二区三区综合| 日韩欧美亚洲天堂| 国内成人精品2018免费看| 久久人妻少妇嫩草av无码专区| 国产精品中文欧美| 无码国产69精品久久久久同性| 亚洲情趣在线观看| 四虎永久免费在线| 色婷婷综合久久久久中文| 国产成人三级一区二区在线观看一| 日韩激情片免费| 俄罗斯一级**毛片在线播放| 国产日韩一区在线| 九一精品国产| 欧美一级视频免费看| 亚洲美女黄色| 美女扒开大腿让男人桶| 日韩精品电影在线观看| 在线观看一区二区三区四区| 国产精品乱码妇女bbbb| 久久爱一区二区| 一本大道久久精品懂色aⅴ| 亚洲国产日韩在线观看| 亚洲国产精品字幕| 三级在线电影| 在线视频中文亚洲| 麻豆网站视频在线观看| 日本午夜在线亚洲.国产| 国产精品白丝av嫩草影院| 美日韩免费视频| 亚洲精选成人| 黑森林av导航| 亚洲最色的网站| 亚洲成a人片77777精品| 久久综合伊人77777| 日本a人精品| 亚洲高清在线观看一区| 日韩二区在线观看| 无码少妇一区二区| 色天天综合久久久久综合片| 欧美套图亚洲一区| 国产成+人+综合+亚洲欧洲 | 亚洲国产黄色片| a级大胆欧美人体大胆666| 成人区精品一区二区| 午夜欧美精品久久久久久久| 成人免费黄色av| 樱桃视频在线观看一区| 亚洲成人一级片| 欧美激情一级精品国产| 日韩影院在线| 成人一区二区电影| 美女一区二区在线观看| 亚洲人一区二区| 麻豆精品在线播放| 国产精品视频看看| 黑人狂躁日本妞一区二区三区 | 91精品国产一区二区三区香蕉| 性一交一乱一透一a级| 九九久久久久99精品| 国产厕拍一区| 成人在线免费观看av| 久久综合色天天久久综合图片| 国产精品精品软件男同| 91精品蜜臀在线一区尤物| av网址在线看| 国产精品白嫩美女在线观看| 狠狠色丁香婷婷综合影院| 污色网站在线观看| 91视频一区二区| 无码人妻丰满熟妇奶水区码| 一区二区亚洲精品国产| 91视频亚洲| 久久精品国产sm调教网站演员| 久久99精品久久只有精品| 曰本女人与公拘交酡| 精品国产污网站| 3d性欧美动漫精品xxxx软件| 一级做a爰片久久| 成人深夜视频在线观看| 免费又黄又爽又猛大片午夜| 日韩一区视频在线| 日韩和的一区二在线| 在线观看欧美激情| 日韩黄色免费网站| 日韩一区二区不卡视频| 亚洲成人久久久久| 99久久精品一区二区成人| 成年丰满熟妇午夜免费视频| 91丨九色丨蝌蚪富婆spa| 中文字幕自拍偷拍| 91chinesevideo永久地址| 久久一区二区三区电影| 污污污www精品国产网站| 欧美在线观看视频在线| 啦啦啦中文在线观看日本|