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

別再找了,關于延時關閉訂單,這里有10種方案

開發 前端
DailyMart是一個基于 DDD 和Spring Cloud Alibaba的微服務商城系統,采用SpringBoot3.x以及JDK17。旨在為開發者提供集成式的學習體驗,并將其無縫地應用于實際項目中。

大家好,我是飄渺。今天繼續更新DDD&微服務專欄,本篇主要與大家探討一下在Dailymart中如何定時關閉未支付的訂單。

概述

之前的文章提及過,在DailyMart項目中,我們采用了預扣模式進行庫存扣減。預扣模式的核心思想是在用戶下單時提前扣減庫存,在規定時間內完成支付,否則系統將釋放預扣的庫存。

這種模式的應用需要確保及時關閉未支付訂單并釋放庫存,以避免商家出現庫存不足導致少賣的問題。在系統開發中,類似的場景也有很多,例如到期自動收貨、超時自動退款、下單后自動發送短信等。

本文旨在從這類業務問題出發,深入探討可行的技術方案、實現細節,以及相關方案的優缺點。最后,將回顧DailyMart是如何解決這一問題的。由于篇幅有限,本文將主要聚焦于方案的闡述,而不涉及具體的代碼實現。

一、定時任務

定時任務關閉訂單是一個較為直觀的方案,很多小型項目均是基于此方案實現。

具體實現是通過調度平臺執行定時任務,掃描所有即將到期的訂單并執行關單動作。這種方案的優勢在于簡單易實現,可基于Timer、ScheduledThreadPoolExecutor,或像xxl-job這類調度框架來實現。然而,此方案會存在以下幾個問題:

1、時間不精準 :

定時任務基于固定的頻率或時間執行,可能導致一些訂單已經超時,但定時任務尚未觸發,使得實際關閉時間延遲。

2、無法處理大訂單量:

定時任務將關閉操作集中在一段時間內,當訂單量較大時,任務執行時間可能較長,延遲訂單掃描和關閉時間。

3、對數據庫造成壓力:

定時任務集中掃描數據庫表,可能在短時間內占用大量數據庫IO,若未進行良好隔離,可能影響線上正常業務。

4、分庫分表問題:

在訂單系統中,一旦訂單量大就可能會考慮分庫分表,而在分庫分表中執行全表掃描,這是一個極不推薦的做法。

綜上,定時任務的方案,適合于對時間精確度要求不高、并且業務量不是很大的場景中。如果對時間精度要求比較高,并且業務量很大的話,這種方案不適用。

二、JDK自帶的延遲隊列

利用JDK自帶的DelayQueue可直接實現延時隊列。

DelayQueue是一個無界的BlockingQueue,用于存放實現了Delayed接口的對象,這些對象只能在到期時才能被取出。通過延遲隊列,可以實現訂單的延遲關閉。

具體實現步驟為:用戶創建訂單時,將訂單加入DelayQueue;隨后,需要一個常駐任務從隊列中取出超時的訂單并執行關單操作,然后將其從隊列中移除。

這一方案需要一個線程來循環從隊列中取出訂單,通常使用while(true)確保任務持續執行并及時處理超時訂單。該方案的優勢在于簡單易實現,無需依賴第三方框架和類庫,原生支持于JDK。不過,這一方案的缺點也很明顯:

首先,基于DelayQueue需要將訂單存放其中,當訂單量過大時,可能引發OOM問題。

此外,DelayQueue基于JVM內存,機器重啟會導致數據丟失,這就使得需要搭配數據庫持久化來配合解決,并且現在很多應用都會基于集群部署,多個實例上的多個DelayQueue又無法很好的協作配合。

因此,基于JDK的DelayQueue方案僅適用于單機場景和數據量不大的情況,不建議在涉及分布式場景中使用。

三、Netty的時間輪

一種類似于前文提到的JDK自帶DelayQueue的解決方案是基于時間輪的實現。

