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

成本低誤差小,攜程基于 Kafka 的 Serverless 延遲隊列的實踐

開發 新聞
由于該實現方案完全是基于 Serverless 的方式實現的,所以維護成本非常低。

作者簡介

Pin,關注 RPC、Service Mesh、Serverless 等云原生技術。

一、背景

隨著上云項目的不斷推進,大量的應用需要部署到 aws 上,其中有很多應用都依賴延遲隊列的功能。而在 aws 上,我們選擇以 Kafka 作為消息隊列,但是 Kafka 本身不支持延遲隊列,這就需要思考如何基于 Kafka 來實現延遲隊列。

二、需求

統計了一下所有需要使用到延遲隊列的場景,有以下幾大特點:

  • 延遲時間不固定。有的 topic 需要支持 5 分鐘的延遲,有的卻要求支持 7 天的延遲。
  • 延遲消息數量小。所有的場景中涉及到的每天延遲消息的數量不超過 1 億條,每條消息的大小不超過 1MB。
  • 延遲消息不能丟失,可以不保證有序。
  • 延遲誤差小。延遲誤差是指實際消費消息的時間和希望消費消息之間的時間差值。根據統計的業務場景來看,要求延遲誤差在 2s 以內。
  • 生產延遲消息的峰值比較高。很多情況下,業務會一次性創建 1000 萬條延遲消息,并且這些延遲消息的延遲時長都是一致的。

三、目標

由于實現延遲隊列的方式有很多,我們在滿足需求的前提下,制定了幾個目標:云上成本低、運維成本低、開發成本低、穩定性高和延遲誤差小。

四、產品選型

在 aws 上支持消息隊列的產品有 RabbitMQ、Apache ActiveMQ 和 SQS。其中 RabbitMQ 和 Apache ActiveMQ aws 主要是托管其安裝部署,并非是以 Serverless 的方式對外提供服務。另外,我們當前已經選擇使用 Kafka 作為消息隊列,若僅僅為了滿足延遲隊列的功能而去更換消息隊列,成本顯然是巨大的。

除此之外,aws 還提供了 SQS 來支持延遲隊列,雖然 SQS 是 Serverless 的,但是 SQS 有他自身的局限性:SQS 最多支持 15 分鐘以內的延遲,明顯無法滿足我們的需求。

可見,僅僅基于云上已有的產品已無法滿足我們的需求,基于這個原因,我們開始調研延時消息的實現方案,看看能否通過少量的開發來實現我們的需求。

五、方案調研

業界實現延時隊列功能的方案比較多,我們對其進行了簡單的分析,具體如下:

5.1 RabbitMQ

RabbitMQ 是基于 TTL+ 死信隊列的方式來實現的。具體來說,通過設置消息的 TTL,當達到 TTL 時消息還沒有被消費,此時會投遞到死信隊列。TTL 分兩種:

  • Queue 級別的 TTL:所有消息統一的 TTL
  • Message 級別的 TTL:每條消息可以是不同的 TTL,但是存在隊頭阻塞問題

該方案的優點是實現簡單,但是延遲誤差不確定。

5.2 Apache ActiveMQ

Apache ActiveMQ 是基于定時調度的方式來實現的。具體來說,配置延遲時間或者 cron 表達式表示消息的投遞策略,基于 Java 的 Timer 實現,將消息分級存儲在文件和內存中。

該方案的優點是實現簡單,延遲誤差可控,但是可能會占用大量內存。

5.3 RocketMQ

RocketMQ 是基于定時調度+延遲等級的方式來實現的。具體來說,將延時消息發送到指定的延時等級隊列(一共有 18 個等級),然后通過一個定時器進行輪詢這些 ConsumeQueue 實現延時的效果。具體實現如下:

  • 修改消息 topic 名稱和隊列信息投遞到對應等級的延時消息的 ConsumeQueue 中
  • ScheduleMessageService消費ConsumeQueue中的消息再重新投遞到 CommitLog 中
  • 將 CommitLog 中的消息投遞到目標 topic 中,消費者消費目標 topic 中的消息

該方案的優點是延遲誤差可控,但是實現復雜。

5.4 Redis

