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

RocketMQ基礎概念剖析,并分析一下Producer的底層源碼

開發 前端
首先我們要知道,使用RocketMQ時我們經歷了什么。那就是生產者發送一條消息給RocketMQ,RocketMQ拿到這條消息之后將其持久化存儲起來,然后消費者去找MQ消費這條消息。

 [[383867]]

本文轉載自微信公眾號「SH的全棧筆記」,作者SH。轉載本文請聯系SH的全棧筆記公眾號。

基礎概念Broker

首先我們要知道,使用RocketMQ時我們經歷了什么。那就是生產者發送一條消息給RocketMQ,RocketMQ拿到這條消息之后將其持久化存儲起來,然后消費者去找MQ消費這條消息。

RocketMQ操作

 

上圖中,RocketMQ被標識為了一個單點,但事實上肯定不是如此,對于可以隨時橫向擴展的服務來說,生產者向MQ生產消息的數量也會隨之而變化,所以一個合格成熟的MQ必然是要能夠處理這種情況的;而且MQ自身需要做到高可用,否則一旦這個單點宕機,那所有存儲在MQ中的消息就全部丟失且無法找回了。

所以在實際的生產環境中,肯定是會部署一個MQ的集群。而在RocketMQ中,這個“實例”有個專屬名詞,叫做Broker。并且,每個Broker都會部署一個Slave Broker,Master Broker會定時的向Slave Broker同步數據,形成一個Broker的主從架構。

那么問題來了,在微服務的架構中,部署的服務也存在多實例部署的情況,服務之間相互調用是通過注冊中心來獲取對應服務的實例列表的。

拿Spring Cloud舉例,服務通過Eureka注冊中心獲取到某個服務的全部實例,然后交給Ribbon,Ribbon聯動Eureka,從Eureka處獲取到服務實例的列表,然后通過負載均衡算法選出一個實例,最后發起請求。

同理,此時MQ中存在多個Broker實例,那生產者如何得知MQ集群中有多少Broker實例呢?自己應該連接哪個實例?

首先我們直接排除在代碼里Hard Code,具體原因我覺得應該不用再贅述了。RocketMQ是如何解決這個問題呢?這就是接下來我們要介紹的NameServer了。

NameServer

NameServer可以被簡單的理解為上一小節中提到的注冊中心,所有的Broker的在啟動的時候都會向NameServer進行注冊,將自己的信息上報。這些信息除了Broker的IP、端口相關數據,還有RocketMQ集群的路由信息,路由信息后面再聊。

 

 


RocketMQ操作

 

 

有了NameServer,客戶端啟動之后會和NameServer交互,獲取到當前RocketMQ集群中所有的Broker信息、路由信息。這樣一來,生產者就知道自己需要連接的Broker信息了,就可以進行消息投遞。

那么問題來了,如果在運行過程中,如果某個Broker突然宕機,NameServer會如何處理?

這需要提到RocketMQ的這續約機制和故障感知機制。Broker在完成向NameServer的注冊之后,會每隔30秒向NameServer發送心跳進行續約;如果NameServer感知到了某個Broker超過了120秒都沒有發送心跳,則會認為這個Broker不可用,將其從自己維護的信息中移除。

這套機制,和Spring Cloud中的Eureka的實現如出一轍。Eureka中的Service在啟動之后也會向Eureka注冊自己,這樣一來其他的服務就可以向該服務發起請求,交換數據。Service每隔30秒會向Eureka發送心跳續約,如果某個Service超過了90秒沒有發送心跳,Eureka就會認為該服務宕機,將其從Eureka維護的注冊表中移除。

上面圖中我聊到了多實例部署,這個多實例部署和微服務中的多實例部署還不太一樣,微服務中,所有的服務都是無狀態的,可以橫向的擴展,而在RocketMQ中,每個Broker所存的數據可能都不一樣。

我們來看一下RocketMQ的簡單使用。

  1. Message msg = new Message( 
  2.   "TopicTest"
  3.   "TagA"
  4.   ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) 
  5. ); 
  6. SendResult sendResult = producer.send(msg); 

