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

騰訊二面:如何保證MQ消息不丟失?重復消費如何保證冪等?

開發(fā) 前端
面試官在面試候選人時,如果發(fā)現候選人的簡歷中寫了在項目中使用了 MQ 技術(如 Kafka、RabbitMQ、RocketMQ),基本都會拋出一個問題:在使用 MQ 的時候,怎么確保消息 100% 不丟失?重復消費如何保證冪等?

面試官在面試候選人時,如果發(fā)現候選人的簡歷中寫了在項目中使用了 MQ 技術(如 Kafka、RabbitMQ、RocketMQ),基本都會拋出一個問題:在使用 MQ 的時候,怎么確保消息 100% 不丟失?重復消費如何保證冪等?

這兩個問題在實際工作中也很常見,既能考察你對 MQ 的掌握程度又能很好的判斷是否有對應的實戰(zhàn)經驗。

本文將深入剖析消息丟失的本質原因,揭示 MQ 核心實現原理,并提供一套完整的 Java 實戰(zhàn)解決方案。

消息傳遞的生命周期

如下圖所示,阿斗被邀請去休閑養(yǎng)生 SPA 享受,服務包含泡腳、按摩、吃水果、看電視,玩真人 CS。

圖片圖片

  • 生產者:休閑養(yǎng)生 SPA 系統(tǒng),發(fā)送一條消息到 MQ。
  • MQ 消息隊列:存儲消息。
  • 消息消費者:享受泡腳技師幫泡腳、按摩技師肩背按摩、推油技師推背,同時吃水果看電視(估計是不會看電視了)。

此間樂不思蜀也……

消息的生命周期如下圖所示。

圖片圖片

你可以發(fā)現,從生產者發(fā)送消息,MQ 保存消息,消費者消費消息,每一個環(huán)節(jié)都有可能丟失消息。

圖片圖片


各環(huán)節(jié)丟失概率統(tǒng)計

環(huán)節(jié)

故障概率

平均恢復時間

網絡傳輸

0.1%-1%

秒級

內存存儲

0.01%-0.1%

分鐘級

磁盤故障

0.001%-0.01%

小時級

程序異常

0.1%-5%

分鐘級

典型業(yè)務場景代價

  • 支付系統(tǒng):單條消息丟失 ≈ 平均訂單金額(如 1000 元)
  • 庫存系統(tǒng):1%消息丟失率 ≈10 倍超賣風險
  • 物流追蹤:消息丟失率>0.1%≈ 客戶投訴率提升 300%

消息生產者

當生產者往 MQ 中寫數據時,以下場景會導致消息丟失:

  1. 網絡閃斷:發(fā)送過程中網絡中斷
  2. ACK 丟失:MQ 成功處理但確認丟失
  3. 發(fā)送超時:網絡延遲導致超時誤判
  4. 程序崩潰:處理中進程意外退出

生產者發(fā)送消息,主流消息隊列都支持同步發(fā)送和異步發(fā)送。

如果使用同步發(fā)送,生產者發(fā)送消息后,會同步等待 Broker 返回的 ACK,收到 ACK 消息,就認為消息發(fā)送成功。如果長時間沒有收到,則會認為消息發(fā)送失敗,需要進行重試。

本地消息表 + 異步重試

消息發(fā)送的流程如下圖所示,基于本地消息表 + 業(yè)務數據表構成本地事務。

通過消息一步發(fā)送并接受消息隊列的 ACK 來更新消息表狀態(tài),若果未發(fā)送則繼續(xù)重試發(fā)送,保證消息一定發(fā)送出去。

圖片圖片

代碼案例如下所示:

@Service
publicclass ReliableProducer {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Transactional
    public void createOrder(Order order) {
        // 1. 業(yè)務數據入庫
        jdbcTemplate.update(
            "INSERT INTO orders(id, amount) VALUES(?, ?)",
            order.getId(), order.getAmount());

        // 2. 消息記錄入庫
        String msgId = UUID.randomUUID().toString();
        jdbcTemplate.update(
            "INSERT INTO message_log(msg_id, topic, message, status) VALUES(?, ?, ?, ?)",
            msgId, "orders", JsonUtil.toJson(order), 0); // 0-待發(fā)送

        // 事務提交后觸發(fā)異步發(fā)送
        CompletableFuture.runAsync(() -> sendWithRetry(msgId));
    }

    // 這里其實可以使用 xxl-job 等分布式調度框架查詢未發(fā)送成功的消息發(fā)送。
    private void sendWithRetry(String msgId) {
        MessageRecord msg = jdbcTemplate.queryForObject(
            "SELECT * FROM message_log WHERE msg_id = ?",
            new MessageRecordRowMapper(), msgId);

        int attempt = 0;
        while (attempt < MAX_RETRIES) {
            try {
                ListenableFuture<SendResult<String, String>> future =
                    kafkaTemplate.send(msg.getTopic(), msg.getMessage());

                future.addCallback(result -> {
                    // 更新發(fā)送狀態(tài)
                    jdbcTemplate.update("UPDATE message_log SET status = 1 WHERE msg_id = ?", msgId);
                }, ex -> {
                    scheduleRetry(msgId, attempt); // 失敗重試
                });

                return;
            } catch (Exception e) {
                scheduleRetry(msgId, attempt);
                attempt++;
            }
        }
    }

    private void scheduleRetry(String msgId, int attempt) {
        long delay = (long) Math.pow(2, attempt) * 1000; // 指數退避
        scheduler.schedule(() -> sendWithRetry(msgId), delay, TimeUnit.MILLISECONDS);
    }
}

ACK 機制原理對比

MQ 類型

ACK 機制

可靠性

性能影響

Kafka

acks=0

最低

Kafka

acks=1

中等

Kafka

acks=all

最高

RabbitMQ

無確認

RabbitMQ

生產者確認

中等

RocketMQ

同步刷盤

最高

MQ 服務端:消息 100%存儲原理

生產者發(fā)送消息成功,也不能保證消息絕對不丟失。因為即使消息發(fā)送到 Broker,如果在消費者拉取到消息之前,Broker 宕機了,消息還沒有落盤,也會導致消息丟失。

kafka 存儲架構剖析

圖片圖片

  1. Producer(生產者):發(fā)送消息的一方,負責發(fā)布消息到 Kafka 主題(Topic)。
  2. Consumer(消費者):接受消息的一方,訂閱主題并處理消息。Kafka 有 ConsumerGroup 的概念,每個 Consumer 只能消費所分配到的 Partition 的消息,每一個 Partition 只能被一個 ConsumerGroup 中的一個 Consumer 所消費,所以同一個 ConsumerGroup 中 Consumer 的數量如果超過了 Partiton 的數量,將會出現有些 Consumer 分配不到 partition 消費。
  3. Broker(代理):服務代理節(jié)點,Kafka 集群中的一臺服務器就是一個 broker,可以水平無限擴展,同一個 Topic 的消息可以分布在多個 broker 中
  4. Topic(主題)與 Partition(分區(qū)) :Kafka 中的消息以 Topic 為單位進行劃分,生產者將消息發(fā)送到特定的 Topic,而消費者負責訂閱 Topic 的消息并進行消費。圖中 TopicA 有三個 Partiton(TopicA-par0、TopicA-par1、TopicA-par2)
    為了提升整個集群的吞吐量,Topic 在物理上還可以細分多個 Partition,一個 Partition 在磁盤上對應一個文件夾。
  5. Replica(副本):副本,是 Kafka 保證數據高可用的方式,Kafka 同一 Partition 的數據可以在多 Broker 上存在多個副本,通常只有 leader 副本對外提供讀寫服務,當 leader 副本所在 broker 崩潰或發(fā)生網絡一場,Kafka 會在 Controller 的管理下會重新選擇新的 Leader 副本對外提供讀寫服務。
  6. ZooKeeper:管理 Kafka 集群的元數據和分布式協調。

同步刷盤

kafka 為了得到更高的性能和吞吐量,將數據異步批量的存儲在磁盤中。

消息的刷盤過程,為了提高性能,減少刷盤次數,kafka 采用了批量刷盤的做法。即,按照一定的消息量,和時間間隔進行刷盤。

這種機制也是由于 linux 操作系統(tǒng)決定的。

將數據存儲到 linux 操作系統(tǒng)種,會先存儲到頁緩存(Page cache)中,按照時間或者其他條件進行刷盤(從 page cache 到 file),或者通過 fsync 命令強制刷盤。

圖片圖片

數據在 page cache 中時,如果系統(tǒng)掛掉,數據會丟失。

