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

深入理解 RocketMQ 廣播消費

開發 前端
同一 Topic 下的一條消息只會被同一消費組中的一個消費者消費。也就是說,消息被負載均衡到了同一個消費組的多個消費者實例上。

這篇文章我們聊聊廣播消費,因為廣播消費在某些場景下真的有奇效。筆者會從基礎概念、實現機制、實戰案例三個方面一一展開,希望能幫助到大家。

1 基礎概念

RocketMQ 支持兩種消息模式:集群消費( Clustering )和廣播消費( Broadcasting )。

集群消費:

同一 Topic 下的一條消息只會被同一消費組中的一個消費者消費。也就是說,消息被負載均衡到了同一個消費組的多個消費者實例上。

圖片圖片

廣播消費:

當使用廣播消費模式時,每條消息推送給集群內所有的消費者,保證消息至少被每個消費者消費一次。

圖片圖片

2 源碼解析

首先下圖展示了廣播消費的代碼示例。

public class PushConsumer {
    public static final String CONSUMER_GROUP = "myconsumerGroup";
    public static final String DEFAULT_NAMESRVADDR = "localhost:9876";
    public static final String TOPIC = "mytest";
    public static final String SUB_EXPRESSION = "TagA || TagC || TagD";

    public static void main(String[] args) throws InterruptedException, MQClientException {
        // 定義 DefaultPushConsumer 
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        // 定義名字服務地址
        consumer.setNamesrvAddr(DEFAULT_NAMESRVADDR);
        // 定義消費讀取位點
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
        // 定義消費模式
        consumer.setMessageModel(MessageModel.BROADCASTING);
        // 訂閱主題信息
        consumer.subscribe(TOPIC, SUB_EXPRESSION);
        // 訂閱消息監聽器
        consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
            try {
                for (MessageExt messageExt : msgs) {
                    System.out.println(new String(messageExt.getBody()));
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        consumer.start();
        System.out.printf("Broadcast Consumer Started.%n");
    }
}

和集群消費不同的點在于下面的代碼:

consumer.setMessageModel(MessageModel.BROADCASTING);

接下來,我們從源碼角度來看看廣播消費和集群消費有哪些差異點 ?

首先進入 DefaultMQPushConsumerImpl 類的 start 方法 , 分析啟動流程中他們兩者的差異點:

圖片圖片

▍ 差異點1:拷貝訂閱關系

private void copySubscription() throws MQClientException {
    try {
       Map<String, String> sub = this.defaultMQPushConsumer.getSubscription();
       if (sub != null) {
          for (final Map.Entry<String, String> entry : sub.entrySet()) {
              final String topic = entry.getKey();
              final String subString = entry.getValue();
              SubscriptionData subscriptionData = FilterAPI.buildSubscriptionData(topic, subString);
                this.rebalanceImpl.getSubscriptionInner().put(topic, subscriptionData);
            }
        }
       if (null == this.messageListenerInner) {
          this.messageListenerInner = this.defaultMQPushConsumer.getMessageListener();
       }
       // 注意下面的代碼 , 集群模式下自動訂閱重試主題 
       switch (this.defaultMQPushConsumer.getMessageModel()) {
           case BROADCASTING:
               break;
           case CLUSTERING:
                final String retryTopic = MixAll.getRetryTopic(this.defaultMQPushConsumer.getConsumerGroup());
                SubscriptionData subscriptionData = FilterAPI.buildSubscriptionData(retryTopic, SubscriptionData.SUB_ALL);
                this.rebalanceImpl.getSubscriptionInner().put(retryTopic, subscriptionData);
                break;
            default:
                break;
        }
    } catch (Exception e) {
        throw new MQClientException("subscription exception", e);
    }
}

在集群模式下,會自動訂閱重試隊列,而廣播模式下,并沒有這段代碼。也就是說廣播模式下,不支持消息重試。

▍ 差異點2:本地進度存儲

switch (this.defaultMQPushConsumer.getMessageModel()) {
    case BROADCASTING:
        this.offsetStore = new LocalFileOffsetStore(this.mQClientFactory, this.defaultMQPushConsumer.getConsumerGroup());
        break;
    case CLUSTERING:
        this.offsetStore = new RemoteBrokerOffsetStore(this.mQClientFactory, this.defaultMQPushConsumer.getConsumerGroup());
        break;
    default:
        break;
}
this.defaultMQPushConsumer.setOffsetStore(this.offsetStore);

我們可以看到消費進度存儲的對象是:LocalFileOffsetStore , 進度文件存儲在如下的主目錄 /{用戶主目錄}/.rocketmq_offsets。

public final static String LOCAL_OFFSET_STORE_DIR = System.getProperty(
    "rocketmq.client.localOffsetStoreDir",
    System.getProperty("user.home") + File.separator + ".rocketmq_offsets");

進度文件是 /mqClientId/{consumerGroupName}/offsets.json 。

this.storePath = LOCAL_OFFSET_STORE_DIR + File.separator + this.mQClientFactory.getClientId() + File.separator + this.groupName + File.separator + "offsets.json";

筆者創建了一個主題 mytest , 包含4個隊列,進度文件內容如下:

圖片圖片

消費者啟動后,我們可以將整個流程簡化如下圖,并繼續整理差異點:

圖片圖片

▍ 差異點3:負載均衡消費該主題的所有 MessageQueue

進入負載均衡抽象類 RebalanceImpl 的rebalanceByTopic方法 。

private void rebalanceByTopic(final String topic, final boolean isOrder) {
    switch (messageModel) {
        case BROADCASTING: {
            Set<MessageQueue> mqSet = this.topicSubscribeInfoTable.get(topic);
            if (mqSet != null) {
                boolean changed = this.updateProcessQueueTableInRebalance(topic, mqSet, isOrder);
                // 省略代碼
            } else {
                log.warn("doRebalance, {}, but the topic[{}] not exist.", consumerGroup, topic);
            }
            break;
        }
        case CLUSTERING: {
            Set<MessageQueue> mqSet = this.topicSubscribeInfoTable.get(topic);
            List<String> cidAll = this.mQClientFactory.findConsumerIdList(topic, consumerGroup);
            // 省略代碼
            if (mqSet != null && cidAll != null) {
                List<MessageQueue> mqAll = new ArrayList<MessageQueue>();
                mqAll.addAll(mqSet);

                Collections.sort(mqAll);
                Collections.sort(cidAll);

                AllocateMessageQueueStrategy strategy = this.allocateMessageQueueStrategy;

                List<MessageQueue> allocateResult = null;
                try {
                     allocateResult = strategy.allocate(
                            this.consumerGroup,
                            this.mQClientFactory.getClientId(),
                            mqAll,
                            cidAll);
                    } catch (Throwable e) {
                        // 省略日志打印代碼
                        return;
                    }
                Set<MessageQueue> allocateResultSet = new HashSet<MessageQueue>();
                if (allocateResult != null) {
                    allocateResultSet.addAll(allocateResult);
                }
                boolean changed = this.updateProcessQueueTableInRebalance(topic, allocateResultSet, isOrder);
                //省略代碼
            }
            break;
        }
        default:
            break;
    }
}

從上面代碼我們可以看到消息模式為廣播消費模式時,消費者會消費該主題下所有的隊列,這一點也可以從本地的進度文件 offsets.json 得到印證。

▍ 差異點4:不支持順序消息

我們知道消費消息順序服務會向 Borker 申請鎖 。消費者根據分配的隊列 messageQueue ,向 Borker 申請鎖 ,如果申請成功,則會拉取消息,如果失敗,則定時任務每隔 20 秒會重新嘗試。

if (MessageModel.CLUSTERING.equals(ConsumeMessageOrderlyService.this.defaultMQPushConsumerImpl.messageModel())) {
    this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            try {
                ConsumeMessageOrderlyService.this.lockMQPeriodically();
            } catch (Throwable e) {
                log.error("scheduleAtFixedRate lockMQPeriodically exception", e);
            }
        }
    }, 1000 * 1, ProcessQueue.REBALANCE_LOCK_INTERVAL, TimeUnit.MILLISECONDS);
}