基于 Redis 實現延遲隊列的方式有很多,在這里簡單描述兩種:

1)定時輪詢

該方案的大致步驟如下:

  • 將消息的延時時間戳作為 zset 的 key,消息的 ID 作為 zset 的 value
  • 消息 ID 作為 key,消息體序列化成 String 作為 value 存儲在 Redis 中
  • 定時輪詢 zset,大于當前時間則投遞到 Redis 的 List 中供消費者消費

2)Key 過期監聽器

每條消息設置一個過期時間,監聽過期事件然后將消息投遞到 target topic。

基于 Redis 實現延時隊列的優點是實現簡單,但是都可能存在丟消息的情況,并且存儲成本高。

六、實現方案

既然使用單一的云上產品不能滿足我們的需求,那就只能考慮通過少量的開發并結合云上產品的特性來實現基于 Kafka 的延遲隊列的功能。具體的實現方案有如下幾種:

6.1 RabbitMQ 或 Apache ActiveMQ

RabbitMQ 或者 Apache ActiveMQ 都是 aws 上支持的產品,從功能層面來看是可以滿足需求。當前的消息隊列是基于 Kafka 實現的,如果再結合 RabbitMQ 或者 Apache ActiveMQ 來實現延遲隊列的功能,主要面臨的問題是:缺少對 RabbitMQ 或者 Apache ActiveMQ 相關的技術儲備,由于 aws 上對 RabbitMQ 或者 Apache ActiveMQ 僅僅只是部署層面的托管,當出現問題時,是需要有研發人員自己去 troubleshooting 的。所以,該方案就不考慮了。

6.2 基于 SQS 的多級隊列

既然 SQS 已經支持 15 分鐘內的延時隊列,那么如果要實現更長時間的延遲隊列是不是可以考慮通過多級延遲隊列來實現?具體實現方案如下:

  1. 在延遲消息中增加一個字段 times 用來表示當前是第幾輪(借鑒時間輪算法的思路)。
  2. 如果延遲消息的延遲時間小于 15 分鐘,將延遲消息的 times 設置為 0,直接投遞到 SQS 中。
  3. 如果延遲消息的延遲時間大于 15 分鐘,計算一下 times 的值(延遲時間/15 分鐘),然后直接投遞到 SQS 中。
  4. 如果 Consumer 從 SQS 中消費到了一個延遲消息且 times 大于 0,則將 times 的值減去 1,再次投遞到 SQS 中。如此反復,直到 times 為 0。
  5. 如果 Consumer 從 SQS 中消費到了一個延遲消息且 times 為 0,則表示該消息已經達到了延遲時間,則 Consumer 會直接將該消息投遞到對應的目標 topic。

這種方案雖然能夠實現延遲隊列的功能,且 SQS 本身也是 Serverless 的,維護成本也比較低。

但是我們調研了一下 SQS 的計費標準發現,SQS 主要是根據消息數量來收費的。這樣一來,如果延遲時間越長,消息數量會被放大的越嚴重。而我們實際業務中延遲時間在 15 分鐘以內的沒有,一般是 1 小時到 7 天,所以這種方案不可行。

6.3 基于 SQS 和定時調度策略

使用基于 SQS 的多級隊列的方式最大的問題是云上的成本問題,更具體一點是云上的存儲成本問題。因為該方案將所有的延遲消息都存儲在 SQS 中,這是導致費用增加的最主要原因。既然如此,那我們是不是可以考慮將大于 15 分鐘延遲時間的消息寫入到一個成本低的存儲上,然后在時間延遲時間小于 15 分鐘的時候將其查詢出來投遞到 SQS 中即可。這樣一來,延遲時間的長短不會對 SQS 的費用有影響,僅僅只需要考慮如何選擇一個存儲成本低、讀寫方便的 Serverless 產品作為延遲消息的存儲即可。

基于這一思路,設計了一個基于 SQS 和定時調度策略的實現方案:

圖片