kafka 可靠性黃金配置

如圖所示的 kafka 集群,一個 Broker 的 Topic 其中一個 partition 一共有三 副本(包含 Leader)。

圖片

試想一種情況:假如 leader 副本所在的 broker 突然掛掉,那么就要從 follower 副本重新選出一個 leader ,但是 leader 的數據還有一些沒有被 follower 副本的同步的話,就會造成消息丟失。

解決辦法就是我們設置 acks = all。acks 是 Kafka 生產者(Producer) 很重要的一個參數。

acks 的默認值即為 1,代表我們的消息被 leader 副本接收之后就算被成功發(fā)送。當我們配置 acks = all 代表則所有副本都要接收到該消息之后該消息才算真正成功被發(fā)送。

該場景的 Kafka Broker 黃金高可靠配置如下:

# Kafka配置示例
acks=all
min.insync.replicas=2 // 最小同步副本數
replication.factor=3  // 每個分區(qū)的 總副本數量(含 Leader)
unclean.leader.election.enable=false
log.flush.interval.messages=10000
log.flush.interval.ms=1000
  • acks=all:生產者要求所有 ISR(In-Sync Replicas)副本 都成功寫入消息后才返回確認。
  • min.insync.replicas:定義 最小同步副本數,必須至少有 2 個副本處于同步狀態(tài)(含 Leader)。
  • 當 replication.factor=3 且 min.insync.replicas=2 時:允許 1 個副本宕機(如 Broker 故障)、若 2 個副本不可用,則生產會被阻塞
  • replication.factor=3:每個分區(qū)的 總副本數量(含 Leader),為了保證整個 Kafka 服務的高可用性,你還需要確保 replication.factor > min.insync.replicas ,一般推薦設置成 replication.factor = min.insync.replicas + 1。
  • unclean.leader.election.enable=false:禁止 非同步副本(Out-of-Sync) 成為 Leader。若允許非同步副本成為 Leader,可能導致已提交數據被覆蓋,金融場景必須設為 false。
  • 我們最開始也說了我們發(fā)送的消息會被發(fā)送到 leader 副本,然后 follower 副本才能從 leader 副本中拉取消息進行同步。
  • 多個 follower 副本之間的消息同步情況不一樣,當我們配置了 unclean.leader.election.enable = false 的話,當 leader 副本發(fā)生故障時就不會從 follower 副本中和 leader 同步程度達不到要求的副本中選擇出 leader ,即只從 ISR 中選擇 leader,這樣降低了消息丟失的可能性。
  • log.flush.interval.messages=10000:每累積 10000 條消息 強制刷盤一次。
  • log.flush.interval.ms=1000:每 1000 毫秒(1 秒) 強制刷盤一次。

消費者保證 100% 處理原理

消息在被追加到 Partition(分區(qū))的時候都會分配一個特定的偏移(offset)。

偏移量(offset)表示 Consumer 當前消費到的 Partition(分區(qū))的所在的位置。Kafka 通過偏移量(offset)可以保證消息在分區(qū)內的順序性。

當消費者拉取到了分區(qū)的某個消息之后,消費者會自動提交了 offset。

自動提交的話會有一個問題,試想一下,當消費者剛拿到這個消息準備進行真正消費的時候,突然掛掉了,消息實際上并沒有被消費,但是 offset 卻被自動提交了。

解決辦法也比較粗暴,我們手動關閉自動提交 offset,每次在真正消費完消息之后之后再自己手動提交 offset 。

這樣會帶來消息被重新消費的問題。比如你剛剛消費完消息之后,還沒提交 offset,結果自己掛掉了,那么這個消息理論上就會被消費兩次。

開啟手動提交的時候消費端需要去保證冪等性。

圖片圖片

冪等消費 + 死信隊列