但是從上面的代碼,我們發現只有在集群消費的時候才會定時申請鎖,這樣就會導致廣播消費時,無法為負載均衡的隊列申請鎖,導致拉取消息服務一直無法獲取消息數據。

筆者修改消費例子,在消息模式為廣播模式的場景下,將消費模式從并發消費修改為順序消費。

consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
    try {
        for (MessageExt messageExt : msgs) {
            System.out.println(new String(messageExt.getBody()));
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
    return ConsumeOrderlyStatus.SUCCESS;
});

圖片圖片

通過 IDEA DEBUG 圖,筆者觀察到因為負載均衡后的隊列無法獲取到鎖,所以拉取消息的線程無法發起拉取消息請求到 Broker , 也就不會走到消費消息的流程。

因此,廣播消費模式并不支持順序消息。

▍ 差異點5:并發消費消費失敗時,沒有重試

進入并發消息消費類ConsumeMessageConcurrentlyService 的處理消費結果方法 processConsumeResult。

switch (this.defaultMQPushConsumer.getMessageModel()) {
    case BROADCASTING:
        for (int i = ackIndex + 1; i < consumeRequest.getMsgs().size(); i++) {
            MessageExt msg = consumeRequest.getMsgs().get(i);
            log.warn("BROADCASTING, the message consume failed, drop it, {}", msg.toString());
        }
        break;
    case CLUSTERING:
        List<MessageExt> msgBackFailed = new ArrayList<MessageExt>(consumeRequest.getMsgs().size());
        for (int i = ackIndex + 1; i < consumeRequest.getMsgs().size(); i++) {
            MessageExt msg = consumeRequest.getMsgs().get(i);
            boolean result = this.sendMessageBack(msg, context);
            if (!result) {
                msg.setReconsumeTimes(msg.getReconsumeTimes() + 1);
                msgBackFailed.add(msg);
            }
        }

        if (!msgBackFailed.isEmpty()) {
            consumeRequest.getMsgs().removeAll(msgBackFailed);

            this.submitConsumeRequestLater(msgBackFailed, consumeRequest.getProcessQueue(), consumeRequest.getMessageQueue());
        }
        break;
    default:
        break;
}