具體流程如下:

  1. 生產者 Producers 生產的正常消息直接投遞到 Kafka 的目標 topic,如果是延遲消息投遞到 Kafka 的一個延遲消息的 Delay Message Topic 中。
  2. Consumer 消費 Delay Message Topic 中的消息,如果該消息的延遲時間小于 15 分鐘,直接投遞到 SQS(Delay Queue)中。如果消息的延遲時間大于 15 分鐘,直接將消息寫入到 Message Store 中。
  3. Scheduler 會定時掃描 Message Store 中的消息,如果發現延遲時間小于 15 分鐘,則直接投遞到 SQS(Delay Queue)中,Scheculer 是通過 Event Bridge 來觸發的。
  4. Emitter 會消費 SQS(Delay Queue)中的消息,并將該消息投遞到目標 topic 中。

整個流程不算復雜,里面涉及到的 aws 服務都是 Serverless 的,但是涉及的服務太多以后 troubleshooting 就會比較復雜。

基于以上問題,我們對該方案的實進行了改進和簡化,具體如下:

圖片

具體流程如下:

  1. 生產者 Producers 生產的正常消息直接投遞到 Kafka 的目標 topic,如果是延遲消息投遞到 Kafka 的一個延遲消息的 Delay Message Topic 中。
  2. Service 消費 Delay Message Topic 中的消息,如果該消息的延遲時間小于 15 分鐘,直接投遞到SQS(Delay Queue)中。如果消息的延遲時間大于 15 分鐘,直接將消息寫入到 Message Store 中。
  3. Service 會定時掃描 Message Store 中的消息,如果發現延遲時間小于 15 分鐘,則直接投遞到 SQS(Delay Queue)中。
  4. Service 會消費 SQS(Delay Queue)中的消息,并將該消息投遞到目標 topic 中。

簡化后的方案將 Consumer、Emitter 和 Scheduler 的邏輯都集中在 Service 這個服務中,Service 服務是集群部署的,這種方案所有的邏輯都在 Service 這個服務中,在 troubleshooting 時相對來說要方便一些。整體實現方案的大方向確定好以后,還需要細化以下幾個問題:

1)消息如何存儲

我們可以看到 Message Store的主要功能是存儲延遲時間大于 15 分鐘的延遲消息, 并供 Scheduler 進行查詢,查詢的時候是根據時間來查詢的。支持 Serverless 方式存儲的服務也比較多,經過調研最后選擇 DynamoDB。

DynamoDB 中的 partition key 是延遲時間,sorted key 選擇 message id,這樣可以保證通過 partition key 和 sorted key 能夠唯一定位到一條消息,不會出現沖突。同時,在查詢的時候只需要根據 partition key 就可以查詢出該時間片段內的所有消息,也不會出現熱點或者 partition 不均勻的問題。

假設 partition key 為 1677400776(是 2023-02-26 16:39:35 的時間戳,精確到秒),則該 partition key 中對應的所有消息都是延遲時間從 2023-02-26 16:39:35 到 2023-02-26 16:39:36 之間的消息。因為每個消息都有唯一的 message id,所以將 sorted key 設置為 message id 就不會導致消息沖突的問題。Scheduler 在查詢的時候只需要傳入需要查詢的時間戳就可以拉取該時間段內所有的消息,如果沒有查詢到,則表示該時間段內沒有延遲消息。

同時,對于 DynamoDB 中的消息也設置了 TTL 用來自動刪除數據的,設置的 TTL 時間比延遲時間大 24 小時,主要是方便 troubleshooting 的。當 DynamoDB 中的延遲消息被投遞到 SQS 以后,會調用 API 去刪除該消息。DynamoDB 中消息的數據結構還包括 topic、消息體等信息。

2)單點問題

單點問題主要是因為對于存儲在 DynomaDB 中大于 15 分鐘的延遲消息進行掃描的時候,接收到掃描通知的 Scheduler 出現了問題,則該時間段的消息沒有被投遞到 SQS中,從而導致消息丟失。現在 Scheduler 的功能都集成在 Service 服務中,而 Service 服務是集群部署,所以 Scheduler 不存在單點的問題。

但是需要解決另外一個問題:如何保證集群中只有一個 Scheduler 掃描 DynamoDB 中的數據,并且當 Scheduler 出現了問題以后,集群中其他 Scheduler 也可以繼續接著執行?