@Slf4j
@Component
publicclass ReliableConsumer {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private OrderService orderService;

    @KafkaListener(topics = "orders")
    public void consume(ConsumerRecord<String, String> record) {
        String msgId = record.key();
        Order order = JsonUtil.fromJson(record.value(), Order.class);

        // 1. 冪等檢查
        if (isProcessed(msgId)) {
            log.info("消息重復消費,已跳過: {}", msgId);
            return;
        }

        // 2. 獲取分布式鎖
        Lock lock = redisLockFactory.getLock("LOCK:" + msgId);
        if (!lock.tryLock(3, TimeUnit.SECONDS)) {
            thrownew ConcurrentAccessException("獲取鎖失敗");
        }

        try {
            // 3. 二次冪等檢查(防并發(fā))
            if (isProcessed(msgId)) {
                return;
            }

            // 4. 業(yè)務處理
            orderService.processOrder(order);

            // 5. 記錄處理狀態(tài)(設置24小時過期)
            markProcessed(msgId);
        } catch (BusinessException e) {
            // 6. 業(yè)務異常處理
            handleFailure(record, e);
        } finally {
            lock.unlock();
        }
    }

    private boolean isProcessed(String msgId) {
        return"PROCESSED".equals(
            redisTemplate.opsForValue().get("MSG:" + msgId));
    }

    private void markProcessed(String msgId) {
        redisTemplate.opsForValue().set(
            "MSG:" + msgId, "PROCESSED", 24, TimeUnit.HOURS);
    }

    private void handleFailure(ConsumerRecord<?, ?> record, Exception e) {
        // 失敗計數
        int failCount = incrementFailCounter(record.key());

        if (failCount < 3) {
            thrownew RetryableException(e); // 觸發(fā)重試
        } else {
            sendToDlq(record); // 轉移死信隊列
        }
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
            new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());

        // 配置批量ACK(性能與可靠性的平衡)
        factory.getContainerProperties().setAckMode(
            AckMode.BATCH);

        // 消費并發(fā)控制
        factory.setConcurrency(3);

        return factory;
    }
}

端到端保障:構建全鏈路防御體系

除了對生產者、MQ 中間件、消費端保證不丟失消息的處理手段,還可以對消息軌跡進行監(jiān)控。

圖片

自動化對賬系統(tǒng)實現代碼案例。

@Service
@Slf4j
publicclass ReconciliationService {

    @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2點執(zhí)行
    public void dailyReconciliation() {
        // 1. 生產端計數
        long produced = countProducerMessages();

        // 2. MQ端計數
        long stored = countMQMessages();

        // 3. 消費端計數
        long consumed = countConsumerMessages();

        // 4. 數據對比
        if (produced != stored) {
            handleLoss(produced - stored, "生產到MQ丟失");
        }

        if (stored != consumed) {
            handleLoss(stored - consumed, "MQ到消費丟失");
        }

        log.info("對賬完成: 生產={}, MQ存儲={}, 消費={}",
            produced, stored, consumed);
    }

    private void handleLoss(long lossCount, String stage) {
        log.error("消息丟失告警: 階段={}, 數量={}", stage, lossCount);
        // 1. 通知運維團隊
        alertService.notifyStaff(stage, lossCount);

        // 2. 自動恢復機制
        if (lossCount < 1000) {
            recoveryService.recoverFromBackup();
        } else {
            // 重大事故,啟動緊急預案
            emergencyService.handleDisaster();
        }
    }
}

總結

消息零丟失的三位一體架構本質上是對不確定性的系統(tǒng)化防御

  1. 生產者防御:建立冗余記錄(消息表)對抗網絡不確定性
  2. 存儲層防御:通過副本機制抵御物理故障
  3. 消費者防御:依靠冪等性消除重試副作用
  4. 監(jiān)控層防御:用全局視角捕捉異常情況

在 Java 生態(tài)中,我們擁有強大的工具集實現這套防御:

  • Spring 事務管理:確保本地事務一致性
  • Kafka/RabbitMQ 客戶端:提供精細化的 ACK 控制
  • Redis 分布式鎖:實現高并發(fā)下的冪等控制
責任編輯:武曉燕 來源: 碼哥跳動
相關推薦

2025-11-11 09:05:09

2020-10-18 07:25:55

MQ消息冪等架構

2024-07-10 12:23:10

2021-03-08 10:19:59

MQ消息磁盤

2023-11-27 13:18:00

Redis數據不丟失

2024-06-18 08:26:22

2024-08-06 09:55:25

2024-01-16 08:24:59

消息隊列KafkaRocketMQ

2021-10-22 08:37:13

消息不丟失rocketmq消息隊列

2024-11-11 07:05:00

Redis哨兵模式主從復制

2024-02-26 08:10:00

Redis數據數據庫

2021-04-14 17:18:27

