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

深入理解RocketMQ延遲消息

開發 架構
本文第一部分從整體上介紹秒級精度延遲消息的實現思路,在第二部分結合RocketMQ的延遲消息實現,進行細致的講解,點出關鍵部分的源碼。第三步介紹延遲消息與消息重試的關系。

[[352163]]

 延遲消息是實際開發中一個非常有用的功能,本文第一部分從整體上介紹秒級精度延遲消息的實現思路,在第二部分結合RocketMQ的延遲消息實現,進行細致的講解,點出關鍵部分的源碼。第三步介紹延遲消息與消息重試的關系。

1 延遲消息介紹

基本概念:延遲消息是指生產者發送消息發送消息后,不能立刻被消費者消費,需要等待指定的時間后才可以被消費。

場景案例:用戶下了一個訂單之后,需要在指定時間內(例如30分鐘)進行支付,在到期之前可以發送一個消息提醒用戶進行支付。

一些消息中間件的Broker端內置了延遲消息支持的能力,如:

  •  NSQ:這是一個go語言的消息中間件,其通過內存中的優先級隊列來保存延遲消息,支持秒級精度,最多2個小時延遲。Java中也有對應的實現,如ScheduledThreadPoolExecutor內部實際上也是使用了優先級隊列。
  •  QMQ:采用雙重時間輪實現。可參考:任意時間延時消息原理講解:設計與實現
  •  RabbitMQ:需要安裝一個rabbitmq_delayed_message_exchange插件。
  •  RocketMQ:RocketMQ 開源版本延遲消息臨時存儲在一個內部主題中,不支持任意時間精度,支持特定的 level,例如定時 5s,10s,1m 等。

Broker端內置延遲消息處理能力,核心實現思路都是一樣:將延遲消息通過一個臨時存儲進行暫存,到期后才投遞到目標Topic中。如下圖所示:

步驟說明如下:

  1.  producer要將一個延遲消息發送到某個Topic中
  2.  Broker判斷這是一個延遲消息后,將其通過臨時存儲進行暫存。
  3.  Broker內部通過一個延遲服務(delay service)檢查消息是否到期,將到期的消息投遞到目標Topic中。這個的延遲服務名字為delay service,不同消息中間件的延遲服務模塊名稱可能不同。
  4.  消費者消費目標topic中的延遲投遞的消息

顯然,臨時存儲模塊和延遲服務模塊,是延遲消息實現的關鍵。上圖中,臨時存儲和延遲服務都是在Broker內部實現,對業務透明。

此外, 還有一些消息中間件原生并不支持延遲消息,如Kafka。在這種情況下,可以選擇對Kafka進行改造,但是成本較大。另外一種方式是使用第三方臨時存儲,并加一層代理。

第三方存儲選型要求:

對于第三方臨時存儲,其需要滿足以下幾個特點:

  •  高性能:寫入延遲要低,MQ的一個重要作用是削峰填谷,在選擇臨時存儲時,寫入性能必須要高,關系型數據庫(如Mysql)通常不滿足需求。
  •  高可靠:延遲消息寫入后,不能丟失,需要進行持久化,并進行備份
  •  支持排序:支持按照某個字段對消息進行排序,對于延遲消息需要按照時間進行排序。普通消息通常先發送的會被先消費,延遲消息與普通消息不同,需要進行排序。例如先發一條延遲10s的消息,再發一條延遲5s的消息,那么后發送的消息需要被先消費。
  •  支持長時間保存:一些業務的延遲消息,需要延遲幾個月,甚至更長,所以延遲消息必須能長時間保留。不過通常不建議延遲太長時間,存儲成本比較大,且業務邏輯可能已經發生變化,已經不需要消費這些消息。

例如,滴滴開源的消息中間件DDMQ,底層消息中間件的基礎上加了一層代理,獨立部署延遲服務模塊,使用rocksdb進行臨時存儲。rocksdb是一個高性能的KV存儲,并支持排序。

此時對于延遲消息的流轉如下圖所示:

說明如下:

  1.  生產者將發送給producer proxy,proxy判斷是延遲消息,將其投遞到一個緩沖Topic中;
  2.  delay service啟動消費者,用于從緩沖topic中消費延遲消息,以時間為key,存儲到rocksdb中;
  3.  delay service判斷消息到期后,將其投遞到目標Topic中。
  4.  消費者消費目標topic中的數據