為了解決這個問題:我們使用了 SQS 的 FIFO 隊列。SQS 支持兩種隊列,一種是 Standard 對列,一種是 FIFO 隊列。FIFO 隊列可以嚴格保證消息的有序,同時支持消息的可見性,也就是說在一段時間內該消息只能有一個消費者可見,其他消費者無法訪問。同時,SQS 的 FIFO 隊列還支持去重的功能。基于 SQS 的 FIFI 隊列的這些特性,解決單點問題就比較容易了。具體實現方案如下:

  1. 在 Service 服務中啟動一個 Timer 定時向 SQS 的 FIFO 隊列投遞通知消息,一分鐘投遞一次。通知消息的消息體是當前時間的時間戳,精度到分鐘。這樣即使有 n 個 Timer 在同一分鐘內向 SQS 的 FIFO 隊列投遞 n 次消息,也只會有一條消息被成功投遞到 SQS 的 FIFO 隊列中,n-1 條消息被 SQS 的 FIFO 隊列的去重功能過濾掉了。
  2. 投遞到 SQS 的 FIFO 隊列中的可見性設置為 5分鐘(可以配置)。可以保證在 5 分鐘內只有一個 Scheduler 可以消費到通知消息,如果該 Scheduler 出現了故障,后續的其他 Scheduler 也可以接著繼續消費。當 Scheduler 消費到通知消息時,會根據消息內容轉換成時間戳,并在 DynamoDB 中查詢這一時間戳范圍內的所有消息,修改消息的延遲時間,投遞到 SQS 的 Standard 隊列中,最后刪除 SQS 的 FIFO 隊列中的這一條通知消息。

基于上面的方案,能夠很好的解決單點問題。

3)消息丟失問題

因為 Timer 和 Schduler 都在 Service 服務中,都是集群問題,不存在單點問題。并且,SQS 的 FIFO 隊列能夠保證消息嚴格有序,所以不存在消息丟失的問題。唯一可能存在的問題是,因為消息量大積壓導致的消息延遲過長。

4)如何查詢延遲消息

Scheduler 查詢的消息要滿足該消息的延遲時間小于 15 分鐘,所以在接收到通知消息并轉換成對應的時間戳以后,查詢當前時間戳 +14 分鐘(延遲消息不能超過 15 分鐘)的消息即可。

5)如何部署 Service 服務

對于 Service 服務,我們采用了 ECS+Fargate 的方式來部署。整個代碼的部署都是通過 Terraform 腳本來創建 Code Pipeline、DynamoDB、SQS 和 ECS 等資源實現的,所有的資源都是通過代碼來實現的,整個部署方案的設計全部都是基于 gitOps 的思想。

經過多以上方案的綜合評估,最后我們選擇基于 SQS 和定時調度策略的方案來實現延遲消息。

6.4 性能優化

以上方案在實踐的過程中,做了很多優化,大致可以歸納成以下幾點:

1)消息積壓

由于需要處理的延遲消息會因為消費能力不足的情況導致消息積壓的問題。優化這一問題主要從以下幾個方面入手:

  • Delay Message Topic 的 partition 設置成 64 個。提高 Kafka 消費的消費能力可以通過增加 consumer 來實現,但是前提是要保證 partition 的數量大于等于 consumer 的數量。
  • 降低 Service 的服務配置,增加 Service 服務的副本數。Service 集群消費 Delay Message Topic 中的消息,副本數越多,消費能力越強。

2)DynamoDB 中 WCU 和 RCU

DynamoDB 的費用有很大一部分是通過 WCU 和 RCU 來統計的。WCU 是指單位時間內消息寫入的數量,RCU 是指單位時間內消息讀取的數量。如果單位時間內寫入消息的數量超過了 WCU 的限制會導致消息寫入失敗,同理也會導致讀取消息失敗。

如果將 WCU 和 RCU 都設置成峰值肯定不會導致讀寫失敗的問題,但是會產生巨大的成本浪費。為此,我們將 WCU 和 RCU 設置成動態擴縮容的方式。在擴容期間如果產生失敗,則進行重試。經過相關參數的優化,現在已經可以達到一個最佳現狀。