盡管DelayQueue的插入和刪除操作的平均時間復雜度已經相當不錯(O(nlog(n)),但時間輪方案可以將這兩個操作的時間復雜度降低至O(1)。時間輪可被視為一種環形結構,分割為多個時間槽,每個槽表示一個時間段,其中可以存放多個任務。采用鏈表結構保存每個時間槽中所有到期的任務。隨著時間的推移,時間輪的時針逐漸移動,執行每個槽中所有到期的任務。

圖片圖片

利用Netty的HashedWheelTimer,我們能夠快速實現一個時間輪,這種方式和DelayQueue類似,也存在一些缺點,例如基于內存、集群擴展不夠靈活、內存限制等。然而,相對于DelayQueue,時間輪方案在效率上更具優勢,任務觸發的延遲更低,并且代碼實現更為精簡。

因此,基于Netty的時間輪方案相對于基于JDK的DelayQueue更為高效、實現更為簡單。然而,同樣地,它只適用于單機場景和數據量不大的情況,不建議在涉及分布式場景中使用。

四、Kafka的時間輪

既然基于Netty的時間輪存在一些問題,那么有沒有其他的時間輪的實現呢?還真有的,那就是Kafka的時間輪,Kafka內部有很多延時性的操作,如延時生產,延時拉取,延時數據刪除等,這些延時功能由內部的延時操作管理器來做專門的處理,其底層是采用時間輪實現的。圖片 而且,為了解決有一些時間跨度大的延時任務,Kafka 還引入了層級時間輪,能更好控制時間粒度,可以應對更加復雜的定時任務處理場景;Kafka 中的時間輪的實現是 TimingWheel 類,位于 kafka.utils.timer 包中。基于Kafka的時間輪同樣可以得到O(1)時間復雜度,性能上還是不錯的。基于Kafka的時間輪的實現方式,在實現方式上有點復雜,需要依賴kafka,但是他的穩定性和性能都要更高一些,而且適合用在分布式場景中。

既然在基于Netty的時間輪中存在一些問題,是否有其他可行的時間輪實現呢?確實存在一種備選方案,即Kafka的時間輪。在Kafka內部,許多操作需要延時處理,例如延時生產、延時拉取和延時數據刪除等。這些延時功能由內部的延時操作管理器專門處理,其底層采用了時間輪的實現。

特別值得一提的是,為了有效處理一些時間跨度較大的延時任務,Kafka引入了層級時間輪,該設計更靈活地控制時間粒度,以適應更為復雜的定時任務處理場景。Kafka中的時間輪實現由TimingWheel類完成,位于kafka.utils.timer包中。基于Kafka的時間輪同樣能夠實現O(1)時間復雜度,性能表現相當不錯。

基于Kafka時間輪的實現方式,需要依賴于Kafka實現較為復雜,但其穩定性和性能表現更為卓越,尤其適用于分布式場景。

五、RocketMQ延遲消息

與Kafka相比,RocketMQ提供了一個強大的功能,即支持延遲消息。

延遲消息指的是在消息寫入Broker后,并非立即被消費者處理,而是需要等待指定時長后才能被消費。這種機制使得我們能夠在訂單創建后發送一個延遲消息,例如,設置一個延遲30分鐘的消息來取消訂單。在過去的30分鐘內,消息會保持未被消費狀態,然后在時間到達后被消費者處理。消費者在接收到消息后,即可執行關單操作。

需要注意的是,RocketMQ的延遲消息并不支持任意時長的延遲,而是限定在一些預定義的時長內,如1秒、5秒、10秒、30秒、1分鐘、2分鐘等(RocketMQ商業版支持任意時長,這也是他們的一貫作風)。盡管RocketMQ的延遲消息簡化了處理流程,實現了系統之間的完全解耦,但由于時長受到了限制,靈活性相對較低。

在業務中,如果訂單關閉的時長恰好匹配RocketMQ延遲消息支持的時長,那么基于RocketMQ延遲消息是一種可行的實現方式。然而,如果時長不匹配,可能需要考慮其他更靈活的解決方案。

六、RabbitMQ

延遲消息不僅在RocketMQ中得到支持,在RabbitMQ中同樣可以實現,可以選擇使用死信隊列或者基于rabbitmq_delayed_message_exchange插件進行實現。

死信隊列

在RabbitMQ中,一旦一條正常消息因為TTL過期、隊列長度超限或被消費者拒絕等原因無法被及時消費,它將成為Dead Message,即死信,會被重新發送到死信隊列(。通過這一機制,我們可以實現延遲消息的效果。具體實現方式是給消息設定TTL,但不立即消費,等待其過期后進入死信隊列,然后監聽死信隊列以完成消息的消費。

RabbitMQ中的TTL可以設置任意時長,解決了RocketMQ在這方面的不靈活之處。然而,死信隊列實現方式可能導致隊頭阻塞問題,因為隊列采用先進先出的原則,每次只判斷隊頭消息是否過期。若隊頭消息的過期時間較長且一直不過期,整個隊列都會受阻。即使隊頭后面的消息過期,也會受到阻塞影響。

基于RabbitMQ的死信隊列,可以實現高度靈活的延遲消息機制,滿足定時關單等需求。利用RabbitMQ的集群擴展性,實現高可用和大并發處理。然而,這種方案存在消息阻塞問題,且相對較為復雜,需要依賴RabbitMQ并聲明多個隊列(交換機),增加系統復雜度,在實際使用中不是很推薦。

關于RabbitMQ死信隊列我之前寫過一篇文章,感興趣的可以翻閱實戰!SpringBoot + RabbitMQ死信隊列實現超時關單~

rabbitmq_delayed_message_exchange 插件

在RabbitMQ中,也可以利用rabbitmq_delayed_message_exchange插件實現延時消息,該方案解決了通過死信隊列引起的消息阻塞問題。請注意,該插件從RabbitMQ版本3.6.12開始提供支持,因此對版本有一定的要求。

圖片圖片

這官方插件經過認證,使用安全可靠。安裝并啟用該插件后,即可創建x-delayed-message類型的隊列。相較于先將消息投遞到正常隊列,再在TTL過期后進入死信隊列的方式,插件的實現方式略有不同。具體而言,消息并不會立即進入隊列,而是先存儲在基于Erlang開發的Mnesia數據庫中。然后,通過定時器查詢需要投遞的消息,并將它們投遞到x-delayed-message隊列中。

七、Redis

基于Redis也可以實現延時消息的功能,有以下三種方案:

Redis過期監聽

通過在配置文件redis.conf中增加配置notify-keyspace-events Ex 即可實現消息的過期監聽,然后可以在業務代碼實現KeyExpirationEventMessageListener監聽器來接收過期消息,這樣就可以實現延時關閉訂單的操作。然而,Redis并不保證鍵在過期時立即刪除,也不保證消息能夠及時發出。并且在集群模式下,某個節點的key事件被觸發了并不會擴散到所有節點。

圖片圖片

Redis的zset

雖然Redis過期監聽方案并不完美,但我們還可以借助有序集合(zset)來實現此功能。在zset中,我們將訂單超時時間的時間戳(下單時間+超時時長)與訂單號分別設置為score和member,Redis會根據score延時時間來排序zset。最后通過Redis掃描任務,獲取 “當前時間>score” 的延時任務,執行關閉訂單業務邏輯。使用zset實現訂單關閉的優點在于可借助Redis的持久化和高可用機制,避免數據丟失。 然而,在高并發場景下可能存在多個消費者同時獲取相同訂單號的問題,這就要求消費者一定要做好冪等處理。

關于冪等方案可以參考我DDD系列的這篇文章SpringBoot項目如何保證接口冪等

Redisson

雖然zset方案看起來不錯,但需要手動編寫基于zset這種數據結構實現。一種更友好的方式是基于Redisson框架。

圖片圖片

Redisson是在Redis基礎上實現的框架,提供了分布式的Java常用對象和許多分布式服務。其中,Redisson定義了分布式延遲隊列RDelayedQueue,這是基于zset實現的延遲隊列,它允許將元素以指定的延遲時長放入目標隊列中。當我們要添加一個數據到延遲隊列的時候,redission會把數據+超時時間放到zset中,并且起一個延時任務,當任務到期的時候,再去zset中把數據取出來,返回給客戶端使用。通過Redisson,我們可以更輕松地實現延遲隊列,不僅解決了zset方案中的并發重復問題,并且性能穩定高,推薦大家使用!

關于Redission實現延時消息的原理可以查看這篇文章:分布式延時消息的另外一種選擇 Redisson

小結

本文介紹了七大類關于訂單延時關閉的方案,其中在RabbitMQ和Redis的方案中又各自包含幾個小方案,每種方案都有其獨特的優缺點,適用于不同的業務場景。在實際開發中,應根據業務需求和系統架構選擇最合適的方案。比如你是一個簡單的單體應用并且業務量不大,選擇Netty的時間輪或定時任務即可;如果你的項目恰好引入了RabbitMQ或者RocketMQ,那就可以;如果只是引入了Redis也可直接使用Redisson的RDelayedQueue方案。

例如,對于簡單的單體應用且業務量不大的情況,可考慮使用Netty的時間輪或定時任務。如果項目已經引入了RabbitMQ或RocketMQ,直接使用RabbitMQ的插件方案或RocketMQ的延時消息是一個不錯的方案。而對于僅引入了Redis的情況,可以直接利用Redisson的RDelayedQueue方案。

值得注意的是,使用Redis過期監聽或RabbitMQ死信隊列作為延時任務的方式可能會存在一些設計者未預料到的問題。這種出其不意的使用方式通常會帶來一致性和可靠性的隱患,可能導致低吞吐量、資源泄漏等問題。因此,個人不推薦采用這些方式,而是建議選擇更為穩定和可控的方案。

DailyMart中的實現方式

在Dailymart中我們已經引入了RocketMQ,所以可以直接采取Redis的延遲消息來實現訂單的延時關閉。

首先,在領域服務保存訂單數據時通過ApplicationEventPublisher發布訂單創建事件。

@Transactional  
public void save(TradeOrder tradeOrder) {  
    orderRepository.save(tradeOrder);  
    eventPublisher.publishEvent(new OrderCreatedEvent(tradeOrder));  
}

然后,在應用層的事件監聽器中,通過RocketMQ發布延時消息

@Order(3)  
@Component  
@Slf4j  
public class DelayCloseListener implements ApplicationListener<OrderCreatedEvent> {  
      
    @Resource  
    private RocketMQEnhanceTemplate rocketMQEnhanceTemplate;  
    
    /**  
     * 收到消息以后需要發送延時消息,用以確保訂單及時支付  
     * @param event 訂單創建事件  
     */  
    @Override  
    public void onApplicationEvent(@NotNull OrderCreatedEvent event) {  
        TradeOrder tradeOrder = (TradeOrder) event.getSource();  
        DelayCloseOrderEvent orderMessage = new DelayCloseOrderEvent(tradeOrder.getCustomerId(), tradeOrder.getOrderSn());  
        rocketMQEnhanceTemplate.sendDelay("TRADE-ORDER", "DELAY-CLOSE", orderMessage, DelayMessageConstant.THIRTY_MINUTE);  
    }  
}

最后,在訂單服務基礎設施層監聽延時消息,當收到延時消息后執行關單操作

@Component  
@Slf4j  
@RocketMQMessageListener(consumerGroup = "dailymart_order_group", topic = "TRADE-ORDER", selectorExpression = "DELAY-CLOSE")  
public class OrderDelayClosedConsumer extends EnhanceMessageHandler<DelayCloseOrderEvent> implements RocketMQListener<DelayCloseOrderEvent> {  
      
    @Override  
    protected void handleMessage(DelayCloseOrderEvent delayCloseOrderEvent) {  
        // 1. 查看訂單支付狀態  
        // 1.1 如果已支付,則無需處理消息  
        // 1.2 如果未支付,則需要關閉訂單, 釋放庫存  
        String orderSn = delayCloseOrderEvent.getOrderSn();  
        TradeOrder tradeOrder = orderRepository.findOrderByTransaction(orderSn);  
        if (Objects.equals(tradeOrder.getStatus(), OrderStatusEnum.WAITING_PAYMENT.getStatus())) {  
            tradeOrderService.changeOrderStatus(orderSn, OrderStatusEnum.CLOSED);  
            inventoryRemoteFacade.unWithhold(orderSn);  
        }  
    }
}

在文中涉及的相關代碼,你可以在我星球 DDD&微服務 系列專欄中找到相應的實現,感興趣可以參考文末說明

DailyMart是一個基于 DDD 和Spring Cloud Alibaba的微服務商城系統,采用SpringBoot3.x以及JDK17。旨在為開發者提供集成式的學習體驗,并將其無縫地應用于實際項目中。該專欄包含領域驅動設計(DDD)、Spring Cloud Alibaba企業級開發實踐、設計模式實際應用場景解析、分庫分表戰術及實用技巧等內容。如果你對這個系列感興趣,可在本公眾號回復關鍵詞 DDD 獲取完整文檔以及相關源碼。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2018-03-25 09:11:31

大數據機器學習分析軟件

2019-11-05 15:52:23

Java源碼分析垃圾回收

2024-11-14 07:20:00

2015-09-20 15:50:46

2023-11-21 08:45:10

JSON性能程序

2018-07-30 09:33:21

2020-06-12 07:36:33

Redis

2015-08-04 10:34:13

Windows 10升級

2016-08-23 00:39:25

2016-07-29 15:26:07

Windows 10Cortana設置

2016-07-12 10:03:37

2019-08-29 16:05:06

物聯網

2017-08-31 15:37:17

人工智能機器自動化

2020-12-08 09:52:47

MacWindows系統

2020-03-09 14:42:40

人工智能機器學習技術

2018-08-02 15:40:59

2015-07-29 13:52:12

Windows 10升級鏡像

2019-05-21 14:37:41

數據科學可視化企業

2018-04-02 11:22:31

大數據Hadoop數據處理

2023-08-17 08:41:43

Vue 3多布局系統
點贊
收藏

51CTO技術棧公眾號

亚洲影院在线观看| 韩国毛片一区二区三区| 亚洲欧美制服丝袜| 艹b视频在线观看| 成人日韩欧美| 99久久夜色精品国产网站| 日韩免费在线视频| wwwav国产| 久久av综合| 欧美一区二区大片| 日本熟妇人妻xxxxx| 最新日本在线观看| 久久精子c满五个校花| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲精品电影在线观看| 鲁一鲁一鲁一鲁一av| 国产白丝在线观看| 成人欧美一区二区三区白人| 蜜桃91精品入口| 国产精品久久久久久在线| 午夜亚洲激情| 色综合天天综合网国产成人网 | 国产精品igao视频| 久久久久久久国产精品毛片| 日韩精品一卡| 亚洲人高潮女人毛茸茸| 美女伦理水蜜桃4| 一区在线不卡| 欧美中文字幕不卡| 日韩av资源在线| 精品一性一色一乱农村| 最新久久zyz资源站| 日韩一区不卡| 欧洲视频在线免费观看| 成人亚洲一区二区一| 成人欧美一区二区三区在线湿哒哒| 久热这里只有精品6| 欧美日本不卡| 欧美成人午夜影院| 亚洲一二三在线观看| 欧美成人激情| 中文字幕亚洲无线码a| 国产综合精品在线| 国产成人3p视频免费观看| 日韩精品在线电影| 亚洲一区二区三区四区五区六区| 成人午夜三级| 亚洲精品在线观| 欧美丰满熟妇bbb久久久| 欧美在线在线| 欧美一区二区视频在线观看2020| 中文字幕久久av| 免费成人高清在线视频| 精品视频在线看| 欧美日韩亚洲自拍| 久久精品资源| 欧美一区二区三区四区久久 | 看亚洲a级一级毛片| 8x8x8国产精品| 久久久久久久久久毛片| 激情综合婷婷| 精品国产三级电影在线观看| 制服丝袜av在线| 偷拍精品福利视频导航| 亚洲精品中文字幕女同| 中文字幕免费高清| 第九色区aⅴ天堂久久香| 中文字幕av一区二区三区谷原希美| 国产视频不卡在线| 天天影视欧美综合在线观看| 欧美成年人视频网站| 国产一级片免费观看| 亚洲一区网站| 国产精品网址在线| 国产av无码专区亚洲a∨毛片| 国产成人在线电影| 久久久久久久久久久久久久一区| 裸体xxxx视频在线| 国产精品萝li| 国产乱子伦精品视频| 国产中文在线播放| 欧美少妇一区二区| 女教师高潮黄又色视频| 国产成人一二| 一区二区欧美在线| 无码人妻精品一区二区三区夜夜嗨| 国产精品videosex极品| 欧美亚洲视频在线看网址| 超碰在线免费97| 国产乱对白刺激视频不卡| 动漫3d精品一区二区三区| 免费在线黄色电影| 亚洲免费资源在线播放| 久久久999免费视频| 国产福利一区二区三区在线播放| 日韩一区二区精品在线观看| 最新在线黄色网址| 婷婷综合视频| 欧美怡红院视频一区二区三区| 亚洲天堂中文字幕在线| www.99精品| 波多野结衣三级在线| 小h片在线观看| 91麻豆精品国产91久久久更新时间| 国产免费a级片| 日韩欧美三级| 26uuu另类亚洲欧美日本老年| 在线免费看av片| 91亚洲精品久久久蜜桃网站| 超碰97免费观看| 欧美电影网站| 亚洲成人网在线| 欧美日韩高清丝袜| 欧美网站在线| 国产原创欧美精品| 福利成人在线观看| 丁香五六月婷婷久久激情| 亚洲女人在线观看| 成人看的羞羞网站| 欧美在线中文字幕| 高h震动喷水双性1v1| 国产精品国产成人国产三级| 欧美私人情侣网站| 里番精品3d一二三区| 久久精品色欧美aⅴ一区二区| 依依成人综合网| 国产不卡高清在线观看视频| 一区二区三区四区视频在线| 大胆人体一区二区| 日韩电影中文 亚洲精品乱码| 欧美大片xxxx| 麻豆精品新av中文字幕| 日韩av电影免费在线| 在线观看欧美日韩电影| 亚洲第五色综合网| 久久一二三四区| 国产河南妇女毛片精品久久久| 亚洲免费视频一区| 素人啪啪色综合| 一区二区三区黄色| 高潮毛片又色又爽免费| 久久这里只有精品6| 欧美日韩黄色一级片| 精品三级av在线导航| 欧美劲爆第一页| 性一交一乱一乱一视频| 夜夜嗨av一区二区三区网页| 亚洲美女精品视频| 精品不卡视频| 国产欧美日韩一区| 美女网站在线看| 精品在线欧美视频| 国产污视频网站| 国产午夜一区二区三区| 久久久久国产精品熟女影院| 国产尤物久久久| 国产精品99蜜臀久久不卡二区 | 久久97精品久久久久久久不卡| 国产美女三级无套内谢| 亚洲女同ⅹxx女同tv| 久久久久久国产精品日本| 欧美人成网站| 久99久在线| 二吊插入一穴一区二区| 揄拍成人国产精品视频| 岳乳丰满一区二区三区| 亚洲人成小说网站色在线 | 中文字幕日本最新乱码视频| 欧美激情极品| 国产精品91免费在线| 麻豆视频免费在线观看| 欧美刺激午夜性久久久久久久| 日韩成人一区二区三区| 久久精品视频在线免费观看| 中文字幕av不卡在线| 欧美 亚欧 日韩视频在线 | 亚洲欧美日韩一区二区三区在线| 日本三级网站在线观看| 久久理论电影网| 91看片破解版| 亚洲国产精品第一区二区三区| 久久狠狠久久综合桃花| 激情亚洲小说| 久久久久久久97| 成人网视频在线观看| 91精品国产综合久久久久| 国产精品9191| 国产欧美综合在线观看第十页 | 国产欧美88| 国内外成人免费激情在线视频 | 日本一区二区三区高清不卡| 国产999免费视频| 国产视频一区免费看| 一区二区高清视频| 国产女人18毛片水真多18精品| 国产成人福利网站| а√天堂资源地址在线下载| 亚洲男人天堂2019| 99热这里只有精品5| 精品久久久久久久中文字幕| 国产高清视频免费在线观看| 94色蜜桃网一区二区三区| 一本一道久久a久久综合蜜桃| 一本一本久久| 特级西西444| 欧美手机视频| 久久久久久久久一区| 精品三级国产| 国产精品美女久久| 妞干网免费在线视频| 色综合久久88色综合天天看泰| 国产九色在线| 日韩高清av在线| 午夜精品久久久久久久第一页按摩| 欧美性受极品xxxx喷水| 久久99精品波多结衣一区| 亚洲欧美日韩电影| 日本精品久久久久中文| 久久先锋资源网| 中文字幕天堂av| 国产激情一区二区三区| 色播五月激情五月| 日韩福利视频网| 99蜜桃臀久久久欧美精品网站| 欧美三区美女| 好色先生视频污| 日韩亚洲一区在线| 四虎一区二区| 精品日本12videosex| 欧美精品二区三区四区免费看视频| 1769国产精品视频| 成人黄色在线免费观看| 只有精品亚洲| 91精品国产综合久久香蕉922| 日韩中文视频| 国产精品va在线| 丝袜美腿诱惑一区二区三区| 2019中文在线观看| 蜜桃视频www网站在线观看| 亚洲91av视频| 日韩伦理在线一区| 777午夜精品福利在线观看| 9999精品成人免费毛片在线看 | 亚洲精品一区中文| 日韩欧美在线番号| 亚洲人成自拍网站| av资源网在线观看| 日韩中文视频免费在线观看| 网友自拍视频在线| 欧美成人精品三级在线观看 | 日韩欧美大片| 亚洲自拍的二区三区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 日韩电影在线播放| 青青草成人影院| 一区二区视频国产| 一区二区影院| 欧美高清中文字幕| 亚洲精选国产| 国产无套粉嫩白浆内谢的出处| 蜜臀av一区二区| 四虎成人在线播放| 成人动漫在线一区| 扒开jk护士狂揉免费| 国产精品网站导航| wwwav国产| 欧美日韩国产页| 国产精品自拍第一页| 欧美高清视频不卡网| 亚洲国产视频一区二区三区| 日韩电影中文字幕在线| 波多野结衣一区二区| 粗暴蹂躏中文一区二区三区| 丁香影院在线| 日本一区二区三区在线播放| 亚洲成人高清| 国产伦精品一区二区三毛| 亚洲人成网www| 黄色网址在线免费看| 亚洲精品日韩久久| 亚洲国产日韩欧美在线观看| 国产成人精品aa毛片| 白白色免费视频| 亚洲黄色免费电影| 99精品在线播放| 91精品午夜视频| 婷婷av一区二区三区| 日韩在线观看视频免费| 2020日本在线视频中文字幕| 国产精品香蕉国产| 欧美日韩一本| 99久久久无码国产精品性色戒| 在线观看一区| 91 视频免费观看| 久久美女艺术照精彩视频福利播放 | 午夜精品在线观看| 欧美成人家庭影院| 麻豆成人在线播放| 在线成人激情| 国产理论在线播放| 不卡一卡二卡三乱码免费网站| 99久久久无码国产精品不卡| 亚洲mv在线观看| aaaa一级片| 一本一道久久a久久精品逆3p| av免费在线视| 亚洲自拍偷拍一区| 日本一区二区三区视频| 午夜精品久久久内射近拍高清| 国产河南妇女毛片精品久久久| 国产91丝袜美女在线播放| 午夜精品影院在线观看| 国产免费叼嘿网站免费| 亚洲性av在线| 校园春色亚洲| 国产精品有限公司| 欧美日韩在线大尺度| 亚洲一区二区福利视频| 国产欧美日韩不卡免费| 9i看片成人免费看片| 亚洲精品国产精品国产自| 影音先锋中文在线视频| 成人精品一区二区三区电影黑人| 国产亚洲第一伦理第一区| 伊人成色综合网| 成人精品视频网站| 免费在线观看av网址| 欧美一级日韩一级| fc2ppv国产精品久久| 国产在线日韩在线| 四虎成人av| 日本人69视频| 亚洲婷婷在线视频| 国产女人18毛片水真多| 久久久精品一区二区| 欧美高清你懂的| 一区二区视频在线播放| 久久99国产精品尤物| 免费成人深夜蜜桃视频| 欧美日韩亚洲另类| 日本三级视频在线播放| 国产精品一区久久| 久久久久免费av| 欧美精品色视频| 洋洋成人永久网站入口| 亚洲爱爱综合网| 亚州国产精品久久久| 加勒比色老久久爱综合网| 91视频 -- 69xx| 久久久久综合网| 亚洲无码久久久久久久| 麻豆乱码国产一区二区三区| 国产一区二区三区精品在线观看| 国产小视频免费| www.欧美精品一二区| 精品人妻一区二区色欲产成人| 亚洲视频在线免费观看| 精品女同一区二区三区在线观看| 在线视频一区观看| 懂色中文一区二区在线播放| 日本熟妇色xxxxx日本免费看| 亚洲黄色在线观看| 成人日韩精品| 免费久久久久久| caoporen国产精品视频| 免费av中文字幕| 久久国产一区二区三区| 风间由美一区二区av101| 日本精品免费在线观看| 国产精品欧美久久久久无广告| 国产aⅴ一区二区三区| 992tv成人免费影院| 日韩综合在线| 国产乱国产乱老熟300部视频| 精品久久久久久久久久久| 137大胆人体在线观看| 国产精品久久久对白| 日韩专区欧美专区| 国精产品视频一二二区| 精品国精品自拍自在线| 婷婷六月国产精品久久不卡| 日本特级黄色大片| 99麻豆久久久国产精品免费优播| 中文无码精品一区二区三区| 欧美大码xxxx| 久久97视频| 苍井空张开腿实干12次| 在线影院国内精品| 欧美性猛片xxxxx免费中国| 日本一区二区免费看| 国产不卡视频在线观看| 日本欧美www| 97视频在线观看免费高清完整版在线观看 | 日产中文字幕在线精品一区| 国产精品123区| 正在播放木下凛凛xv99| 97视频在线观看免费高清完整版在线观看 | 亚洲国产精品久久久久久| 日韩高清成人| 精品视频免费在线播放|