冪等性數據源MySQL

2017-04-03 21:23:44

消息總線冪等性消息

2024-12-18 07:43:49

2023-09-01 15:27:31

2023-06-01 08:54:08

RabbitMQ確認機制生產端

2021-09-13 07:23:53

KafkaGo語言

2023-11-27 17:29:43

Kafka全局順序性

2025-02-26 08:20:18

2020-07-15 08:14:12

高并發(fā)
點贊
收藏

51CTO技術棧公眾號

少妇久久久久久| 欧美视频一二三区| 久久久久久久久一区二区| 国产在线观看黄色| 日韩理论片av| 亚洲精品一区二区精华| 免费裸体美女网站| 菠萝菠萝蜜在线视频免费观看| 国产激情精品久久久第一区二区 | 日韩一区二区电影| 大j8黑人w巨大888a片| av片在线看| 成人精品免费看| 国产精品夜色7777狼人| 国产精品7777| 国产精品videosex性欧美| 亚洲国产又黄又爽女人高潮的| www.99av.com| 黄色漫画在线免费看| 国产精品久久久久久久久动漫| 国产精品入口免费| 一区二区三区精彩视频| 国产精品久久久久久模特| 久久激情五月丁香伊人| 蜜桃无码一区二区三区| 视频在线一区| 欧美理论片在线| 日本精品久久久久中文字幕| 毛片在线网址| 国产精品乱子久久久久| 蜜桃av噜噜一区二区三区| 性欧美8khd高清极品| 日韩高清一区在线| 97成人在线视频| 欧美精品久久久久性色| 天天做天天爱综合| 国产亚洲欧美日韩美女| 好吊日免费视频| 福利片在线一区二区| 欧美一区二区视频在线观看2020| 少妇激情一区二区三区| 欧美大片1688| 欧美日韩国产在线| 免费超爽大片黄| 日本乱理伦在线| 伊人性伊人情综合网| 在线丝袜欧美日韩制服| 超碰免费在线| 中文字幕乱码一区二区免费| 欧美精品在线一区| 黄色电影免费在线看| 久久青草国产手机看片福利盒子| 国产精品日韩一区二区三区| 可以免费观看的毛片| 国产成人精品亚洲777人妖| 91九色视频在线| 国产精品久久免费| 国内精品免费在线观看| 91中文在线观看| 国产三级精品在线观看| 国产麻豆精品在线观看| 91久久久在线| av中文字幕播放| 国产成人免费视| 国产一区二区三区高清视频| 亚洲日本在线播放| 久久久国产精品午夜一区ai换脸| 日本免费高清一区| avtt亚洲| 亚洲美女在线国产| 屁屁影院ccyy国产第一页| а√在线中文网新版地址在线| 亚洲成人精品影院| 夫妻免费无码v看片| 久久91导航| 欧美日韩免费一区二区三区| 热久久久久久久久| 999久久久精品一区二区| 日韩免费视频一区二区| 性色av蜜臀av色欲av| 国产精品午夜一区二区三区| 日韩亚洲欧美成人| 国产精品99精品无码视| 久久国产精品久久w女人spa| 国产精品一区二区3区| 精品国产av鲁一鲁一区| 99re在线精品| 中文字幕色一区二区| 污视频在线免费观看网站| 亚洲va天堂va国产va久| 欧美黑人又粗又大又爽免费| 992tv国产精品成人影院| 欧美一区二区三区婷婷月色 | 99这里只有精品视频| 国产婷婷成人久久av免费高清| 免费看污片的网站| 欧美久久久久| 国产精品福利无圣光在线一区| 国产国语亲子伦亲子| 91女人视频在线观看| 91香蕉视频网址| 黑森林国产精品av| 日韩一区二区三| 亚洲成人网在线播放| 亚洲一级毛片| 日韩美女视频中文字幕| 成人久久精品人妻一区二区三区| 久久久久亚洲综合| 成人午夜视频免费观看| 草民电影神马电影一区二区| 亚洲成人三级在线| 国产福利视频网站| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲字幕一区二区| aaa在线免费观看| 精品国产福利视频| 欧美性猛交xx| 日韩成人三级| 51色欧美片视频在线观看| 国产女无套免费视频| 久久久99免费| 黄色一级片播放| 亚洲成人黄色| 久久国产天堂福利天堂| 国产情侣呻吟对白高潮| 久久综合色一综合色88| 人体内射精一区二区三区| 亚洲精品乱码日韩| 国产亚洲人成a一在线v站| 日韩av免费网址| 国产乱妇无码大片在线观看| 一区二区精品视频| 欧美与亚洲与日本直播| 亚洲美女性生活视频| 精品成人免费视频| 成人免费视频视频| 青青青在线观看视频| 国产麻豆一区二区三区| www.欧美三级电影.com| 少妇又紧又色又爽又刺激视频 | 久久99久久99精品蜜柚传媒| 日本电影在线观看| 日韩小视频在线观看专区| 无码人妻精品中文字幕| 九九**精品视频免费播放| 日韩中文不卡| av亚洲一区| 色妞久久福利网| 在线免费观看日韩视频| 国产精品久久久99| 天天影视色综合| 99久久.com| 91久久精品久久国产性色也91| 欧美尤物美女在线| 在线成人小视频| 91在线播放观看| 国产成人免费在线视频| 日本欧美视频在线观看| 超碰97久久| 18一19gay欧美视频网站| 亚洲色图欧美视频| 色噜噜久久综合| 一级在线观看视频| 国产一区二区视频在线播放| 国产黄色激情视频| 欧美色图婷婷| 国产精品aaa| 五月婷婷在线观看| 日韩一区二区三区免费观看| 日本五十路女优| 久久久久久一级片| 91福利免费观看| 国产一区清纯| 欧美18视频| 91p九色成人| 欧美xxxx做受欧美.88| 色婷婷视频在线| 在线免费不卡电影| 国内偷拍精品视频| 91尤物视频在线观看| 日韩一级理论片| 欧美激情第8页| 久久精品国产美女| 久久日本片精品aaaaa国产| 另类视频在线观看| 香蕉人妻av久久久久天天| 欧美日韩一区二区三区四区五区 | 中文字幕一区二区三区人妻在线视频 | 精品国免费一区二区三区| 偷偷操不一样的久久| 国产精品免费视频网站| 欧美久久久久久久久久久| 日本特黄久久久高潮| 成人区一区二区| 狠狠综合久久av一区二区蜜桃| 91在线观看免费| 国产高清不卡| 欧美国产亚洲视频| 1024视频在线| 日韩成人av网址| 99热这里只有精品9| 欧美性猛交xxxx乱大交极品| 超碰手机在线观看| 国产日韩av一区二区| 曰本三级日本三级日本三级| 久久三级视频| 男人天堂a在线| 97视频热人人精品免费| 蜜桃久久影院| 成人av影音| 成人亚洲激情网| 日本综合视频| 日本午夜精品理论片a级appf发布| 伊人福利在线| www.欧美免费| porn视频在线观看| 亚洲免费av网址| 欧洲成人一区二区三区| 日韩欧美二区三区| 中文字幕av资源| 色婷婷久久久亚洲一区二区三区 | 色婷婷综合五月| 日韩欧美亚洲一区二区三区| 亚洲免费在线观看| 亚洲a v网站| 95精品视频在线| 亚洲麻豆一区二区三区| 国产乱一区二区| 中文国产在线观看| 久久 天天综合| 天天干天天爽天天射| 久久久夜夜夜| 无码人妻丰满熟妇区毛片18| 一道本一区二区| 免费看欧美黑人毛片| 午夜精品视频| 国产又粗又长又爽视频| 亚洲一级淫片| 国产亚洲精品久久久久久久| 中文不卡在线| 日韩中文字幕亚洲精品欧美| 欧美一区在线看| 国产成人一二三区| 欧美成人午夜| 人妻无码一区二区三区四区| 亚洲精品国产成人影院| 国产人妻互换一区二区| 欧美.www| 黄色三级中文字幕| 黄色亚洲免费| 国产婷婷一区二区三区| 国产亚洲一区在线| 欧美性久久久久| 久久国产精品亚洲77777| 久久久精品在线视频| 欧美交换配乱吟粗大25p| 欧美一区成人| www..com日韩| 六月丁香综合| 亚洲77777| 国产一区二区三区高清播放| 少妇性l交大片7724com| 成人v精品蜜桃久久一区| 亚洲熟女一区二区| 久久久久久久久伊人| 成人性视频免费看| 亚洲欧美aⅴ...| 日韩三级免费看| 一本到高清视频免费精品| 久久国产香蕉视频| 欧美精品电影在线播放| 精品人妻无码一区二区色欲产成人 | 国产欧美在线一区| 蜜桃久久久久久久| 男插女视频网站| 99精品欧美一区二区三区小说| 国产精品无码午夜福利| 国产精品久久影院| 久一区二区三区| 色琪琪一区二区三区亚洲区| 亚洲在线精品视频| 亚洲成年人影院在线| 黄色的视频在线免费观看| 久久av在线播放| 日韩电影免费看| 国产一区二区丝袜高跟鞋图片| 2020最新国产精品| 欧洲精品久久| 欧美日韩视频| 992kp快乐看片永久免费网址| 国产在线精品一区二区不卡了| www.日本高清| 日韩毛片精品高清免费| 国产a∨精品一区二区三区仙踪林| 欧美在线观看18| 国产综合在线播放| 中文字幕亚洲欧美日韩高清| 男插女视频久久久| 国产精品欧美日韩| 果冻天美麻豆一区二区国产| 亚洲高清资源综合久久精品| 在线播放一区| 17c国产在线| 91伊人久久大香线蕉| 欧美人妻精品一区二区三区 | 粉嫩av一区二区| 亚洲看片网站| 欧美专区在线| 国产精品嫩草69影院| 国产精品入口麻豆原神| 久热这里只有精品6| 日韩欧美电影在线| 黄色小网站在线观看| 国产高清视频一区三区| 加勒比视频一区| 亚洲一区二区三区免费看| 老鸭窝毛片一区二区三区 | 亚洲 日本 欧美 中文幕| 日韩欧美久久一区| 天堂аⅴ在线地址8| 日韩**中文字幕毛片| www.神马久久| 亚洲五码在线观看视频| 久久精品99久久久| 精品欧美一区二区久久久| 精品久久久香蕉免费精品视频| 国内老熟妇对白hdxxxx| www国产精品视频| ww久久综合久中文字幕| 欧美午夜精品久久久久久蜜| 亚洲综合日韩| 精品人妻一区二区免费视频| 亚洲v中文字幕| 人妻偷人精品一区二区三区| 乱亲女秽乱长久久久| 日韩伦理一区二区| 亚洲一区二区在线免费观看| 日韩精品亚洲一区二区三区免费| 久久精品成人av| 欧美日韩午夜激情| 四虎影视精品成人| 欧美国产精品va在线观看| 欧美区一区二区| 日本天堂免费a| 成人精品国产免费网站| 久久精品亚洲无码| 亚洲第一中文字幕| 17videosex性欧美| 狠狠干一区二区| 国产精品免费看| 日本丰满少妇裸体自慰| 日韩欧美一区二区三区| 你懂的在线免费观看| 国产成人激情小视频| 欧美先锋资源| 午夜一区二区视频| 一区二区三区视频在线观看| 亚洲欧美强伦一区二区| 国内免费精品永久在线视频| 丝袜美腿一区二区三区动态图| 亚洲欧洲日产国码无码久久99| 久久亚洲精品国产精品紫薇| 人人妻人人爽人人澡人人精品| 国产亚洲一区二区精品| 欧美少妇激情| www.日本三级| 久久亚洲精华国产精华液| 日韩不卡高清视频| 久久视频免费在线播放| 超碰在线亚洲| 日韩av在线综合| 国产精品另类一区| 性欧美8khd高清极品| 欧洲美女7788成人免费视频| 成人中文视频| 国内自拍偷拍视频| 日本道在线观看一区二区| 毛片av在线| 国产一区二区黄色| 美女一区二区三区在线观看| 久久国产波多野结衣| 亚洲精品久久久久中文字幕欢迎你| 欧美性猛交xxx高清大费中文| 一区二区三区在线视频看| 成人黄色在线网站| 中文字幕在线2018| 欧美激情videos| 全球成人免费直播| 91精品人妻一区二区三区四区| 色综合视频一区二区三区高清| 麻豆tv免费在线观看| 久久精品日韩精品| 韩国女主播成人在线观看| 欧美三级一区二区三区| 久久精品电影一区二区| 亚洲成人一品| 亚洲视频在线不卡| 欧美自拍偷拍一区| 77thz桃花论族在线观看| 在线视频91|