消費消息失敗后,集群消費時,消費者實例會通過 CONSUMER_SEND_MSG_BACK 請求,將失敗消息發回到 Broker 端。

但在廣播模式下,僅僅是打印了消息信息。因此,廣播模式下,并沒有消息重試。

3 實戰案例

廣播消費主要用于兩種場景:消息推送和緩存同步。

3.1 消息推送

筆者第一次接觸廣播消費的業務場景是神州專車司機端的消息推送。

用戶下單之后,訂單系統生成專車訂單,派單系統會根據相關算法將訂單派給某司機,司機端就會收到派單推送。

圖片圖片

推送服務是一個 TCP 服務(自定義協議),同時也是一個消費者服務,消息模式是廣播消費。

司機打開司機端 APP 后,APP 會通過負載均衡和推送服務創建長連接,推送服務會保存 TCP 連接引用 (比如司機編號和 TCP channel 的引用)。

派單服務是生產者,將派單數據發送到 MetaQ ,  每個推送服務都會消費到該消息,推送服務判斷本地內存中是否存在該司機的 TCP channel , 若存在,則通過 TCP 連接將數據推送給司機端。

肯定有同學會問:假如網絡原因,推送失敗怎么處理 ?有兩個要點:

  1. 司機端 APP 定時主動拉取派單信息;
  2. 當推送服務沒有收到司機端的 ACK 時 ,也會一定時限內再次推送,達到閾值后,不再推送。

3.2 緩存同步

高并發場景下,很多應用使用本地緩存,提升系統性能 。

本地緩存可以是 HashMap 、ConcurrentHashMap ,也可以是緩存框架 Guava Cache 或者 Caffeine cache 。

圖片圖片

如上圖,應用A啟動后,作為一個 RocketMQ 消費者,消息模式設置為廣播消費。為了提升接口性能,每個應用節點都會將字典表加載到本地緩存里。

當字典表數據變更時,可以通過業務系統發送一條消息到 RocketMQ ,每個應用節點都會消費消息,刷新本地緩存。

4 總結

集群消費和廣播消費模式下,各功能的支持情況如下:

功能

集群消費

廣播消費

順序消息

支持

不支持

重置消費位點

支持

不支持

消息重試

支持

不支持

消費進度

服務端維護

客戶端維護

廣播消費主要用于兩種場景:消息推送和緩存同步。

參考資料 :

http://www.jxzklqfsx.com/article/714277.html

https://ost.51cto.com/posts/21100

責任編輯:武曉燕 來源: 勇哥java實戰分享
相關推薦

2020-11-13 16:40:05

RocketMQ延遲消息架構

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2009-09-25 09:14:35

Hibernate日志

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2013-09-22 14:57:19

AtWood

2017-08-15 13:05:58

Serverless架構開發運維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-01-10 08:48:21

2020-09-23 10:00:26

Redis數據庫命令

2025-06-05 05:51:33