可以看到,Message的第一個參數,為當前這條消息指定了一個Topic,那Topic又是什么呢?

Topic

Topic是對發送到RocketMQ中的消息的邏輯分類,例如我們的訂單系統、積分系統、倉儲系統都會用到這個MQ,為了對其進行區分,我們就可以為不同的系統建立不同的Topic。

那為什么說是邏輯分區呢?因為RocketMQ在真實存儲中,并不是一個Broker就存儲一個Topic的數據,道理很簡單,如果當前這個Broker宕機,甚至極端情況磁盤壞了,那這個Topic的數據就會永久丟失。

所以在真實存儲中,消息是分布式的存儲在多個Broker上的,這這些分散在多個Broker上的存儲介質叫MessageQueue,如果你熟悉Kafka的底層原理,就知道這個跟Kafka中的Partition是同類的實現。

 


Message Queue存儲

 

 

通過上圖可以看出,同一個Topic的數據,被分成了好幾份,分別存儲在不同的Broker上,那RocketMQ為什么要這么實現?

首先,一個Topic中如果只有一個Queue,那么消費者在消費時的速度必然受到影響;而如果一個Topic有很多個Queue,那么Consumer就可以將消費操作同時進行,從而扛住更多的并發。

除此之外,單臺機器的資源是有限的。一個Topic的消息量可能會非常之巨大,一臺機器的磁盤很快就會被塞滿。所以RocketMQ將一個Topic的數據分攤給了多臺機器,進行分散存儲。其本質上就是一個數據分片存儲的一種機制。

所以我們知道了,發送到某個Topic的數據是分布式的存儲在多個Broker中的MessageQueue上的。

Broker消息存儲原理

那Producer發送到Broker中的消息,到底是以什么方式存儲的呢?答案是Commit Log,Broker收到消息,會將該消息采用順序寫入的方式,追加到磁盤上的Commit Log文件中,每個Commit Log大小為1G,如果寫滿了1G則會新建一個Commit Log繼續寫,Commit Log文件的特點是順序寫、隨機讀。

Topic詳情

 

這就是最底層的存儲的方式,那么問題來了,Consumer來取消息的時候,Broker是如何從這一堆的Commit Log中找到相應的數據呢?眾所周知,一提到磁盤的I/O操作,就會聯想到耗時這兩個字,而RocketMQ的一大特點就是高吞吐,看似很矛盾,RocketMQ是如何做的呢?

答案是ConsumeQueue,Broker在寫入Commit Log的同時,還會將當前這條消息在Commit Log中的Offset、消息的Size和對應的Tag的Hash寫入到ConsumeQueue文件中。每個Message Queue會有相對應的ConsumeQueue文件存儲在磁盤上。

和Commit Log一樣,一個ConsumeQueue包含了30W條消息,每條消息的大小為20字節,所以每個ConsumeQueue文件的大小約為5.72M;當其寫滿了之后,會再新建一個ConsumeQueue文件繼續寫入。

ConsumeQueue是一種邏輯隊列,更是一種索引,讓Consumer來消費的時候可以快速的從磁盤文件中定位到這條消息。

看到這你可能會想,上面提到的Tag又是個什么東西?

Tag

Tag,標簽,用于對同一個Topic內的消息進行分類,為什么還需要對Topic進行消息類型劃分呢?

舉一個極端的例子,某一個新的服務,需要去消費訂單系統的MQ,但是由于業務的特殊性,只需要去消費商品類型為數碼產品的訂單消息,如果沒有Tag,那么該Consumer就會去做判斷,該訂單消息是否是數碼產品類,如果不是,則丟棄,如果是則進行消費。

這樣一來,Consumer側就執行了大量的無用功。引入了Tag之后,Producer在生產消息的時候會給訂單打上Tag,Consumer進行消費的時候,可以配置只消費指定的Tag的消息。這樣一來就不需要Consumer自己去做這個事情了,RocketMQ會幫我們實現這個過濾。

那其過濾的原理是什么?首先在Broker側是通過消息中保存的Tag的Hash值進行過濾,然后Consumer側在去拉取消息的時候還需要再過濾一次。

