精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线免费观看麻豆| 可以在线看的av网站| 精品国产亚洲av麻豆| 影音先锋亚洲精品| 伊人亚洲福利一区二区三区| 99中文字幕在线| 波多野结衣久久| 国产日韩欧美一区二区三区乱码| 亚洲一区二区三区视频| 五月婷婷中文字幕| 欧美一区二区三区久久精品| 亚洲欧美日韩天堂一区二区| 免费黄频在线观看| 日韩毛片免费观看| 樱花草国产18久久久久| 五月天色一区| 日本一区二区三区在线观看视频| 国模一区二区| 一区二区三区在线视频免费观看| 欧美成人蜜桃| 免费观看黄一级视频| 美国一区二区三区在线播放 | 亚洲精品美女久久 | 成人午夜精品一区二区三区| 国产精品视频久| 日本在线免费观看| 午夜精品久久99蜜桃的功能介绍| 国产小视频91| 丰满少妇一区二区| 精品少妇3p| 日韩免费电影一区| 欧美成人手机在线视频| 国产成人免费精品| 欧美伊人精品成人久久综合97| 久久国产精品视频在线观看| 欧美videos另类精品| 日韩美女视频一区| 亚洲一区精品视频| freemovies性欧美| 日本一区二区在线不卡| 97精品久久久中文字幕免费| 伊人在线视频观看| 久久视频国产| 最近2019中文字幕mv免费看| 东方伊人免费在线观看| 国产剧情一区| 亚洲欧美日韩精品久久亚洲区| 免费a v网站| 好吊妞国产欧美日韩免费观看网站| 日韩限制级电影在线观看| 91网址在线观看精品| 亚洲免费看片| 欧美一三区三区四区免费在线看| 亚洲三级在线观看视频| japansex久久高清精品| 91麻豆精品91久久久久同性| 一级淫片在线观看| 日韩国产在线不卡视频| 日韩女优av电影在线观看| 性xxxxxxxxx| 激情小说一区| 亚洲精品综合精品自拍| 国产美女永久免费无遮挡| jlzzjlzz亚洲女人| 久久九九精品99国产精品| 国产精品白丝喷水在线观看| 欧美日韩国产综合网| 欧美激情一级二级| 日韩欧美性视频| 老牛嫩草一区二区三区日本 | 国产三级欧美三级日产三级99| 欧美一区二区影视| 老司机免费在线视频| 一区二区三区高清在线| 777久久久精品一区二区三区| www.com.cn成人| 欧美日韩精品系列| 中文字幕无码毛片免费看| 免费看久久久| 在线观看视频亚洲| 日本老熟俱乐部h0930| 亚洲毛片在线| 国产精品丝袜白浆摸在线| 99久久精品国产一区色| www.在线欧美| 日韩精品电影网站| 日本在线观看高清完整版| 欧美性videos高清精品| 性生活免费在线观看| 一区三区自拍| 亚洲图中文字幕| 极品盗摄国产盗摄合集| 性欧美长视频| 国产日韩中文字幕在线| 日韩中文字幕影院| 国产精品视频在线看| 国产美女永久无遮挡| videos性欧美另类高清| 日韩视频一区二区| 免费一级黄色录像| 99亚洲一区二区| 91精品美女在线| 日韩在线无毛| 亚洲激情第一区| 欧美性猛交xxx乱久交| 91麻豆精品激情在线观看最新| 亚洲视频999| 国产午夜福利精品| 精品亚洲国产成人av制服丝袜| 精品无码久久久久国产| a在线免费观看| 欧美中文一区二区三区| 妖精视频一区二区| 午夜精品视频一区二区三区在线看| 97久久久久久| 成人午夜精品福利免费| 成人欧美一区二区三区视频网页 | 范冰冰一级做a爰片久久毛片| 欧美一区国产二区| 呻吟揉丰满对白91乃国产区| 久久国产88| 国产麻豆一区二区三区在线观看| 精品麻豆一区二区三区| 欧美自拍丝袜亚洲| 久久久无码人妻精品一区| 欧美婷婷在线| 亚洲一区二区中文| 久cao在线| 欧美日韩国产免费一区二区| 中文字幕 自拍| 性色一区二区| 欧美精品亚洲| 欧美大片高清| 亚洲社区在线观看| 69亚洲精品久久久蜜桃小说| 99视频精品全部免费在线| 九九热只有这里有精品| av日韩在线播放| 欧美精品一区二区免费| 国产免费一区二区三区免费视频| 国产精品久久久久影院亚瑟| 亚州精品一二三区| 成人中文在线| 国产美女精品视频免费观看| av亚洲在线| 欧美视频日韩视频| 国产馆在线观看| 久久国产夜色精品鲁鲁99| 午夜精品美女久久久久av福利| 性感美女一区二区在线观看| 国产一区二区三区在线视频| 日韩av免费播放| 中文天堂在线一区| 亚洲 国产 图片| 1024精品久久久久久久久| 成人免费午夜电影| a级片国产精品自在拍在线播放| 日韩网站在线看片你懂的| 久久久久久久黄色| av在线不卡电影| 久久网站免费视频| 国产精品欧美在线观看| 成人免费视频网站| 亚洲人成在线播放网站岛国| 色噜噜狠狠一区二区| 99久久亚洲精品| 91久久久久久| 污视频在线免费观看网站| 日韩一级黄色大片| 国产污视频在线观看| 99精品在线观看视频| av免费播放网址| 成人影视亚洲图片在线| 成人午夜在线观看| 欧美xxxx黑人又粗又长| 亚洲女人天堂视频| 亚洲最大成人av| 亚洲午夜电影网| 无码人妻精品一区二区中文| 日韩vs国产vs欧美| 伊人网在线免费| 亚洲电影男人天堂| 91久久久久久久久久久| 成人免费一区二区三区牛牛| 亚洲欧洲日韩国产| 国产普通话bbwbbwbbw| 欧美日韩国产页| 黄色片网站在线播放| 成人国产在线观看| 中文字幕第80页| 精品成人国产| 亚洲欧洲国产精品久久| 免费福利视频一区| 成人免费视频在线观看超级碰| 日韩欧美精品一区二区三区| 俺也去精品视频在线观看| 日韩一级免费毛片| 欧美精品日韩综合在线| 久久久国产高清| 亚洲视频一二三| 国产毛片毛片毛片毛片毛片毛片| 久久爱www久久做| 精品无码一区二区三区在线| 久久人人99| 欧美日本国产精品| gogo人体一区| 成人久久久久久| 国产 日韩 欧美一区| 91国内在线视频| 国产激情视频在线观看| 国产亚洲免费的视频看| 天堂在线视频观看| 欧美一区二区三区小说| 做爰视频毛片视频| 图片区日韩欧美亚洲| 97在线观看免费高| 国产视频视频一区| 免费成人深夜夜行p站| 国产黑丝在线一区二区三区| 国产一二三区av| 亚洲视频1区| 日本欧美视频在线观看| 亚洲色图国产| 一本一本久久a久久精品综合妖精| 亚洲成a人片77777在线播放| 国产免费一区二区三区| 亚洲高清在线一区| 91免费电影网站| 欧美成人免费全部网站| 国产精品都在这里| 久久毛片亚洲| 日本亚洲精品在线观看| 日产福利视频在线观看| 性欧美激情精品| av午夜在线观看| 欧美精品久久久久久久久| 黄色片免费在线观看| 日韩视频免费在线| 日p在线观看| www.日韩.com| 国产激情在线| 欧美乱人伦中文字幕在线| 中文字幕在线播放网址| 久久国产精品久久久久| 成人免费在线| 色综合色综合网色综合| 色婷婷av在线| 久久久中精品2020中文| 高潮在线视频| 日本在线观看天堂男亚洲| 欧美电影免费看| 国产精品久久久久av| av免费在线一区| 国产精品狼人色视频一区| 日韩精品一级毛片在线播放| 成人黄色大片在线免费观看| 国产不卡精品在线| 国产高清精品一区二区| 美国成人xxx| 日韩视频在线播放| 久久精品国产大片免费观看| 国产精品无码乱伦| 欧美黄色一级视频| 久久亚洲中文字幕无码| 日韩专区一卡二卡| 精品综合久久久久| 国产成人午夜99999| 亚洲av无码一区二区三区观看| 久久日一线二线三线suv| 国产探花视频在线| 亚洲精品乱码久久久久久黑人| 久久精品这里有| 色综合天天综合狠狠| 在线视频免费观看一区| 日韩精品一区二区三区老鸭窝| 亚洲av成人精品一区二区三区在线播放| 亚洲精品少妇网址| 视频免费一区| 韩剧1988免费观看全集| 婷婷激情一区| 亚洲综合在线小说| 亚洲免费专区| 在线播放 亚洲| 中文一区二区| 日韩在线一区视频| 99久久精品免费看国产免费软件| 三区四区在线观看| 亚洲一区二区三区三| 欧美性猛交xxxx乱大交hd| 日韩视频一区二区| 国产三级视频在线| 欧美高清激情视频| julia一区二区三区中文字幕| 动漫美女被爆操久久久| 国内成人自拍| 亚洲色成人www永久在线观看| 日本成人在线电影网| 无码人妻一区二区三区免费n鬼沢| 国产日产欧美一区二区视频| 加勒比av在线播放| 欧美性三三影院| 深爱激情五月婷婷| 伦伦影院午夜日韩欧美限制| 手机在线理论片| 99在线观看| 日韩在线精品| 男人天堂网视频| 国产精品亚洲成人| 久久久久99精品成人| 欧美日韩美女视频| 亚洲毛片在线播放| www.亚洲男人天堂| 亚洲精品国产嫩草在线观看| 好吊色欧美一区二区三区视频| 91精品综合久久久久久久久久久 | 免费看的黄色录像| 天天综合网 天天综合色| 99久久久国产精品无码网爆 | 国产女人水真多18毛片18精品 | 国产乱码精品一区二区三区精东| 亚洲少妇激情视频| 亚洲精品**中文毛片| 国产chinese精品一区二区| 99久久精品网| 国产三级国产精品国产专区50| 久久综合狠狠综合久久激情| 国产精品成人aaaa在线| 日韩女优毛片在线| 最新超碰在线| 亚洲a在线观看| 91免费精品| 性生活免费在线观看| 国产精品污污网站在线观看| 久久精品视频2| 亚洲一区二区黄| 国产成人精品123区免费视频| 欧美国产视频在线观看| 国产精品尤物| 四虎影成人精品a片| 色婷婷精品久久二区二区蜜臀av| 亚洲欧美日本在线观看| 欧美综合在线第二页| 亚洲另类av| aa免费在线观看| 国产午夜亚洲精品不卡| 91麻豆精品在线| 中文字幕不卡在线视频极品| 国产精品亚洲d| 在线观看欧美一区| 国内精品写真在线观看| 中国一级片在线观看| 日韩一区国产二区欧美三区| 亚洲wwwww| 狠狠色狠狠色综合人人| 宅男噜噜噜66国产日韩在线观看| 久久久精品人妻无码专区| 欧美三日本三级三级在线播放| 国产香蕉视频在线看| 91精品久久久久久久久久久久久| 99精品美女| 无码人妻一区二区三区在线| 精品久久久久久中文字幕大豆网| 日本不卡视频一区二区| 国产精品美女www爽爽爽视频| 91免费精品| 扒开伸进免费视频| 欧美色视频日本版| h视频在线免费| 91国产丝袜在线放| 亚洲区第一页| 国产日韩精品中文字无码| 欧美一区二区在线免费播放 | 中文字幕亚洲精品乱码| 最新日本中文字幕| 色婷婷av久久久久久久| 麻豆传媒视频在线观看免费| 99国产在线观看| 美女精品在线| 黑人操日本美女| 亚洲精品在线网站| 精品美女一区| 黄色激情在线视频| 国产日韩欧美a| 亚洲经典一区二区三区| 国产精品成人v| 欧美黄免费看| 少妇久久久久久久久久| 欧美一区二区三区免费观看视频 | 免费成人深夜夜行p站| 欧美精品日日鲁夜夜添| 中文字幕人成乱码在线观看| 久久久国产精华液999999| aaa亚洲精品一二三区| 亚洲一区二区影视| 91精品国产免费久久久久久 | 九色自拍视频在线观看| 国产精品欧美一区喷水| 天天综合天天色| 成人一区二区电影| 久久久精品性|