這種方式的好處是,因為delay service的延遲投遞能力是獨立于broker實現的,不需要對broker做任何改造,對于任意MQ類型都可以提供支持延遲消息的能力。例如DDMQ對RocketMQ、Kafka都提供了秒級精度的延遲消息投遞能力,但是Kafka本身并不支持延遲消息,而RocketMQ雖然支持延遲消息,但不支持秒級精度。

事實上,DDMQ還提供了很多其他功能,僅僅從延遲消息的角度,完全沒有必要使用這個proxy,直接將消息投遞到緩沖Topic中,之后通過delay service完成延遲投遞邏輯即可。

具體到delay service模塊的實現上,也有一些重要的細節:

    1.  為了保證服務的高可用,delay service也是需要部署多個節點。

    2.  為了保證數據不丟失,每個delay service節點都需要消費緩沖Topic中的全量數據,保存到各自的持久化存儲中,這樣就有了多個備份,并需要以時間為key。不過因為是各自拉取,并不能保證強一致。如果一定要強一致,那么delay service就不需要內置存儲實現,可以借助于其他支持強一致的存儲。

    3.  為了避免重復投遞,delay service需要進行選主,可以借助于zookeeper、etcd等實現。只有master可以通過生產者投遞到目標Topic中,其他節點處于備用狀態。否則,如果每個節點進行都投遞,那么延遲消息就會被投遞多次,造成消費重復。

    4.  master要記錄自己當前投遞到的時間到一個共享存儲中,如果master掛了,從slave節點中選出一個新的master節點,從之前記錄時間繼續開始投遞。

    5.  延遲消息的取消:一些延遲消息在未到期之前,可能希望進行取消。通常取消邏輯實現較為復雜,且不夠精確。對于那些已經快要到期的消息,可能還未取消之前,已經發送出去了,因此需要在消費者端做檢查,才能萬無一失。

2 RocketMQ中的延遲消息

開源RocketMQ支持延遲消息,但是不支持秒級精度。默認支持18個level的延遲消息,這是通過broker端的messageDelayLevel配置項確定的,如下: 

  1. messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 

Broker在啟動時,內部會創建一個內部主題:SCHEDULE_TOPIC_XXXX,根據延遲level的個數,創建對應數量的隊列,也就是說18個level對應了18個隊列。注意,這并不是說這個內部主題只會有18個隊列,因為Broker通常是集群模式部署的,因此每個節點都有18個隊列。

延遲級別的值可以進行修改,以滿足自己的業務需求,可以修改/添加新的level。例如:你想支持2天的延遲,修改最后一個level的值為2d,這個時候依然是18個level;也可以增加一個2d,這個時候總共就有19個level。

可以看到這里并不支持秒級精度,按照《rocketmq developer guide》中的說法,是為了避免在broker對消息進行排序,造成性能影響。不過筆者考慮,之所以不支持,更多應該是商業上的考慮。

生產者發送延遲消息:

生產者在發送延遲消息非常簡單,只需要設置一個延遲級別即可,注意不是具體的延遲時間,如: 

  1. Message msg=new Message();  
  2. msg.setTopic("TopicA");  
  3. msg.setTags("Tag");  
  4. msg.setBody("this is a delay message".getBytes());  
  5. //設置延遲level為5,對應延遲1分鐘  
  6. msg.setDelayTimeLevel(5);  
  7. producer.send(msg); 

如果設置的延遲level超過最大值,那么將會重置最最大值。

Broker端存儲延遲消息:

延遲消息在RocketMQ Broker端的流轉如下圖所示:

可以看到,總共有6個步驟,下面會對這6個步驟進行詳細的講解:

  1.  修改消息Topic名稱和隊列信息
  2.  轉發消息到延遲主題的CosumeQueue中
  3.  延遲服務消費SCHEDULE_TOPIC_XXXX消息
  4.  將信息重新存儲到CommitLog中
  5.  將消息投遞到目標Topic中
  6.  消費者消費目標topic中的數據

第一步:修改消息Topic名稱和隊列信息

RocketMQ Broker端在存儲生產者寫入的消息時,首先都會將其寫入到CommitLog中。之后根據消息中的Topic信息和隊列信息,將其轉發到目標Topic的指定隊列(ConsumeQueue)中。

由于消息一旦存儲到ConsumeQueue中,消費者就能消費到,而延遲消息不能被立即消費,所以這里將Topic的名稱修改為SCHEDULE_TOPIC_XXXX,并根據延遲級別確定要投遞到哪個隊列下。