為什么在Broker過濾了,還需要在Consumer側再過濾一次?因為Hash沖突,不同的Tag經過Hash算法之后可能會得到一樣的值,所以Consumer側在拉取消息的時候會通過字符串進行二次過濾。

Producer發送消息源碼分析

流程總覽

首先給出整個發送消息的大致流程,先熟悉這個流程看源碼,會更加的清晰一點。

 

 


總體流程

 

 

初始化Prodcuer

還是按照下面這個例子出發。

producer使用樣例

 

首先我們會初始化一個DefaultMQProducer,RocketMQ會給這個Producer一個默認的實現DefaultMQProducerImpl。然后producer.start()會啟動一個線程池。

合法性校驗

接下來就是比較核心的producer.send(msg)了,首先RocketMQ會調用checkMessage來檢測發送的消息是否合法。

 

 


send消息

 

 

這些檢測包含了待發送的消息是否為空,Topic是否為空、Topic是否包含了非法的字符串、Topic的長度是否超過了最大限制127,然后會去檢查Body是否符合發送要求,例如msg的Body是否為空、msg的Body是否超過了最大的限制等等,這里消息的Body最大不能超過4M。

檢查消息合法性源碼

 

調用發送消息

對于msg的Topic,RocketMQ會用NameSpace將其包裝一層,然后就會調用DefaultMQProducerImpl中的sendDefaultImpl默認實現,發送消息給Broker,默認的發送消息Timeout是3秒。

 

 


發送消息默認實現

 

 

發送消息中,MQ會再次調用checkMessage對消息的合法性再次進行檢查,然后就會去嘗試獲取Topic的詳細信息。

所有的Topic的信息都會存在一個叫topicPublishInfoTable的 ConcurrentHashMap中,這個Map中Key就是Topic的字符串,而Value則是TopicPublishInfo。

這個TopicPublishInfo中就包含了之前在基礎概念中提到的,從Broker中獲取到的相應的元數據,其中就包含了關鍵的MessageQueue和集群元數據,其基礎的結構如下。

 

 


Topic詳情

 

 

messageQueueList包含了該Topic下的所有的MessageQueue,每個MessageQueue的所屬Topic,每個MessageQueue所在的Broker的名稱以及專屬的queueId。

topicRouteData包含了該Topic下的所有的Queue、Broker相關的數據。

獲取Topic詳細數據

在最終發送消息前,需要獲取到Topic的詳情,例如像Broker地址這樣的數據,Producer中是通過tryToFindTopicPublishInfo方法獲取的,詳細的注釋我已經寫在了下圖中。

 

 


獲取topic詳情

 

 

對于首次使用的Topic,在上面的Map肯定是不存在的。所以RocketMQ會將其加入到Map中去,并且調用方法updateTopicRouteInfoFromNameServer從NameServer處獲取該Topic的元數據,將其一并寫入Map。初次之外,還會將路由信息、Broker的詳細信息分別放入topicRouteTable和brokerAddrTable中,這兩個都是Producer維護在內存中的ConcurrentHashMap。

獲取到了Topic的詳細信息之后,接下來會確認一個發送的重試次數timesTotal,假設timesTotal為N,那么發送消息如果失敗就會重試N次。不過當且僅當發送失敗的時候才會進行重試,其余的case都不會,例如超時、或者沒有選擇到合適的MessageQueue。

這個重試的次數timesTotal受到參數communicationMode的影響;CommunicationMode有三個值,分別是SYNC、ASYNC和ONEWAY。RocketMQ默認的實現中,選擇了SYNC同步。

 

 


計算重試次數

 

 

通過代碼我們可以看到,如果是communicationMode是SYNC的話,timesTotal的值為1+retryTimesWhenSendFailed,而retryTimesWhenSendFailed的值默認為2,代表在消息發送失敗之后的重試次數。

這樣一來,如果我們選擇了SYNC的方式,Producer在發送消息的時候默認的重試次數就為3。不過當且僅當發送失敗的時候才會進行重試,其余的case都不會。

MessageQueue選擇機制