2024-02-21 21:14:20

編程語言開發Golang

2019-06-25 10:32:19

UDP編程通信

2022-11-04 09:43:05

Java線程

2017-01-13 22:42:15

iosswift

2021-04-20 23:25:16

執行函數變量

2024-03-12 00:00:00

Sora技術數據

2021-05-13 21:27:24

ThreadLocal多線程多線程并發安全
點贊
收藏

51CTO技術棧公眾號

亚洲国产福利在线| 国产精品久久久久久久裸模| 国内精品一区二区三区四区| 强迫凌虐淫辱の牝奴在线观看| 自拍网站在线观看| 中文字幕制服丝袜一区二区三区 | 国产乱人伦偷精品视频免下载| 欧美成人手机在线| 在线免费观看日韩av| 99久久这里有精品| 精品久久久在线观看| 性欧美精品一区二区三区在线播放| 国产精品一品二区三区的使用体验| 影音先锋亚洲精品| 一区二区三区亚洲| 少妇一级淫片免费放播放| 成人四虎影院| 欧美日韩亚洲91| 91制片厂免费观看| 欧洲一级在线观看| 国产精一区二区三区| 热久久美女精品天天吊色| 日韩欧美国产成人精品免费| 杨幂一区二区三区免费看视频| 91精品国产综合久久精品图片| 波多野结衣家庭教师在线播放| 欧美三级电影一区二区三区| 久久久影院官网| 成人3d动漫一区二区三区91| 一区二区视频网| 校园激情久久| 久久人人看视频| www.av成人| 欧美少妇xxxx| 亚洲欧美另类自拍| v天堂中文在线| 日韩精品成人| 制服丝袜亚洲色图| 亚洲综合欧美激情| 欧美影视资讯| 日韩欧美黄色动漫| 久久黄色片视频| av电影免费在线看| 亚洲一区二区三区国产| 成年人视频大全| 超碰免费在线播放| 国产精品成人网| 中文字幕一区二区中文字幕| 91成人高清| 中文字幕精品—区二区四季| 日韩高清国产一区在线观看| 国内三级在线观看| 久久久精品免费观看| 久久综合精品一区| 伦理片一区二区三区| 久久人人爽人人爽| 欧美影视一区二区| 国产中文字幕在线观看| 国产肉丝袜一区二区| 亚洲欧洲成人精品av97| 日欧美一区二区| 亚洲欧洲在线看| 最新在线黄色网址| 日韩中出av| 国产视频精品va久久久久久| 中出视频在线观看| 亚洲精品国模| 亚洲天堂免费视频| 日本成人免费视频| 首页国产精品| 久久国产精品电影| 劲爆欧美第一页| 女生裸体视频一区二区三区| 久久久久久12| 91视频免费网址| 日本午夜一本久久久综合| 国产精品一区二区久久久| 97视频免费在线| 国产a区久久久| 国产伦精品一区二区三区照片91| 视频一区 中文字幕| 91免费观看视频在线| 日本精品一区二区三区视频| 一级毛片视频在线观看| 一区二区三区在线视频免费| 免费观看美女裸体网站| 姬川优奈av一区二区在线电影| 欧美日韩三级在线| 特黄特色免费视频| 亚洲丝袜美腿一区| www.xxxx欧美| 日韩三级视频在线播放| 日韩 欧美一区二区三区| 97人摸人人澡人人人超一碰| 四虎影视在线观看2413| 国产精品美女视频| 欧美亚洲黄色片| 成人国产一区二区三区精品麻豆| 日韩一卡二卡三卡| 欧美成人午夜精品免费| 五月精品视频| 欧美亚洲激情在线| 国产毛片毛片毛片毛片毛片| 91污在线观看| 免费久久久久久| 亚洲福利影院| 欧美一区二区三区四区久久| 亚洲午夜久久久久久久久红桃| 成人高清av| 91精品国产91久久| 国产三级三级在线观看| 久久欧美一区二区| 成人免费观看在线| 亚洲一区av| 亚洲天堂久久av| 久草精品视频在线观看| 捆绑调教美女网站视频一区| 精品国产综合| 伊人电影在线观看| 欧美日韩不卡视频| 欧美色图亚洲激情| 亚洲美洲欧洲综合国产一区| 亚洲一区二区三区视频| av网站无病毒在线| 一本到不卡免费一区二区| 中国老熟女重囗味hdxx| 成人综合久久| 欧美孕妇毛茸茸xxxx| 亚洲成熟女性毛茸茸| 国产精品九色蝌蚪自拍| 欧美一级黄色影院| 欧美绝顶高潮抽搐喷水合集| 色中色综合影院手机版在线观看| 一区二区三区免费在线视频| 国产调教视频一区| 丰满少妇被猛烈进入高清播放| 亚洲视频国产| 欧美成人在线免费| 国产人妻精品一区二区三区| 国产精品久久久久久久第一福利| 国产天堂在线播放| 国产伦精品一区二区三区千人斩| 欧美一级在线亚洲天堂| 天天干视频在线观看| 亚洲在线观看免费视频| 亚洲丝袜在线观看| 欧美大片一区| 成人区精品一区二区| √天堂8在线网| 欧美一区二区免费视频| 日韩视频中文字幕在线观看| 精品一区二区三区在线观看| 2025韩国大尺度电影| 高清一区二区| 欧美精品在线视频观看| 精品人妻午夜一区二区三区四区 | 久久精品色妇熟妇丰满人妻| 老司机午夜精品视频| 欧美一区二区三区在线免费观看| 依依综合在线| 一区二区三区四区在线观看视频| 中文字幕+乱码+中文乱码91| 国产精品美女久久久久高潮| 免费在线观看污网站| 中文字幕午夜精品一区二区三区| 97人人澡人人爽| 草草在线视频| 亚洲网址你懂得| 伊人精品在线视频| 亚洲欧美电影一区二区| 国产a级片视频| 国产亚洲在线观看| 亚洲v欧美v另类v综合v日韩v| 欧美久久久网站| 美女少妇精品视频| 日批免费在线观看| 欧美亚洲动漫精品| 日本中文字幕免费在线观看| 粉嫩一区二区三区性色av| 欧美极品欧美精品欧美| 精品福利久久久| 亚洲一区中文字幕在线观看| 91黄页在线观看| 亚洲色图日韩av| 国产日韩免费视频| 欧美日韩亚洲成人| 亚洲精品电影院| 成人午夜免费电影| 成人亚洲视频在线观看| 亚洲乱码精品| 免费在线成人av| 国产电影一区| 欧美亚洲国产日本| av在线免费播放| 亚洲欧美中文日韩v在线观看| 亚洲天堂777| 午夜精彩视频在线观看不卡| 美国黑人一级大黄| 成a人片亚洲日本久久| 亚洲成人av免费看| 亚洲午夜极品| 亚洲一区二区三区色| 国语一区二区三区| 国产一区二区在线免费视频| 国内精彩免费自拍视频在线观看网址 | 日韩色图在线观看| 国产精品夫妻自拍| 日本japanese极品少妇| 精品一区二区精品| 免费在线观看日韩视频| 一区二区三区四区日韩| 日本不卡一区二区三区在线观看| 玖玖玖电影综合影院| 国产精品成人va在线观看| 欧美日韩经典丝袜| 日韩中文视频免费在线观看| 青青青手机在线视频观看| 日韩精品中文字幕在线一区| 精品乱码一区内射人妻无码 | 玖玖精品一区| 国产噜噜噜噜噜久久久久久久久| 高清精品在线| 欧美人与物videos| 日韩免费啪啪| 一夜七次郎国产精品亚洲| 四虎成人免费在线| 亚洲国产福利在线| 亚洲av色香蕉一区二区三区| 欧美日韩二区三区| 超碰在线97观看| 欧美性少妇18aaaa视频| 日本特黄特色aaa大片免费| 亚洲精品中文字幕乱码三区| 少妇视频一区二区| 国产精品水嫩水嫩| 亚洲无人区码一码二码三码的含义| 99久久99久久综合| 在线观看免费视频国产| 国产成人av影院| 免费欧美一级片| 国产高清精品久久久久| 超碰在线超碰在线| 国产在线播精品第三| 91高清国产视频| 久久er精品视频| 色婷婷激情视频| 国模无码大尺度一区二区三区 | 不卡一区二区在线| 国内自拍偷拍视频| 懂色av一区二区三区蜜臀| 少妇极品熟妇人妻无码| 国产suv精品一区二区6| 北京富婆泄欲对白| 99re热视频精品| 日韩精品卡通动漫网站| 久久精品男人天堂av| 色噜噜日韩精品欧美一区二区| 久久久蜜臀国产一区二区| 91成人在线免费视频| 欧美经典一区二区| 天天操夜夜操av| 亚洲一卡二卡三卡四卡 | 欧美午夜精品久久久久久超碰 | 男人操女人的视频在线观看欧美| 无码日韩人妻精品久久蜜桃| 乱一区二区av| 无码人妻一区二区三区一| www.欧美色图| 成人午夜福利一区二区| 国产精品嫩草99a| 色在线观看视频| 精品色蜜蜜精品视频在线观看| 日本熟女毛茸茸| 91黄色免费版| 999免费视频| 日韩久久免费电影| 2021av在线| 久久久免费在线观看| 欧美大片免费高清观看| 91精品久久久久久久久中文字幕| 亚洲日本va| 欧美亚洲另类久久综合| 99九九热只有国产精品| 中文字幕人妻熟女人妻洋洋| 一区二区黄色| 911福利视频| av资源网一区| 韩国一级黄色录像| 图片区小说区区亚洲影院| 亚洲av综合一区| 精品国产一区二区三区久久影院| 免费福利在线观看| 久久亚洲成人精品| 东京一区二区| y111111国产精品久久婷婷| 国产永久精品大片wwwapp| 欧美性猛交内射兽交老熟妇| 天堂成人免费av电影一区| 肉色超薄丝袜脚交| 91欧美一区二区| 免费在线视频一区二区| 在线看不卡av| 亚洲成人黄色片| 日韩亚洲欧美中文在线| 亚洲欧洲日本韩国| av一区二区三区免费| 欧美影院三区| 国产高清不卡无码视频| 免费看黄色91| 午夜一区二区三区免费| 亚洲欧美另类久久久精品| 中文字幕 国产精品| 精品电影一区二区三区| 欧洲日本在线| 国产精品国产福利国产秒拍| 久久动漫网址| 欧美大黑帍在线播放| 激情综合网最新| 欧美人与禽zoz0善交| 色综合夜色一区| 嫩草影院一区二区| 久久国产色av| 日韩成人综合网站| 日本视频一区在线观看| 中文日韩欧美| 少妇一级淫免费观看| 亚洲精品日韩综合观看成人91| 这里只有精品免费视频| 国产视频久久久久久久| 91吃瓜在线观看| 99国内精品久久久久久久软件| 999国产精品视频| 日本人69视频| 国产精品久久久久一区二区三区共| 中文字幕一区二区人妻视频| 国产丝袜精品视频| 午夜影院在线观看国产主播| 国产色综合一区二区三区| 国户精品久久久久久久久久久不卡| 九九热视频免费| 亚洲欧美一区二区三区国产精品| 一级淫片免费看| 日韩视频免费看| 性欧美video另类hd尤物| 亚洲a∨一区二区三区| 蜜臀av一区二区在线观看| 日韩女同一区二区三区| 在线免费观看成人短视频| 成年人在线观看| 国产日韩精品在线观看| 91亚洲国产| 久久发布国产伦子伦精品| 一区二区三区四区精品在线视频| www.久久久久久| 久久久午夜视频| 宅男在线一区| 91香蕉视频污版| 国产精品国产a级| 国产www免费观看| 欧美精品激情在线观看| 另类尿喷潮videofree| 黄在线观看网站| 中文欧美字幕免费| 97精品人妻一区二区三区在线| 久久久精品视频在线观看| 久久精品九色| 成人网站免费观看入口| 久久久亚洲午夜电影| 亚洲熟妇av乱码在线观看| 色综合久久88| 日韩高清在线免费观看| 538在线视频观看| 亚洲视频网在线直播| 欧美一级性视频| 国产盗摄xxxx视频xxx69| 欧美xxxxx视频| 亚洲精品乱码久久久久久蜜桃欧美| 天天色 色综合| 最新97超碰在线| 鬼打鬼之黄金道士1992林正英| 国产免费成人| 精品一区二区在线观看视频| 欧美成人国产一区二区| 都市激情亚洲一区| 99re8这里只有精品| 99久久精品国产麻豆演员表| 这里只有久久精品视频| 欧美激情一区二区三区高清视频| 一区二区三区日本久久久 | 伊人精品在线观看| youjizzjizz亚洲| 一级特黄性色生活片| 亚洲欧美一区二区三区极速播放| 深夜福利视频在线观看| 成人激情综合网| 久久精品国语| 国产中文字字幕乱码无限| 中文字幕精品一区二区精品| 老汉色老汉首页av亚洲| 中文字幕日韩综合|