同時,還會將消息原來要發送到的目標Topic和隊列信息存儲到消息的屬性中。相關源碼如下所示:

org.apache.rocketmq.store.CommitLog#putMessage

第二步:轉發消息到延遲主題的CosumeQueue中

CommitLog中的消息轉發到CosumeQueue中是異步進行的。在轉發過程中,會對延遲消息進行特殊處理,主要是計算這條延遲消息需要在什么時候進行投遞。 

  1. 投遞時間=消息存儲時間(storeTimestamp) + 延遲級別對應的時間 

需要注意的是,會將計算出的投遞時間當做消息Tag的哈希值存儲到CosumeQueue中,CosumeQueue單個存儲單元組成結構如下圖所示:

其中:

  •  Commit Log Offset:記錄在CommitLog中的位置。
  •  Size:記錄消息的大小
  •  Message Tag HashCode:記錄消息Tag的哈希值,用于消息過濾。特別的,對于延遲消息,這個字段記錄的是消息的投遞時間戳。這也是為什么java中hashCode方法返回一個int型,只占用4個字節,而這里Message Tag HashCode字段卻設計成8個字節的原因。

相關源碼參見:

CommitLog#checkMessageAndReturnSize

第三步:延遲服務消費SCHEDULE_TOPIC_XXXX消息

Broker內部有一個ScheduleMessageService類,其充當延遲服務,消費SCHEDULE_TOPIC_XXXX中的消息,并投遞到目標Topic中。

ScheduleMessageService在啟動時,其會創建一個定時器Timer,并根據延遲級別的個數,啟動對應數量的TimerTask,每個TimerTask負責一個延遲級別的消費與投遞。

相關源碼如下所示:

ScheduleMessageService#start

需要注意的是,每個TimeTask在檢查消息是否到期時,首先檢查對應隊列中尚未投遞第一條消息,如果這條消息沒到期,那么之后的消息都不會檢查。如果到期了,則進行投遞,并檢查之后的消息是否到期。

第四步:將信息重新存儲到CommitLog中

在將消息到期后,需要投遞到目標Topic。由于在第一步已經記錄了原來的Topic和隊列信息,因此這里重新設置,再存儲到CommitLog即可。此外,由于之前Message Tag HashCode字段存儲的是消息的投遞時間,這里需要重新計算tag的哈希值后再存儲。

源碼參見:DeliverDelayedMessageTimerTask的messageTimeup方法。

第五步:將消息投遞到目標Topic中

這一步與第二步類似,不過由于消息的Topic名稱已經改為了目標Topic。因此消息會直接投遞到目標Topic的ConsumeQueue中,之后消費者即消費到這條消息。

3 延遲消息與消費重試的關系

RocketMQ提供了消息重試的能力,在并發模式消費消費失敗的情況下,可以返回一個枚舉值RECONSUME_LATER,那么消息之后將會進行重試。如: 

  1. consumer.registerMessageListener(new MessageListenerConcurrently() {  
  2.        @Override  
  3.        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,  
  4.                                        ConsumeConcurrentlyContext context) {  
  5.            //處理消息,失敗,返回RECONSUME_LATER,進行重試  
  6.            return ConsumeConcurrentlyStatus.RECONSUME_LATER;  
  7.        } 
  8.     }); 

重試默認會進行重試16次。使用過RocketMQ消息重試功能的用戶,可能看到過以下這張圖:

第幾次重試 與上次重試的間隔時間 第幾次重試 與上次重試的間隔時間
1 10 秒 9 7 分鐘
2 30 秒 10 8 分鐘
3 1 分鐘 11 9 分鐘
4 2 分鐘 12 10 分鐘
5 3 分鐘 13 20 分鐘
6 4 分鐘 14 30 分鐘
7 5 分鐘 15 1 小時
8 6 分鐘 16 2 小時

細心地的讀者發現了,消息重試的16個級別,實際上是把延遲消息18個級別的前兩個level去掉了。事實上,RocketMQ的消息重試也是基于延遲消息來完成的。在消息消費失敗的情況下,將其重新當做延遲消息投遞回Broker。

在投遞回去時,會跳過前兩個level,因此只重試16次。當然,消息重試還有一些其他的設計邏輯,在之后的文章將會進行分析。 

 

責任編輯:龐桂玉 來源: 楊建榮的學習筆記
相關推薦