我們之前聊過,一個Topic的數據是分片存儲在一個或者多個Broker上的,底層的存儲介質為MessageQueue,之前的圖中,我們沒有給出Producer是如何選擇具體發送到哪個MessageQueue,這里我們通過源碼來看一下。

Producer中是通過selectOneMessageQueue來進行的Message Queue選擇,該方法通過Topic的詳細元數據和上次選擇的MessageQueue所在的Broker,來決定下一個的選擇。

核心的選擇邏輯

其核心的選擇邏輯是什么呢?用大白話來說,就是選出一個index,然后將其和當前Topic的MessageQueue數量取模。這個index在首次選擇的時候,肯定是沒有的, RocketMQ會搞一個隨機數出來。然后在該值的基礎上+1,因為為了通用,在外層看來,這個index上次已經用過了,所以每次獲取你都直接幫我+1就好了。

 

 


核心的選擇機制

 

 

上圖就是MessageQueue最核心的、最底層的原則機制了。但是由于實際的業務情況十分復雜, RocketMQ在實現中還額外的做了很多的事情。

發送故障延遲下的選擇邏輯

在實際的選擇過程中,會判斷當前是否啟用了發送延遲故障,這個由變量sendLatencyFaultEnable的值決定,其默認值是false,也就是默認是不開啟的,從代碼里我暫時沒找到其開啟的位置。

不過我們可以聊聊開啟之后,會發生什么。它同樣會開啟for循環,次數為MessageQueue的數量,計算拿到確定的Queue之后,會通過內存的一張表faultItemTable去判斷當前這個Broker是否可用,該表是每次發送消息的時候都會去更新它。

如果當前沒有可用的Broker,則會觸發其兜底的邏輯,再選擇一個MessageQueue出來。

選擇queue的源碼

 

常規的選擇邏輯

如果當前發送故障延遲沒有啟用,則會走常規邏輯,同樣的會去for循環計算,循環中取到了MessageQueue之后會去判斷是否和上次選擇的MessageQueue屬于同一個Broker,如果是同一個Broker,則會重新選擇,直到選擇到不屬于同一個Broker的MessageQueue,或者直到循環結束。這也是為了將消息均勻的分發存儲,防止數據傾斜。

 


常規邏輯下的選擇邏輯

 

 

消息發送

最后就會調用Netty相關的組件,將消息發送出去了。

EOF關于RocketMQ中的一些基礎的概念,和RocketMQ的Producer發送消息的源碼就先分析到這里,后續看緣分再分享其他部分的源碼吧。

 

責任編輯:武曉燕 來源: SH的全棧筆記
相關推薦

2021-03-24 07:16:57

RocketMQ源碼解析Topic

2021-07-09 07:15:48

RocketMQ數據結構kafka

2021-11-04 12:42:55

RocketMQ啟動消費

2021-03-15 09:44:39

Broker源碼RocketMQ

2021-07-05 06:51:41

Nacos微服務源碼

2022-04-11 08:08:52

OpenGauss數據庫接口

2021-07-20 10:26:53

源碼底層ArrayList

2011-08-22 15:19:25

2021-06-15 10:19:11

機器學習人工智能計算機

2021-05-12 10:59:39

Kubernetes容器集群

2025-06-26 01:25:00

2021-01-28 10:23:26

Seata模式分布式

2022-05-24 13:09:28

區塊鏈

2022-01-13 06:59:40

HashMap底層面試

2024-03-01 18:55:54

內存調試Go 語言

2025-02-27 09:06:34

2021-08-07 07:56:59

Node邏輯對象

2023-11-29 08:00:53

JavaTreeMap底層

2022-11-11 10:48:55

AQS源碼架構

2023-06-09 14:01:00

架構程序APP
點贊
收藏

51CTO技術棧公眾號