3)ECS 擴縮容設置

ECS 中最小的運行單元是 task,對于每一個 task 要求擴容要快,縮容要緩慢。task 快速擴容遇到的最大的問題是,拉起 Service 的耗時比較長。對于 Service 服務我們采用 golang 來實現,擴一個 task 能夠基本上可以在 8s 內完成。擴縮容是基于 CPU 的使用峰值來設置的,每次擴容會擴 4 個 task,每次所容會縮 1 個 task。

4)消息平滑處理

由于寫入 Delay Message Topic 中的消息峰值可能會比較大,如果快速消費這些消息,會導致后續對 DynamoDB 的讀寫壓力比較大。因此,在消費 Kafka 的 Delay Message Topic 中的消息時,會將控制每個 Service 消費消息的數量。盡管有多個 Service 會同時消費,但是對于單個 Service 來說,寫入消息的數量較少,對 DynamoDB 來說,每一次的寫入比較平穩,并非一次性寫入大量的數據,從而寫入失敗的概率會小很多。

6.5 實踐效果

目前已經在生產環境穩定運行了 6 個月,各項指標都比較健康,拉取了最近 4 周的數據。

1)延遲消息成功率

圖片

如上圖所示,延遲誤差在 2 秒以內的延遲消息成功率基本上是 100%。

2)延遲消息的數量

圖片

如果上圖所示,延遲消息在 5 分鐘內的峰值達到 15 萬,也就是峰值每秒處理 500 個延遲消息。

3)DynamoDB 性能指標

圖片

從 PutItem ThrottledRequests 這個指標可以看出,通過 DynamoDB 寫入消息沒有發生寫入失敗的情況。從 QueryThrottledRequests 這個指標可以看出,通過 DynamoDB 查詢消息也沒有發生查詢失敗的情況。從 QueryReturnedItemCount 指標可以看出,延遲消息的峰值是 5 分鐘內 3350 條,每秒低于 60 條。這是因為我們在 Service 中對寫入消息進行了緩沖,從而降低了并發讀寫壓力。

4)Kafka 消息積壓

圖片

如上圖所示,Kafka 在 5 分鐘內消息積壓的峰值是 6 萬,積壓的消息都能很快被消費掉。

5)Timer 性能指標

圖片

Timer 會每分鐘向 SQS 的 FIFO 隊列中投遞一個消息,消息的數量與 Service 的副本數相同。從上圖可以看出,5 分鐘內最多投遞了 300 個消息(因為 Service 的副本數最大為 64)。但是最后接收的消息是5分鐘內僅僅接收了 5 個消息,也就是 1 分鐘接收 1 條消息。

七、總結

由于該實現方案完全是基于 Serverless 的方式實現的,所以維護成本非常低。盡管開發起來有些復雜,但這是一次性的成本投入。從近幾個月的數據來看,云上的使用成本大約每個月不超過 200 美元,誤差延遲比較小,到目前為止整體運行起來比較穩定。

責任編輯:張燕妮 來源: 攜程技術
相關推薦

2022-05-19 17:50:31

bookie集群延遲消息存儲服務

2023-11-06 09:56:10

研究代碼

2023-01-13 08:35:29

告警降噪系統

2016-09-04 15:14:09

攜程實時數據數據平臺

2022-06-27 09:36:29

攜程度假GraphQL多端開發

2011-05-11 12:19:41

應用交付服務器

2022-06-27 09:42:55

攜程金融nebula圖平臺

2023-04-14 10:29:24

小程序實踐

2019-09-22 19:57:38

極簡代碼開發代碼

2023-06-06 11:49:24

2025-01-03 14:33:41

2023-11-17 10:03:45

攜程開源

2023-06-28 14:01:13

攜程實踐

2023-07-07 12:26:39

攜程開發

2022-08-20 07:46:03

Dynamo攜程數據庫

2009-08-28 09:33:03

云計算成本

2022-05-26 10:25:19

PythonWeb框架

2022-07-15 12:58:02

鴻蒙攜程華為

2023-11-24 09:44:07

數據攜程

2022-06-17 10:44:49