2023-09-26 08:01:46

消費者TopicRocketMQ

2011-04-28 11:01:40

Android消息處理LooperHandler

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日志

2013-09-22 14:57:19

AtWood

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

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數據庫命令

2019-06-25 10:32:19

UDP編程通信

2025-06-05 05:51:33

2024-02-21 21:14:20

編程語言開發Golang

2023-12-26 18:22:05

RocketMQ延遲消息

2022-11-04 09:43:05

Java線程

2022-09-05 08:39:04

kubernetesk8s

2017-01-13 22:42:15

iosswift
點贊
收藏

51CTO技術棧公眾號

一区二区免费视频| 韩国理伦片一区二区三区在线播放 | 久久综合一区二区三区| 国产女主播喷水视频在线观看| 精品色999| 欧美成人video| 日本久久久精品视频| 日本三级在线视频| 不卡av在线网| 国产精品视频区| 久久久久亚洲av无码专区| 少妇一区二区视频| 欧美成人性战久久| 国产小视频精品| 1区2区在线| 亚洲欧洲日韩在线| 久久99国产精品99久久| 国产精品无码久久av| 99精品视频免费| 久久综合伊人77777| 在线免费观看日韩av| 国产一区二区三区免费观看在线 | 99国产精品久久| 国产日韩在线播放| xxxx.国产| 亚洲欧美日韩高清在线| 亚洲欧美日韩国产中文| 国产伦精品一区二区三区妓女下载| 中文不卡1区2区3区| 亚洲精品免费播放| 五码日韩精品一区二区三区视频| 你懂的网站在线| 午夜影院在线观看国产主播| 国产精品久久毛片| 女女同性女同一区二区三区91| 国产熟女一区二区三区四区| 久久综合九色综合欧美狠狠| 久久久亚洲国产| 成人在线观看小视频| 精品视频99| 亚洲男人天堂手机在线| 少妇激情一区二区三区视频| 日韩在线观看中文字幕| 7777精品伊人久久久大香线蕉经典版下载| 久久国产乱子伦免费精品| 欧美videosex性极品hd| 亚洲免费看黄网站| 熟女熟妇伦久久影院毛片一区二区| 国产中文字幕在线看| 99精品欧美一区| av观看久久| www.色亚洲| 国产精品一级在线| 91久久国产综合久久蜜月精品| 国产精品久久久久毛片| 卡一卡二国产精品| 国产在线观看精品一区二区三区| 自拍偷拍精品视频| 美国毛片一区二区三区| 国产精品网址在线| 在线免费观看视频网站| 久久99精品国产麻豆婷婷洗澡| 国产日韩欧美在线| 国产理论片在线观看| 国内精品伊人久久久久影院对白| 成人激情视频免费在线| 国产乱子伦精品无码码专区| 国内国产精品久久| 91精品国产综合久久久久久丝袜| 亚洲电影免费观看高清| 乱一区二区三区在线播放| 人妻偷人精品一区二区三区| 床上的激情91.| 国产一区二区免费在线观看| 涩爱av在线播放一区二区| ww久久中文字幕| 日韩免费av电影| 日韩免费啪啪| 亚洲黄色片在线观看| 青草网在线观看| 亚洲精品mv| 欧美日韩一级视频| 天天操精品视频| 国产成人精品亚洲线观看| 亚洲精品一区二区在线| 日韩av片在线免费观看| 欧美黄色一区二区| 91精品国产91久久久久久久久| 好看的av在线| 久久国产日韩欧美精品| 99精品欧美一区二区三区| 色婷婷av一区二区三| 久久久久久久久久电影| 妞干网这里只有精品| 98色花堂精品视频在线观看| 一本久久精品一区二区| 在线观看免费视频高清游戏推荐| gogo久久日韩裸体艺术| 亚洲一二三在线| 午夜精品一区二区三区视频| 99热这里只有成人精品国产| 国产精品日日摸夜夜添夜夜av| av片免费播放| 欧美激情在线看| 日韩精品一区二区免费| 亚洲精品555| 亚洲成人三级在线| 可以免费看av的网址| aⅴ色国产欧美| 亚洲a级在线观看| 国产综合视频一区二区三区免费| 亚洲午夜久久久久| 污网站在线免费| 天堂网av成人| 色综合久久88色综合天天看泰| 国产精品无码粉嫩小泬| 成人久久18免费网站麻豆| 伊人久久青草| 日韩三级影视| 日韩第一页在线| 青娱乐国产在线| 久久99最新地址| 日韩av在线电影观看| 激情视频网站在线播放色| 欧美一区二区网站| 91香蕉视频网| 久久精品人人做人人爽电影蜜月| 国产精品xxxx| 91亚洲天堂| 欧美高清性hdvideosex| 东方伊人免费在线观看| 午夜影院日韩| 精品一卡二卡三卡四卡日本乱码 | 亚洲精品小说| 国产精品免费小视频| 深夜福利在线看| 亚洲高清不卡在线| 无码人妻一区二区三区免费n鬼沢| 日韩激情一区| 国产剧情日韩欧美| 国产51人人成人人人人爽色哟哟| 黑人巨大精品欧美一区二区三区| 亚洲欧美综合视频| 国内揄拍国内精品久久| 99re在线国产| 亚洲国产精品精华素| 91精品国产综合久久精品| 秋霞欧美一区二区三区视频免费| 蜜臀久久99精品久久久画质超高清| 日本不卡一区| 日韩国产网站| 亚洲午夜色婷婷在线| 日本视频www色| 欧美国产日本视频| 热久久久久久久久| 1024精品久久久久久久久| 91免费版网站入口| www久久日com| 欧美v国产在线一区二区三区| 麻豆精品一区二区三区视频| 国产不卡在线一区| 国精产品一区一区三区视频| 欧美久久精品| 国产精品2018| 中文字幕在线观看日本| 欧美精品丝袜中出| 久久免费视频播放| 99精品视频在线免费观看| 国产精品免费观看久久| 久久高清精品| 91九色在线观看| 日本免费一区二区六区| 亚洲性视频网址| 国产美女明星三级做爰| 亚洲一区二区三区四区在线免费观看| 性久久久久久久久久久| 男女av一区三区二区色多| 亚洲美女网站18| 一区二区三区高清在线观看| 97视频在线观看免费| 国产午夜视频在线观看| 91精品午夜视频| 久久夜靖品2区| 国产欧美精品国产国产专区| 国产成年人视频网站| 激情欧美一区二区三区| 欧洲亚洲一区| 日韩一区二区三区高清在线观看| 69视频在线免费观看| 国产福利免费在线观看| 日韩欧美另类在线| 一级黄色在线视频| 亚洲欧美激情一区二区| xxxx日本免费| 国产一二精品视频| 成人在线看视频| 在线国产一区二区| 日本不卡一区二区三区视频| 一区三区自拍| 国产精品一二三在线| 国产一线二线在线观看| 中文日韩在线观看| 十八禁一区二区三区| 欧美日韩在线播放一区| 日韩欧美a级片| 亚洲欧美偷拍另类a∨色屁股| 91黄色免费视频| 国产精品一品二品| 91极品视频在线观看| 一区二区三区国产盗摄| 超碰97免费观看| 国产免费播放一区二区| 国产精品一区二区免费看| 91亚洲精品在看在线观看高清| 91精品国产色综合久久不卡98口| 国产激情视频在线| 在线播放日韩专区| 日本一卡二卡四卡精品 | 中文字幕av一区二区三区人妻少妇| 天堂资源在线中文精品| 日韩五码在线观看| 欧美日韩一区自拍| av电影一区二区三区| 国产一区二区三区天码| 国产一区免费在线| 日韩不卡在线视频| 91美女片黄在线观| 亚洲毛片在线免费| 国产精品一区二区三区久久| 亚洲最大网站| 57pao成人永久免费视频| 亚洲国产精品suv| 欧美女孩性生活视频| 波多野结衣在线观看视频| 欧美性猛交xxxx富婆弯腰| 国产成人在线免费观看视频| 亚洲一区二区三区三| 欧美色图亚洲天堂| 亚洲免费成人av| 精品99在线观看| 亚洲老司机在线| 欧美黑人性猛交xxx| 亚洲视频中文字幕| 久久噜噜色综合一区二区| 国产精品区一区二区三| 天堂在线中文视频| 日本一区二区久久| 国产日产在线观看| 中文字幕佐山爱一区二区免费| 黄色av片三级三级三级免费看| 国产农村妇女精品| 午夜黄色福利视频| 中文字幕一区二区三区精华液| 亚洲一二三在线观看| 亚洲婷婷在线视频| 亚洲国产美女视频| 亚洲香肠在线观看| 国产精品9191| 精品国产1区2区| 欧美日韩综合一区二区三区| 在线观看成人小视频| 在线观看免费观看在线| 538在线一区二区精品国产| 国产免费一区二区三区最新不卡 | 亚洲女子a中天字幕| 极品颜值美女露脸啪啪| 亚洲第一精品在线| 国产一级片毛片| 91传媒视频在线播放| 91精品国产乱码久久久久| 日韩一级成人av| 人妻精品一区一区三区蜜桃91| 精品亚洲一区二区三区| 都市激情一区| 欧美另类极品videosbest最新版本| 欧美xxxx黑人又粗又长| 2024亚洲男人天堂| 99蜜月精品久久91| 亚洲一区二区日本| 精品少妇一区| 视频在线99re| 正在播放日韩欧美一页| 干日本少妇首页| 久久精品噜噜噜成人av农村| 绯色av蜜臀vs少妇| 久久久天堂av| 欧美黄色一区二区三区| 欧美性xxxxxxx| 国产绳艺sm调教室论坛| 日韩av综合网| 黄视频网站在线| 91国内在线视频| 亚洲网站三级| 麻豆精品视频| 欧美99在线视频观看| 久久久久久久激情| 国产一区欧美二区| 黄色国产在线观看| 亚洲欧美日韩国产手机在线| 九九热精品视频在线| 91麻豆精品国产91| 精品美女视频在线观看免费软件| 久久久成人精品视频| 成人爽a毛片免费啪啪| 亚洲综合中文字幕68页| 欧美欧美黄在线二区| 男人天堂新网址| 理论电影国产精品| 中文字幕一区二区人妻在线不卡| 亚洲免费色视频| 中文字幕第一页在线播放| 亚洲精品91美女久久久久久久| 免费在线观看av网站| 国产91色在线| 麻豆精品少妇| 青青在线视频免费观看| 另类综合日韩欧美亚洲| 国产jk精品白丝av在线观看| 亚洲观看高清完整版在线观看| 一级特黄特色的免费大片视频| 亚洲精品视频在线播放| 黄页在线观看免费| 91观看网站| 欧美一区二区| 高潮一区二区三区| 日本一区二区三区高清不卡| 在线能看的av| 亚洲国产欧美一区二区丝袜黑人 | 91久久电影| 黑人粗进入欧美aaaaa| gogo大胆日本视频一区| 久久久久性色av无码一区二区| 91精品国产综合久久久久久久| 国外av在线| 国产成人福利网站| 一呦二呦三呦国产精品| 日日碰狠狠添天天爽超碰97| 成人性生交大片免费| 免费人成在线观看| 日韩视频免费观看高清完整版| 好了av在线| 国产在线精品播放| 天天射天天综合网| 中文av一区二区三区| 国产精品另类一区| 这里只有久久精品视频| 中文字幕在线日韩| 久久av影院| 在线观看国产一区| 国产在线播放一区三区四| 国产尤物在线播放| 制服丝袜在线91| 97caopor国产在线视频| 成人免费视频网站入口| 精品白丝av| 日本japanese极品少妇| 欧美色欧美亚洲高清在线视频| 头脑特工队2在线播放| 欧美亚洲另类在线| 欧美理伦片在线播放| 国产免费黄视频| 久久久久综合网| 这里只有精品国产| 久久久国产一区| 99久久免费精品国产72精品九九| 国产精品一色哟哟| av不卡在线播放| 日韩 国产 欧美| 中文字幕精品在线| 日韩成人在线看| 日本丰满少妇xxxx| 久久精品一区二区| 国产又爽又黄又嫩又猛又粗| 久久综合伊人77777| 美女呻吟一区| 手机在线免费观看毛片| 一区在线观看视频| 男人天堂网在线视频| 日韩免费高清在线观看| 国产精品久久久久无码av| 69久久精品无码一区二区| 欧美日韩国产精品专区 | www.欧美日本| 亚洲免费视频成人| 三级视频在线播放| 成人午夜黄色影院| 国产欧美高清| 久久精品亚洲a| 日韩av一区二区在线| 六九午夜精品视频| 精品无码国产一区二区三区av| 国产亚洲午夜高清国产拍精品| 91国内精品久久久| 欧美性做爰毛片| 国产精品福利在线观看播放| 日本japanese极品少妇| 51午夜精品国产| 亚洲永久av| 韩日视频在线观看| 国产精品福利影院|