日本一级在线观看| 欧美极品视频在线观看| 欧洲av一区二区| 国产精品污污网站在线观看| 91中文字幕在线观看| 久久免费播放视频| 亚洲人成网www| 欧美日韩电影在线播放| 国产尤物av一区二区三区| 少妇高潮久久久| 日本91福利区| 欧美高跟鞋交xxxxhd| 性色av蜜臀av色欲av| 久久爱.com| 精品久久久久久久久久久久| 亚洲精品中字| 国产 日韩 欧美 精品| 日日夜夜免费精品| 欧美高清在线视频观看不卡| 女女互磨互喷水高潮les呻吟| 秋霞一区二区| 欧美综合一区二区三区| 成人免费在线网| 最新97超碰在线| 99久久综合99久久综合网站| 国产在线拍偷自揄拍精品| 亚洲精品国产精品乱码| 国产精品88久久久久久| 国产午夜精品久久久| 蜜臀一区二区三区精品免费视频| 五月天国产在线| 夜夜嗨av一区二区三区中文字幕| 午夜精品一区二区三区在线观看 | 欧美日韩另类国产亚洲欧美一级| 精品无码一区二区三区爱欲| 高清全集视频免费在线| 国产亚洲精品7777| 国产有色视频色综合| 国产区精品在线| 另类综合日韩欧美亚洲| 日韩av成人在线| 精品91久久久| 99精品视频免费| 欧美成年人视频网站欧美| 久久日免费视频| 精品久久成人| 亚洲色图av在线| 午夜一区二区三区免费| 高清日韩欧美| 亚洲爱爱爱爱爱| 国产成人精品一区二区在线小狼 | 欧美精品xxxxbbbb| 国产精品拍拍拍| 成人看片网站| 欧美亚洲动漫另类| 91精品无人成人www| 天天综合网站| 在线日韩av片| 一区二区三区韩国| 日韩视频网站在线观看| 91福利精品第一导航| 免费黄色特级片| 三上悠亚亚洲一区| 在线视频观看一区| 亚洲欧美日韩另类| 欧美人与性动交α欧美精品| 2020国产精品小视频| 欧美猛男男办公室激情| 91精品999| 国产95亚洲| 日韩视频中午一区| 野战少妇38p| 成人av资源网址| 日韩www在线| 亚洲天堂久久新| 欧美一区电影| xxxxx91麻豆| 欧美日韩成人免费观看| 狠狠入ady亚洲精品经典电影| 国外成人免费在线播放 | yes4444视频在线观看| 久久久久88色偷偷免费| 五月天丁香综合久久国产| 欧美成人精品一区二区男人看| 日韩一区欧美一区| 免费看毛片的网址| 精品国产第一福利网站| 欧美日韩中文字幕一区| 波多野结衣免费观看| 久久综合另类图片小说| 一本一道久久a久久精品逆3p| 91无套直看片红桃在线观看| 欧美 日韩 国产精品免费观看| 久久久久久18| 天堂av免费在线观看| 国产在线一区二区综合免费视频| 国产精品久久久久久久久久久久午夜片| 天天操天天干天天爱| 国产亚洲1区2区3区| 日本一二三区视频在线| 91精品论坛| 91麻豆精品国产91久久久更新时间 | 国产有色视频色综合| h视频在线免费| 一区二区三区鲁丝不卡| 国产视频在线视频| 中文一区二区三区四区| 少妇精69xxtheporn| 久久精品久久国产| 美女视频第一区二区三区免费观看网站| 99r国产精品视频| 国产在线免费观看| 亚洲国产一区二区三区青草影视| 波多野结衣天堂| 另类ts人妖一区二区三区| 日韩视频免费在线观看| 毛片视频网站在线观看| 国产精品伊人色| 神马影院我不卡| 国产理论在线| 欧美福利电影网| 男人舔女人下部高潮全视频 | 老头吃奶性行交视频| 日韩中文字幕无砖| 亚洲人成五月天| 18精品爽视频在线观看| 日日夜夜精品视频免费| 成人性生交大片免费观看嘿嘿视频| 日本五码在线| 一区二区三区视频在线看| 国产97色在线 | 日韩| 日韩精品视频中文字幕| 亚洲日本欧美中文幕| 国产精品111| 国产精品456露脸| 日韩免费av一区二区三区| 污视频免费在线观看| 欧美午夜理伦三级在线观看| 国产麻豆xxxvideo实拍| 91精品精品| 国产日韩在线视频| 国产视频网站在线| 天天影视网天天综合色在线播放| www午夜视频| 婷婷激情久久| 欧美大片在线看免费观看| 在线免费观看一区二区| 国产精品久久福利| 国产一区二区视频免费在线观看| 爱高潮www亚洲精品| 久久夜色精品国产| 中文字幕有码视频| 国产日韩欧美一区二区三区乱码| 丰满少妇被猛烈进入高清播放| 成人激情自拍| 欧美黑人一级爽快片淫片高清| 888奇米影视| 亚洲欧洲精品一区二区三区| 天天综合网日韩| 日本午夜一区| 国产精品久久久av| 日本电影一区二区在线观看| 午夜精品影院在线观看| www.四虎精品| 狠狠爱成人网| 91成人免费在线观看| 国产精品久久麻豆| 欧美一区二区久久| 四虎永久免费在线| 国产麻豆精品theporn| 在线视频亚洲自拍| 在线观看欧美| 欧美成人久久久| 国内精品久久久久久久久久| 一卡二卡欧美日韩| 国产51自产区| 中文日韩在线| 日韩激情视频| 先锋影音一区二区| 久久久999精品免费| 国产毛片毛片毛片毛片| 亚洲地区一二三色| 毛茸茸多毛bbb毛多视频| 国产日韩欧美三级| 日韩免费电影一区二区| 亚洲伦理久久| 欧美成人精品影院| 免费在线国产| 欧美日韩精品一二三区| 性生交大片免费全黄| 国产一区二区三区综合| 4444亚洲人成无码网在线观看| 果冻天美麻豆一区二区国产| 国产成人在线一区| 欧美黑人激情| 亚洲国产成人久久综合| 日韩一级片中文字幕| 国产精品丝袜久久久久久app| 久草福利在线观看| 99伊人成综合| 国产亚洲一区二区三区在线播放| 日本成人三级电影| 精品国产视频在线| 国精品人妻无码一区二区三区喝尿| 精品久久久久国产| 男人晚上看的视频| 91麻豆文化传媒在线观看| 国产主播中文字幕| 欧美三级不卡| 欧美日韩综合网| 亚洲老司机网| 97在线视频免费播放| 伦xxxx在线| 亚洲国产日韩欧美综合久久 | 欧美精品免费视频| 欧美成人aaaaⅴ片在线看| 国产午夜精品理论片a级大结局| 在线视频观看91| 亚洲少妇一区| 97超碰人人爱| 激情五月综合网| 国产91精品入口17c| 日韩精品麻豆| 97国产精品视频人人做人人爱| 黄网站免费在线播放| 亚洲精品资源在线| 亚洲老妇色熟女老太| 欧美性一二三区| 日本少妇久久久| 夜夜嗨av一区二区三区中文字幕 | 久久久不卡影院| 69亚洲乱人伦| 国模大尺度一区二区三区| 久草福利视频在线| 亚洲精品欧美| 好吊色视频988gao在线观看| 日本一区二区高清不卡| 免费国产一区| 色狠狠久久av综合| 91精品天堂| 四虎精品永久免费| 国产v综合ⅴ日韩v欧美大片| 国产嫩草在线视频| 日韩有码在线电影| 成人动漫在线播放| 亚洲天堂成人在线| 少妇精品高潮欲妇又嫩中文字幕| 91精品国产综合久久香蕉麻豆| 亚洲一区二区视频在线播放| 色噜噜偷拍精品综合在线| 国产一级二级三级| 亚洲人成精品久久久久| 亚洲色图日韩精品| 成人免费观看视频| 97人妻精品一区二区三区免费| 国产真实精品久久二三区| 亚洲另类第一页| 免费观看日韩电影| 免费无码av片在线观看| 国产欧美日韩一级| 99视频在线免费播放| 亚洲黄色视屏| 男人天堂av片| 极品av少妇一区二区| 怡红院av亚洲一区二区三区h| 亚洲国产高清视频| 欧美不卡在线播放| 亚洲国产黄色| 霍思燕三级露全乳照| 久久国产精品久久久久久电车| 大肉大捧一进一出好爽视频| 免费日韩av片| 黄色av免费在线播放| 老司机精品视频导航| 亚洲欧美日本一区二区| 国产一区二三区好的| 国产又粗又猛大又黄又爽| 国产精品影音先锋| 久久久久麻豆v国产精华液好用吗| 99亚偷拍自图区亚洲| 可以直接看的无码av| 国产亚洲成av人在线观看导航| 永久免费av无码网站性色av| 中文字幕一区二区不卡| 欧美日韩午夜视频| 一区二区成人在线观看| 国产污片在线观看| 日韩欧美成人免费视频| 一区二区视频网站| 4hu四虎永久在线影院成人| va婷婷在线免费观看| 亚洲国产成人久久综合| 欧美日韩国产综合视频| 日韩在线播放av| av资源网在线播放| 日韩暖暖在线视频| 综合久久av| 欧美精品二区三区四区免费看视频 | 国产小视频免费在线观看| 中国日韩欧美久久久久久久久| 毛片在线导航| 国产成人综合亚洲| 国产精品成人3p一区二区三区| 国产麻豆日韩| 国产欧美日韩在线一区二区| 国产大尺度在线观看| 精品电影一区| 国产天堂在线播放| 成人毛片在线观看| 四虎成人免费影院| 亚洲综合成人网| 日韩黄色片网站| 6080yy午夜一二三区久久| 色综合888| 不卡毛片在线看| 免费观看亚洲| 97超碰最新| 首页国产精品| 国产a级一级片| 精品制服美女久久| 黄色片视频免费观看| 国产精品高清亚洲| 99热只有这里有精品| 欧美精品tushy高清| 国产中文字幕在线播放| 欧美黄网免费在线观看| 91天天综合| 国产一区二区在线观看免费播放 | 女同性恋一区二区| 丝袜美腿一区二区三区| wwwxx日本| 综合欧美亚洲日本| 中文字幕永久免费视频| 亚洲嫩模很污视频| xxx.xxx欧美| 亚洲aa中文字幕| 久久亚洲专区| 东京热加勒比无码少妇| 国产成人精品免费看| www.97视频| 欧美精品日韩综合在线| 国产天堂素人系列在线视频| 97av在线视频| 超碰一区二区三区| 精品丰满人妻无套内射| 国产一区二区视频在线播放| 99re6热在线精品视频| 欧美在线观看一区| 超碰免费97在线观看| 欧洲成人在线视频| 另类春色校园亚洲| cao在线观看| 9久草视频在线视频精品| 免费在线观看国产精品| 欧美一区二区在线看| 青青草娱乐在线| 国产精品福利在线观看网址| 九一成人免费视频| 日韩少妇内射免费播放| 成人手机电影网| 国产一级二级毛片| 亚洲成人黄色网址| 怡红院在线播放| 91精品国产一区二区三区动漫| 欧美成人69| 久久久久亚洲av无码网站| 亚洲国产aⅴ天堂久久| 熟妇高潮一区二区高潮| 午夜欧美大片免费观看| 久久97久久97精品免视看秋霞| 又粗又黑又大的吊av| 91一区二区三区在线播放| 欧美一区二区三区四| 亚洲日本成人网| 国产伊人久久| 99热这里只有精品7| 国产福利一区二区三区视频| 国产午夜福利一区二区| 日韩精品视频在线观看网址| 在线精品亚洲欧美日韩国产| 日本精品视频一区| 国产精品影音先锋| 国产主播在线播放| 精品视频在线播放免| 国产第一亚洲| 男人c女人视频| 91丨九色丨蝌蚪丨老版| 成人h动漫精品一区二区下载| www国产亚洲精品久久网站| 日韩高清一区| 欧美视频免费看欧美视频| 久久久精品影视| 96亚洲精品久久久蜜桃| 欧美黑人xxxⅹ高潮交| 天海翼精品一区二区三区| 亚洲成人天堂网| 亚洲成人av中文| 国产视频福利在线| 成人中心免费视频| 99精品视频免费观看视频|