實體鏈接系統旅游AI知識圖譜攜程
點贊
收藏

51CTO技術棧公眾號

欧美一区二区在线观看视频| 农村老熟妇乱子伦视频| 亚洲日本天堂| 国产精品福利一区二区| 97netav| 国产成人无码精品久在线观看| 亚洲人成精品久久久| 3atv一区二区三区| 91专区在线观看| 欧美午夜电影一区二区三区| 国产成人精品综合在线观看| 欧美一级电影久久| 国产高潮国产高潮久久久91| 亚洲精品进入| 精品人伦一区二区色婷婷| 91视频免费版污| japanese色国产在线看视频| 国产精品网友自拍| 久久综合入口| 亚洲AV无码成人片在线观看| 琪琪一区二区三区| 97av视频在线| 欧美日韩成人免费观看| 日韩综合在线| 亚洲九九九在线观看| 免费高清视频在线观看| 亚洲成人va| 精品久久中文字幕| 久久手机在线视频| 色网站在线看| 国产欧美中文在线| 久久免费一区| 国产香蕉在线观看| 国产精品一区二区在线看| 国产精品wwww| 在线永久看片免费的视频| 亚洲啪啪91| 欧美黄色片视频| 加勒比婷婷色综合久久| 国产精品成人a在线观看| 在线播放日韩欧美| 无码人妻精品一区二区中文| 日韩精品丝袜美腿| 亚洲激情免费观看| 国产性生活毛片| 黄色成人美女网站| 亚洲第一av网| 国产麻豆剧传媒精品国产av| 综合视频一区| 亚洲国产成人一区| 国产精品福利导航| 网曝91综合精品门事件在线| 亚洲国产毛片完整版| 挪威xxxx性hd极品| 国产伦精品一区二区三区在线播放 | 热久久久久久| 欧美日本视频在线| 性鲍视频在线观看| 一区二区日韩| 亚洲成人精品视频在线观看| 国产精品成人无码专区| 亚洲va久久| 亚洲欧洲在线观看| 东京热无码av男人的天堂| 手机在线电影一区| 久久五月情影视| 亚洲熟女www一区二区三区| 午夜精品亚洲| 午夜精品三级视频福利| 欧美国产成人精品一区二区三区| 久久不射网站| 国产精品久久精品| 国产精品一区二区av白丝下载 | 久久视频一区| 国产欧美日韩专区发布| www久久久com| 91视频91自| 亚洲国产一区二区三区在线| 精品视频在线一区二区| 亚洲香肠在线观看| 欧美三级午夜理伦三级| 狠狠久久综合| 精品久久久网站| 欧美bbbbb性bbbbb视频| 久久久综合色| 久久久人成影片一区二区三区观看 | 国产免费成人| 国产在线拍偷自揄拍精品| 国产免费叼嘿网站免费| 成人福利视频在线看| 日本在线高清视频一区| 四虎av在线| 欧美综合一区二区三区| 国产调教打屁股xxxx网站| 日韩精品免费一区二区夜夜嗨| 最近2019免费中文字幕视频三| 免费一级片视频| 日韩国产欧美在线播放| julia一区二区中文久久94| 日本私人网站在线观看| 亚洲摸摸操操av| 免费无码国产v片在线观看| 亚洲国产综合在线观看| 日韩精品有码在线观看| 国产一二三区精品| 久久精品一区二区三区中文字幕| 51国偷自产一区二区三区的来源| 免费a在线观看| 一区二区三区 在线观看视频| 男人的天堂99| 澳门精品久久国产| 久久深夜福利免费观看| 自拍偷拍18p| 成人免费毛片片v| 在线无限看免费粉色视频| 吞精囗交69激情欧美| 欧美成人伊人久久综合网| 永久免费未视频| 久久综合影视| 欧美二区在线| av在线不卡免费| 日韩欧美一区二区视频| 在线视频这里只有精品| 三级一区在线视频先锋| 91视频在线免费观看| 老司机精品影院| 欧美色大人视频| 国产精品扒开腿做爽爽| 国产亚洲激情| 国内一区在线| 暧暧视频在线免费观看| 日韩欧美中文字幕一区| 日本少妇xxxxx| 首页亚洲欧美制服丝腿| 久久伦理网站| 永久免费毛片在线播放| 亚洲激情久久久| 国产成人精品a视频一区| 懂色中文一区二区在线播放| 日本成人在线不卡| 这里视频有精品| 久久免费福利视频| 四虎永久在线精品免费网址| 亚洲电影第三页| 亚洲av成人无码一二三在线观看| 在线观看不卡| 国产日韩精品久久| 亚洲三级欧美| 一区二区三区视频观看| 免费黄色小视频在线观看| 久久蜜臀中文字幕| 97视频在线免费播放| 欧美美女在线| 国产精品中文字幕在线| 米奇777四色精品人人爽| 777午夜精品免费视频| 国产这里有精品| 成人h版在线观看| 国产网站免费在线观看| 美女久久久久| 国产精品久久在线观看| 黄色在线观看网站| 欧美不卡一区二区| 一区二区三区视频免费看| 久久午夜羞羞影院免费观看| 国产一区视频免费观看| 欧美freesextv| www.久久艹| 忘忧草在线日韩www影院| 伊人青青综合网站| 国产精品一区二区三区在线免费观看 | 男人操女人的视频在线观看欧美 | 日本在线观看www| 欧美一区日韩一区| 国产性xxxx高清| 国产区在线观看成人精品| 日本国产一级片| 欧美视频亚洲视频| 日本一区免费看| vam成人资源在线观看| 久久免费精品视频| 97视频在线观看网站| 日韩免费性生活视频播放| 成人免费看片98欧美| 国产精品久线在线观看| jjzzjjzz欧美69巨大| 日韩精品一二区| 国产精品视频一二三四区| 亚洲8888| 3d精品h动漫啪啪一区二区| 欧洲亚洲两性| 欧美裸体xxxx极品少妇| 国产区高清在线| 欧美成人a∨高清免费观看| 羞羞色院91蜜桃| 亚洲国产精品久久久男人的天堂| 欧美丰满美乳xxⅹ高潮www| 国产精品538一区二区在线| 一本久道中文无码字幕av| 欧美成人有码| 亚洲第一综合| 亚洲国产欧美日韩在线观看第一区| 国产欧美亚洲精品| 91精品论坛| 欧美激情欧美激情在线五月| 不卡在线视频| 日韩精品中文在线观看| 国产av一区二区三区精品| 欧美在线播放高清精品| 国产污视频在线看| 亚洲免费观看高清| 自拍偷拍第9页| 国产三级一区二区| 亚洲精品在线视频免费观看| 国产一区二区三区久久久 | 国产尤物一区二区| 男女视频一区二区三区| 99综合精品| 日韩av在线播放不卡| 亚洲欧美偷拍自拍| 尤物一区二区三区| 日韩精品水蜜桃| 日本在线观看不卡| 欧美禁忌电影网| 免费看成人av| 欧美日日夜夜| 好吊色欧美一区二区三区四区| 国产一区精品二区| 国产精自产拍久久久久久| 日韩电影免费观| 国产91久久婷婷一区二区| 日本蜜桃在线观看视频| 久久免费视频这里只有精品| 国产乱码在线| 久久男人av资源网站| 免费在线看电影| 欧美黑人性视频| tube8在线hd| 欧美激情免费视频| 国产精品偷拍| 国内精久久久久久久久久人| 98色花堂精品视频在线观看| 久久久久久久999精品视频| 美女尤物在线视频| 午夜精品一区二区三区av| 8x8ⅹ拨牐拨牐拨牐在线观看| 久久久久久中文字幕| 国内高清免费在线视频| 欧美精品成人91久久久久久久| 日本高清在线观看| 国内成人精品一区| 亚洲深夜视频| 国产精品一区专区欧美日韩| 欧美伊人亚洲伊人色综合动图| 成人啪啪免费看| 99国产精品久久一区二区三区| 成人自拍网站| 日韩精品社区| 亚洲国产一区二区三区在线播| 婷婷激情综合| 美脚丝袜脚交一区二区| 亚洲免费成人| 一区二区三区 欧美| 韩国av一区二区| 美女黄色一级视频| 91女神在线视频| www.涩涩爱| 尤物av一区二区| 日韩精品在线不卡| 欧美午夜精品久久久| 国产乱淫av片免费| 亚洲国产成人久久| shkd中文字幕久久在线观看| 免费91在线视频| 蜜臀久久精品| 国产日韩专区在线| 1204国产成人精品视频| 日本免费高清一区二区| 中文字幕一区二区三区在线视频 | 神马午夜伦理影院| 国产精品人人爽人人做我的可爱| 熟女人妇 成熟妇女系列视频| 激情亚洲综合在线| 国产麻豆xxxvideo实拍| 亚洲国产精品激情在线观看| 精品视频一区二区在线观看| 欧洲精品中文字幕| 亚洲精品一区二区口爆| 亚洲无线码在线一区观看| 青草在线视频| 国产精品九九九| 国产91精品入| 久久久人人人| 免费黄视频在线观看| 国产午夜久久久久| 黄色小说在线观看视频| 欧美色涩在线第一页| 人妻中文字幕一区| 久热精品在线视频| 色老太综合网| 精品无码久久久久国产| 99成人在线视频| 超碰网在线观看| 成人午夜av电影| 国产黄色录像片| 一本久久精品一区二区| 亚洲欧美黄色片| 最新国产成人av网站网址麻豆| 免费看男女www网站入口在线 | 国产黄色av网站| 在线观看视频亚洲| 中文字幕在线免费观看视频| 国产精品手机在线| 中文无码久久精品| 色播五月综合网| 国产欧美日韩中文久久| 亚洲日本韩国在线| 欧美成人免费网站| 国产高清一区二区三区视频 | 久久av综合| 18禁网站免费无遮挡无码中文| 国产综合色在线| xxxxx99| 91国产丝袜在线播放| 欧美女v视频| 5252色成人免费视频| 国产精品视屏| 欧美一级免费播放| 高清不卡在线观看av| 国产大片免费看| 在线观看91av| 看黄网站在线| 成人妇女淫片aaaa视频| 久久人人88| 午夜免费看毛片| 国产精品久久久久国产精品日日| 最新在线中文字幕| 国产亚洲综合久久| 福利一区二区三区视频在线观看 | 久久久久亚洲av无码专区桃色| 午夜精品久久久久久久久| 欧美一级做性受免费大片免费 | 亚洲不卡系列| 日韩欧美精品一区二区| 日韩高清在线不卡| 日本美女bbw| 欧美猛男超大videosgay| 男人天堂久久久| 91传媒视频免费| 欧美涩涩视频| 日韩成人av一区二区| 黑人精品xxx一区一二区| 男人天堂网在线观看| 国产大片精品免费永久看nba| 成人在线免费视频观看| 亚洲av无日韩毛片久久| 依依成人精品视频| 色香蕉在线视频| 日韩美女av在线免费观看| 精品国产乱码久久久久久蜜坠欲下 | 无码任你躁久久久久久久| 国产一区二区三区免费视频| 日本成人在线网站| 久久超碰97人人做人人爱| 国语对白在线播放| 亚洲国产成人久久综合| 亚洲承认视频| 三级在线免费观看| www.日韩精品| wwwwww在线观看| 久久69精品久久久久久久电影好| 美女福利一区| www.se五月| 亚洲高清三级视频| 黄色av网址在线免费观看| 91香蕉嫩草影院入口| 中文精品视频| 一本色道久久88| 精品对白一区国产伦| 五月激情久久| 996这里只有精品| 99久久精品免费看国产免费软件| 波多野结衣影片| 欧美激情图片区| 成人精品天堂一区二区三区| 免费国偷自产拍精品视频| 精品免费在线观看| 日本电影全部在线观看网站视频 | 亚洲 精品 综合 精品 自拍| 国产精品99一区| 国产一区久久| 亚洲一二三精品| 精品美女在线播放| 国产成人亚洲一区二区三区| 蜜臀av无码一区二区三区| 亚洲国产精品成人综合| 性xxxx视频播放免费| 成人激情综合网| 三级在线观看一区二区| 精品一区免费观看|