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

如何實現一個任務調度系統?

開發 新聞
寫這篇文章,想和大家從頭到腳說說任務調度,希望大家讀完之后,能夠理解實現一個任務調度系統的核心邏輯。

閱讀一篇「定時任務框架選型」的文章時,一位網友的留言到了我:

我看過那么多所謂的教程,大部分都是教“如何使用工具”的,沒有多少是教“如何制作工具”的,能教“如何仿制工具”的都已經是鳳毛麟角,中國 軟件行業,缺的是真正可以“制作工具”的程序員,而絕對不缺那些“使用工具”的程序員!......  ”這個業界最不需要的就是“會使用XX工具的工程師”,而是“有創造力的軟件工程師”!業界所有的飯碗,本質就是“有創造力的軟件工程師”提供出來的啊!

寫這篇文章,想和大家從頭到腳說說任務調度,希望大家讀完之后,能夠理解實現一個任務調度系統的核心邏輯。

圖片

1 Quartz

Quartz是一款Java開源任務調度框架,也是很多Java工程師接觸任務調度的起點。

下圖顯示了任務調度的整體流程:

圖片

Quartz的核心是三個組件。

  • 任務:Job 用于表示被調度的任務;
  • 觸發器:Trigger 定義調度時間的元素,即按照什么時間規則去執行任務。一個Job可以被多個Trigger關聯,但是一個Trigger 只能關聯一個Job;
  • 調度器 :工廠類創建Scheduler,根據觸發器定義的時間規則調度任務。

圖片

上圖代碼中Quartz 的JobStore是 RAMJobStore,Trigger 和 Job 存儲在內存中。

執行任務調度的核心類是 QuartzSchedulerThread 。

圖片

  1. 調度線程從JobStore中獲取需要執行的的觸發器列表,并修改觸發器的狀態;
  2. Fire觸發器,修改觸發器信息(下次執行觸發器的時間,以及觸發器狀態),并存儲起來。
  3. 最后創建具體的執行任務對象,通過worker線程池執行任務。

接下來再聊聊 Quartz 的集群部署方案。

Quartz的集群部署方案,需要針對不同的數據庫類型(MySQL ,  ORACLE) 在數據庫實例上創建Quartz表,JobStore是:  JobStoreSupport 。

這種方案是分布式的,沒有負責集中管理的節點,而是利用數據庫行級鎖的方式來實現集群環境下的并發控制。

scheduler實例在集群模式下首先獲取{0}LOCKS表中的行鎖,Mysql 獲取行鎖的語句:

{0}會替換為配置文件默認配置的??QRTZ_??。sched_name為應用集群的實例名,lock_name就是行級鎖名。Quartz主要有兩個行級鎖觸發器訪問鎖 (TRIGGER_ACCESS) 和 狀態訪問鎖(STATE_ACCESS)。

這個架構解決了任務的分布式調度問題,同一個任務只能有一個節點運行,其他節點將不執行任務,當碰到大量短任務時,各個節點頻繁的競爭數據庫鎖,節點越多性能就會越差。

2 分布式鎖模式

Quartz的集群模式可以水平擴展,也可以分布式調度,但需要業務方在數據庫中添加對應的表,有一定的強侵入性。

有不少研發同學為了避免這種侵入性,也探索出分布式鎖模式

業務場景:電商項目,用戶下單后一段時間沒有付款,系統就會在超時后關閉該訂單。

通常我們會做一個定時任務每兩分鐘來檢查前半小時的訂單,將沒有付款的訂單列表查詢出來,然后對訂單中的商品進行庫存的恢復,然后將該訂單設置為無效。

我們使用Spring Schedule的方式做一個定時任務。

@Scheduled(cron = "0 */2 * * * ? ")
public void doTask() {
log.info("定時任務啟動");
//執行關閉訂單的操作
orderService.closeExpireUnpayOrders();
log.info("定時任務結束");
}

在單服務器運行正常,考慮到高可用,業務量激增,架構會演進成集群模式,在同一時刻有多個服務執行一個定時任務,有可能會導致業務紊亂。

解決方案是在任務執行的時候,使用Redis 分布式鎖來解決這類問題。

@Scheduled(cron = "0 */2 * * * ? ")
public void doTask() {
log.info("定時任務啟動");
String lockName = "closeExpireUnpayOrdersLock";
RedisLock redisLock = redisClient.getLock(lockName);
//嘗試加鎖,最多等待3秒,上鎖以后5分鐘自動解鎖
boolean locked = redisLock.tryLock(3, 300, TimeUnit.SECONDS);
if(!locked){
log.info("沒有獲得分布式鎖:{}" , lockName);
return;
}
try{
//執行關閉訂單的操作
orderService.closeExpireUnpayOrders();
} finally {
redisLock.unlock();
}
log.info("定時任務結束");
}

Redis的讀寫性能極好,分布式鎖也比Quartz數據庫行級鎖更輕量級。當然Redis鎖也可以替換成Zookeeper鎖,也是同樣的機制。

在小型項目中,使用:定時任務框架(Quartz/Spring Schedule)和 分布式鎖(redis/zookeeper)有不錯的效果。

但是呢?我們可以發現這種組合有兩個問題:

  1. 定時任務在分布式場景下有空跑的情況,而且任務也無法做到分片;
  2. 要想手工觸發任務,必須添加額外的代碼才能完成。

3 ElasticJob-Lite 框架

ElasticJob-Lite 定位為輕量級無中心化解決方案,使用 jar 的形式提供分布式任務的協調服務。

圖片

應用內部定義任務類,實現SimpleJob接口,編寫自己任務的實際業務流程即可。

public class MyElasticJob implements SimpleJob {
@Override
public void execute(ShardingContext context) {
switch (context.getShardingItem()) {
case 0:
// do something by sharding item 0
break;
case 1:
// do something by sharding item 1
break;
case 2:
// do something by sharding item 2
break;
// case n: ...
}
}
}

舉例:應用A有五個任務需要執行,分別是A,B,C,D,E。任務E需要分成四個子任務,應用部署在兩臺機器上。

應用A在啟動后, 5個任務通過 Zookeeper 協調后被分配到兩臺機器上,通過Quartz Scheduler 分開執行不同的任務。

ElasticJob 從本質上來講 ,底層任務調度還是通過 Quartz ,相比Redis分布式鎖 或者 Quartz 分布式部署 ,它的優勢在于可以依賴 Zookeeper 這個大殺器 ,將任務通過負載均衡算法分配給應用內的 Quartz Scheduler容器。

從使用者的角度來講,是非常簡單易用的。但從架構來看,調度器和執行器依然在同一個應用方JVM內,而且容器在啟動后,依然需要做負載均衡。應用假如頻繁的重啟,不斷的去選主,對分片做負載均衡,這些都是相對比較的操作。

ElasticJob 的控制臺通過讀取注冊中心數據展現作業狀態,更新注冊中心數據修改全局任務配置。從一個任務調度平臺的角度來看,控制臺功能還是偏孱弱的。

4 中心化流派

中心化的原理是:把調度和任務執行,隔離成兩個部分:調度中心和執行器。調度中心模塊只需要負責任務調度屬性,觸發調度命令。執行器接收調度命令,去執行具體的業務邏輯,而且兩者都可以進行分布式擴容。

4.1 MQ模式

先談談我在藝龍促銷團隊接觸的第一種中心化架構。

圖片

調度中心依賴Quartz集群模式,當任務調度時候,發送消息到RabbitMQ 。業務應用收到任務消息后,消費任務信息。

這種模型充分利用了MQ解耦的特性,調度中心發送任務,應用方作為執行器的角色,接收任務并執行。

但這種設計強依賴消息隊列,可擴展性和功能,系統負載都和消息隊列有極大的關聯。這種架構設計需要架構師對消息隊列非常熟悉。

4.2 XXL-JOB

XXL-JOB 是一個分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼并接入多家公司線上產品線,開箱即用。

xxl-job 2.3.0架構圖

我們重點剖析下架構圖 :

▍ 網絡通訊 server-worker 模型

圖片

調度中心和執行器 兩個模塊之間通訊是 server-worker 模式。調度中心本身就是一個SpringBoot 工程,啟動會監聽8080端口。

執行器啟動后,會啟動內置服務( EmbedServer )監聽9994端口。這樣雙方都可以給對方發送命令。

那調度中心如何知道執行器的地址信息呢 ?上圖中,執行器會定時發送注冊命令 ,這樣調度中心就可以獲取在線的執行器列表。

通過執行器列表,就可以根據任務配置的路由策略選擇節點執行任務。常見的路由策略有如下三種:

  • 隨機節點執行:選擇集群中一個可用的執行節點執行調度任務。適用場景:離線訂單結算。
  • 廣播執行:在集群中所有的執行節點分發調度任務并執行。適用場景:批量更新應用本地緩存。
  • 分片執行:按照用戶自定義分片邏輯進行拆分,分發到集群中不同節點并行執行,提升資源利用效率。適用場景:海量日志統計。

▍ 調度器

調度器是任務調度系統里面非常核心的組件。XXL-JOB 的早期版本是依賴Quartz。

但在v2.1.0版本中完全去掉了Quartz的依賴,原來需要創建的 Quartz表也替換成了自研的表。

核心的調度類是:JobTriggerPoolHelper 。調用start方法后,會啟動兩個線程:scheduleThread 和 ringThread 。

首先 scheduleThread 會定時從數據庫加載需要調度的任務,這里從本質上還是基于數據庫行鎖保證同時只有一個調度中心節點觸發任務調度。

Connection conn = XxlJobAdminConfig.getAdminConfig()
.getDataSource().getConnection();
connAutoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
preparedStatement = conn.prepareStatement(
"select * from xxl_job_lock where lock_name = 'schedule_lock' for update");
preparedStatement.execute();
# 觸發任務調度 (偽代碼)
for (XxlJobInfo jobInfo: scheduleList) {
// 省略代碼
}
# 事務提交
conn.commit();

調度線程會根據任務的「下次觸發時間」,采取不同的動作:

圖片

已過期的任務需要立刻執行的,直接放入線程池中觸發執行 ,五秒內需要執行的任務放到 ringData 對象里。

ringThread 啟動后,定時從 ringData 對象里獲取需要執行的任務列表 ,放入到線程池中觸發執行。

圖片

圖片

5 自研在巨人的肩膀上

2018年,我有一段自研任務調度系統的經歷。

背景是:兼容技術團隊自研的RPC框架,技術團隊不需要修改代碼,RPC注解方法可以托管在任務調度系統中,直接當做一個任務來執行。

自研過程中,研讀了XXL-JOB 源碼,同時從阿里云分布式任務調度 SchedulerX 吸取了很多營養。

SchedulerX 1.0 架構圖

  • Schedulerx-console 是任務調度的控制臺,用于創建、管理定時任務。負責數據的創建、修改和查詢。在產品內部與 schedulerx server 交互。
  • Schedulerx-server 是任務調度的服務端,是 Scheduler的核心組件。負責客戶端任務的調度觸發以及任務執行狀態的監測。
  • Schedulerx-client 是任務調度的客戶端。每個接入客戶端的應用進程就是一個的 Worker。Worker 負責與 Schedulerx-server 建立通信,讓 schedulerx-server發現客戶端的機器。并向schedulerx-server注冊當前應用所在的分組,這樣 schedulerx-server才能向客戶端定時觸發任務。

我們模仿了SchedulerX的模塊,架構設計如下圖:

圖片

我選擇了 RocketMQ 源碼的通訊模塊 remoting 作為自研調度系統的通訊框架。基于如下兩點:

  1. 我對業界大名鼎鼎的 Dubbo不熟悉,而remoting我已經做了多個輪子,我相信自己可以搞定;
  2. 在閱讀 SchedulerX 1.0 client 源碼中,發現 SchedulerX 的通訊框架和RocketMQ Remoting很多地方都很類似。它的源碼里有現成的工程實現,完全就是一個寶藏。

我將 RocketMQ remoting 模塊去掉名字服務代碼,做了一定程度的定制。

在RocketMQ的remoting里,服務端采用 Processor 模式。

調度中心需要注冊兩個處理器:回調結果處理器CallBackProcessor和心跳處理器HeartBeatProcessor 。執行器需要注冊觸發任務處理器TriggerTaskProcessor 。

public void registerProcessor(
int requestCode,
NettyRequestProcessor processor,
ExecutorService executor);

處理器的接口:

public interface NettyRequestProcessor {
RemotingCommand processRequest(
ChannelHandlerContext ctx,
RemotingCommand request) throws Exception;
boolean rejectRequest();
}

對于通訊框架來講,我并不需要關注通訊細節,只需要實現處理器接口即可。

以觸發任務處理器TriggerTaskProcessor舉例:

圖片

搞定網絡通訊后,調度器如何設計 ?最終我還是選擇了Quartz 集群模式。主要是基于以下幾點原因:

  1. 調度量不大的情況下 ,Quartz 集群模式足夠穩定,而且可以兼容原來的XXL-JOB任務;
  2. 使用時間輪的話,本身沒有足夠的實踐經驗,擔心出問題。另外,如何讓任務通過不同的調度服務(schedule-server)觸發, 需要有一個協調器。于是想到Zookeeper。但這樣的話,又引入了新的組件。
  3. 研發周期不能太長,想快點出成果。

自研版的調度服務花費一個半月上線了。系統運行非常穩定,研發團隊接入也很順暢。調度量也不大 ,四個月總共接近4000萬到5000萬之間的調度量。

坦率的講,自研版的瓶頸,我的腦海里經常能看到。數據量大,我可以搞定分庫分表,但 Quartz 集群基于行級鎖的模式 ,注定上限不會太高。

為了解除心中的困惑,我寫一個輪子DEMO看看可否work:

  1. 去掉外置的注冊中心,調度服務(schedule-server)管理會話;
  2. 引入zookeeper,通過zk協調調度服務。但是HA機制很粗糙,相當于一個任務調度服務運行,另一個服務standby;
  3. Quartz 替換成時間輪 (參考Dubbo里的時間輪源碼)。

圖片

這個Demo版本在開發環境可以運行,但有很多細節需要優化,僅僅是個玩具,并沒有機會運行到生產環境。

最近讀阿里云的一篇文章《如何通過任務調度實現百萬規則報警》,SchedulerX2.0 高可用架構見下圖:

圖片

文章提到:

每個應用都會做三備份,通過 zk 搶鎖,一主兩備,如果某臺 Server 掛了,會進行 failover,由其他 Server 接管調度任務。

這次自研任務調度系統從架構來講,并不復雜,實現了XXL-JOB的核心功能,也兼容了技術團隊的RPC框架,但并沒有實現工作流以及mapreduce分片。

SchedulerX 在升級到2.0之后基于全新的Akka 架構,這種架構號稱實現高性能工作流引擎,實現進程間通信,減少網絡通訊代碼。

在我調研的開源任務調度系統中,PowerJob也是基于Akka 架構,同時也實現了工作流和MapReduce執行模式。

我對PowerJob非常感興趣,也會在學習實踐后輸出相關文章,敬請期待。

6 技術選型

首先我們將任務調度開源產品和商業產品 SchedulerX 放在一起,生成一張對照表:

圖片

Quartz 和 ElasticJob從本質上還是屬于框架的層面。

中心化產品從架構上來講更加清晰,調度層面更靈活,可以支持更復雜的調度(mapreduce動態分片,工作流)。

XXL-JOB 從產品層面已經做到極簡,開箱即用,調度模式可以滿足大部分研發團隊的需求。簡單易用 + 能打,所以非常受大家歡迎。

其實每個技術團隊的技術儲備不盡相同,面對的場景也不一樣,所以技術選型并不能一概而論。

不管是使用哪種技術,在編寫任務業務代碼時,還是需要注意兩點:

  • 冪等。當任務被重復執行的時候,或者分布式鎖失效的時候,程序依然可以輸出正確的結果;
  • 任務不跑了,千萬別驚慌。查看調度日志,JVM層面使用Jstack命令查看堆棧,網絡通訊要添加超時時間 ,一般能解決大部分問題。

7 寫到最后

2015年其實是非常有趣的一年。ElasticJob 和 XXL-JOB 這兩種不同流派的任務調度項目都開源了。

在 XXL-JOB 源碼里,至今還保留著許雪里老師在開源中國的一條動態截圖:

剛寫的任務調度框架 ,Web動態管理任務,實時生效,熱乎的。沒有意外的話,明天中午推送到git.osc上去。哈哈,下樓炒個面加個荷包蛋慶祝下。

看到這個截圖,內心深處竟然會有一種共情,嘴角不自禁的上揚。

我又想起:2016年,ElasticJob的作者張亮老師開源了sharding-jdbc 。我在github上創建了一個私有項目,參考sharding-jdbc的源碼,自己實現分庫分表的功能。第一個類名叫:ShardingDataSource,時間定格在 2016/3/29。

我不知道如何定義“有創造力的軟件工程師”,但我相信:一個有好奇心,努力學習,樂于分享,愿意去幫助別人的工程師,運氣肯定不會太差。

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

2022-04-25 15:01:07

系統程序員調度

2018-07-17 15:15:33

任務調度系統

2025-04-07 04:00:00

教學型任務調度系統

2019-07-19 15:51:11

框架選型分布式

2021-01-26 10:33:45

前端開發技術

2024-09-23 04:00:00

java架構分布式系統

2023-09-16 18:16:57

Python系統

2022-09-21 12:01:22

消息隊列任務隊列任務調度

2021-05-13 12:00:51

cron調度任務系統運維

2023-05-08 16:38:46

任務調度分布式任務調度

2017-12-12 15:24:32

Web Server單線程實現

2024-08-07 08:15:47

2022-04-08 09:52:13

前端監控系統

2018-09-18 09:38:11

RPC遠程調用網絡通信

2023-12-26 07:44:00

Spring定時調度

2022-11-29 17:34:43

虛擬形象系統

2024-03-14 09:07:05

刷數任務維度后端

2022-12-29 08:32:50

xxl-job緩存Schedule

2023-02-26 01:37:57

goORM代碼

2020-08-17 08:20:16

iOSAOP框架
點贊
收藏

51CTO技術棧公眾號

欧美久久久久| 欧美日韩黄网站| 亚洲国产精品传媒在线观看| 国产精品久久中文| 日本高清一二三区| 99re6热只有精品免费观看| 精品国产乱码久久久久久婷婷| 欧美欧美一区二区| 国产伦理一区二区| 99热在线精品观看| 日韩有码在线电影| 在线免费观看污视频| 黄色成人在线视频| 有坂深雪av一区二区精品| 久久久久久久久四区三区| 在线观看色网站| 亚洲国产专区| 日韩亚洲综合在线| 日本少妇色视频| 国产在线一区不卡| 色屁屁一区二区| 国产成人一区二区三区别| 国产精品视频一区二区久久| 国产一区三区三区| 国产成人精品优优av| 精品少妇久久久| 99精品美女| 亚洲网站在线观看| 日韩 中文字幕| 欧美成人精品一级| 欧美视频中文一区二区三区在线观看| 日本大片免费看| 麻豆传媒视频在线观看免费| 久久综合色8888| 国产伦精品一区二区三区| 亚洲一区二区人妻| 日韩精品亚洲一区| 97超碰色婷婷| 日本三级一区二区| 国产综合久久| 欧美日韩国产成人高清视频| 特级西西人体高清大胆| 亚洲日产av中文字幕| 精品少妇一区二区三区免费观看| 91福利国产成人精品播放| 韩国美女久久| 色悠悠久久综合| 97国产精东麻豆人妻电影| 青春草免费在线视频| 亚洲欧美激情小说另类| 亚洲日本欧美在线| 在线免费看av| 亚洲国产精品国自产拍av| 奇米精品在线| 国产中文字幕在线视频| 久久这里只有精品视频网| 国语精品免费视频| 亚洲av成人精品日韩在线播放| 成人一区二区三区在线观看| 亚洲淫片在线视频| 亚洲第一视频在线播放| 国产成人综合精品三级| 不卡视频一区二区| 成人免费视频国产免费麻豆| 成人污污视频在线观看| 国产日韩一区欧美| 免费在线黄色网址| 欧美韩日一区二区三区四区| 一区二区不卡在线| 大片免费在线观看| 夜色激情一区二区| 黄色成人在线看| 高潮一区二区| 欧美专区在线观看一区| 国产精品久久a| av在线播放一区二区| 日韩一级成人av| 国产xxxx视频| 精品国产一区二区三区噜噜噜| 亚洲香蕉成视频在线观看| 国产农村妇女精品一区| 婷婷另类小说| 久久久久久国产精品美女| 黄色一级片免费看| 日韩一区精品字幕| 91在线观看免费高清| 人妻va精品va欧美va| 久久综合久久久久88| 色狠狠久久av五月综合| 最新日本在线观看| 欧美性猛交99久久久久99按摩| 午夜欧美福利视频| 精品视频在线播放一区二区三区| 日韩欧美国产午夜精品| 人妻丰满熟妇av无码久久洗澡| 精品国产一区二区三区小蝌蚪 | 激情av一区二区| 50路60路老熟妇啪啪| **日韩最新| 日韩国产在线看| 香蕉成人在线视频| 韩日精品视频| 国产精品久久久久久超碰| 国产人妻精品一区二区三区| 99国产精品久久| 26uuu成人| 中文在线аv在线| 日韩欧美一级精品久久| www.黄色在线| 激情丁香综合| 国产欧美一区二区| 午夜视频免费在线| 综合色天天鬼久久鬼色| 精品视频一区二区在线| 亚洲网址在线观看| 国产一区av在线| 亚洲一区二区91| 久久精品国产亚洲a| 国产一区二区无遮挡| 免费大片黄在线观看视频网站| 午夜精品福利一区二区三区av | 伊人久久大香伊蕉在人线观看热v| 亚洲精品在线免费播放| 三级黄色免费观看| 久久三级视频| 国产在线精品二区| 中文av资源在线| 欧美人狂配大交3d怪物一区| 男人天堂av电影| 亚洲美女视频在线免费观看| 91亚洲精品一区二区| 99青草视频在线播放视| 欧美午夜精品久久久久久浪潮| 无码人妻aⅴ一区二区三区玉蒲团| 日韩成人精品一区| 国产精品狠色婷| 免费在线视频你懂得| 欧美性xxxxx极品| 中文文字幕文字幕高清| 国产综合色产| 成人欧美一区二区三区黑人免费| 免费黄色电影在线观看| 欧美日韩一级二级| 日本不卡一区视频| 久久成人18免费观看| 色就是色欧美| 福利一区二区免费视频| 亚洲一区二区福利| 色老头在线视频| 国产欧美精品国产国产专区| 精品日韩久久久| 青青草原综合久久大伊人精品| 国产精品国语对白| 视频免费一区| 在线不卡的av| 免费在线观看一级片| 国产精品99久| 成人一级生活片| 精品国产一区二区三区成人影院 | 欧美亚洲大片| 亚洲视频国产视频| av资源吧首页| 东方欧美亚洲色图在线| 日韩伦理在线免费观看| 91欧美极品| 久久久久久成人| 亚洲第一黄色片| 黑人巨大精品欧美一区二区三区| 亚洲av无码专区在线播放中文| 欧美精选一区| 国产欧美日韩一区| 亚洲欧洲美洲av| 亚洲色图美腿丝袜| 欧美 亚洲 另类 激情 另类| 国产女主播视频一区二区| 91淫黄看大片| 欧美一区久久| 国产伦精品一区二区三| 偷拍自拍在线看| 亚洲视频欧洲视频| 自拍偷拍校园春色| 亚洲同性gay激情无套| 亚洲欧美日韩一二三区| 韩国在线一区| 欧美精品国产精品久久久 | 国产91色在线播放| av网站在线免费观看| 欧美日韩不卡在线| 国产黄色的视频| 成人午夜免费视频| 亚洲综合在线网站| 亚洲精品二区三区| 国产美女99p| 不卡av播放| 色av中文字幕一区| 农村少妇久久久久久久| 色域天天综合网| 国产黄在线免费观看| 成人av在线影院| 亚洲天堂2018av| 黄色工厂这里只有精品| 你懂的视频在线一区二区| yw.尤物在线精品视频| 中文字幕精品久久| 黄色小视频免费观看| 一本一道综合狠狠老| 激情无码人妻又粗又大| 丁香婷婷综合激情五月色| 国产91xxx| 亚洲精品99| 欧美日韩国产精品一区二区| 亚洲精品毛片| 91精品国产91久久久久久不卡| 色老头视频在线观看| 精品第一国产综合精品aⅴ| 极品国产91在线网站| 国产精品久久久久久久久晋中 | 亚洲一区二区av| 欧美亚洲国产日韩2020| 久久久久久久久免费视频| 欧美一级二级三级乱码| 中文字幕观看在线| 精品久久久久久电影| 午夜精品一区二区三级视频| 91丨九色porny丨蝌蚪| 日本少妇一级片| 毛片av一区二区| 丰满人妻中伦妇伦精品app| 在线观看免费一区二区| 精品国产乱码久久久久久88av | 欧美日韩免费一区二区三区视频| 久久久久亚洲AV| 国产精品成人午夜| 成人啪啪18免费游戏链接| 日本麻豆一区二区三区视频| 久久99中文字幕| 欧美日本一区二区视频在线观看| 在线免费一区| 成人写真视频| 欧美精品v日韩精品v国产精品| 日韩三级不卡| 亚洲最大成人网色| 成人在线分类| 国产日韩亚洲欧美| 成人影院在线免费观看| 日本国产精品视频| 在线观看网站免费入口在线观看国内 | 国产视频一区二区在线观看| 97人妻精品一区二区三区免费| 久久国产精品色| 91视频这里只有精品| 日本视频在线一区| 国产精品69页| 天堂一区二区在线| 午夜在线观看av| 老司机午夜精品| 亚洲综合日韩欧美| 麻豆成人综合网| 亚洲一二三av| 精品在线观看免费| 97人人爽人人| 国产一区三区三区| 老司机午夜免费福利| 国产成人自拍在线| 在线观看一区二区三区四区| 国产.精品.日韩.另类.中文.在线.播放| 国产亚洲精品成人a| 国产成人综合在线| 亚洲啪av永久无码精品放毛片| 国产成人av一区二区三区在线| 亚洲第一成肉网| 国产精品88av| 国模私拍在线观看| 91影院在线观看| 污污内射在线观看一区二区少妇| 久久影院午夜片一区| 在线观看福利片| 国产亚洲福利社区一区| 一级黄色片大全| 中文字幕亚洲在| 毛片a片免费观看| 亚洲成av人**亚洲成av**| 精品亚洲永久免费| 色婷婷狠狠综合| 国产又黄又粗又硬| 欧美成人一区二区三区在线观看| 亚洲av无码一区二区三区dv| 亚洲精品有码在线| 欧美r级在线| 高清欧美性猛交xxxx| 手机在线观看av| 成人在线精品视频| 9l视频自拍蝌蚪9l视频成人| 久久久久久九九九九| 丝袜美腿综合| 日韩精品一区二区三区电影| 在线亚洲国产精品网站| 8x8x最新地址| 国产另类ts人妖一区二区| 艳妇乳肉豪妇荡乳xxx| 国产亚洲欧美日韩在线一区| 51精品免费网站| 亚洲宅男天堂在线观看无病毒 | 欧美日韩亚洲精品一区二区三区| 天天射天天干天天| 在线综合+亚洲+欧美中文字幕| 无码精品黑人一区二区三区| 国产一区二区美女视频| 日本伦理一区二区| 国产精品福利网站| 高清日韩中文字幕| 亚洲国产精品一区二区第一页| 欧美欧美天天天天操| 天天操,天天操| av成人免费在线观看| 婷婷丁香综合网| 狠狠躁18三区二区一区| 国产口爆吞精一区二区| 精品夜色国产国偷在线| 青青草原av在线| 91精品国产综合久久香蕉922| 偷拍自拍一区| 久久久久久av无码免费网站下载| 久久中文欧美| 岛国精品一区二区三区| 久久精品视频一区二区| 日本网站在线播放| 日韩欧美一级片| 久操视频在线播放| 国产欧美日韩精品在线观看| 日本久久成人网| 日韩欧美视频免费在线观看| 蜜臀精品一区二区三区在线观看| 国产精品久久久久久亚洲av| 中文字幕一区在线| 日本成人一级片| 精品噜噜噜噜久久久久久久久试看| 色网站在线看| 国产精品伦子伦免费视频| 一本色道久久综合亚洲精品酒店| 国产在线播放观看| 国产91精品欧美| 久久久久久视频| 黑人巨大精品欧美一区二区| 三级在线观看网站| 久久久久日韩精品久久久男男| 亚洲成人1区| www.亚洲一区二区| 麻豆国产精品官网| 999久久久国产| 欧美性大战久久久| 精品电影在线| 国产精品嫩草影院久久久| 国产欧美日韩视频在线| 各处沟厕大尺度偷拍女厕嘘嘘| 99久久精品免费看国产免费软件| 黄色一级视频在线观看| 欧美一区二区三区四区久久| 久久久久久久久免费视频| 3d动漫啪啪精品一区二区免费| 国产精品99久久久久久动医院| 久久人人爽av| 亚洲欧美国产三级| a级片在线视频| 欧美老妇交乱视频| 亚洲三区欧美一区国产二区| 日韩中字在线观看| 91啪亚洲精品| 波多野结衣在线观看一区| 色一情一乱一区二区| 日韩久久99| 综合网五月天| 国产91丝袜在线播放九色| 日韩精品――中文字幕| 日韩av综合网站| 久久免费影院| 男女激烈动态图| 懂色av一区二区三区免费观看| 国产区一区二区三| 伊人成人开心激情综合网| 啪啪av大全导航福利综合导航| japanese在线播放| 成人av电影在线网| 亚洲不卡视频在线观看| 尤物九九久久国产精品的特点 | 伊人蜜桃色噜噜激情综合| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 五月激情综合色| 久久久久久久久亚洲精品| 日本伊人精品一区二区三区介绍| 欧美午夜精品一区二区三区电影| 欧美一级视频在线| 亚洲三级电影网站| 色视频免费在线观看| 国产精品久久久久国产a级| 一个色综合网| 亚洲精品91在线| 欧美成人福利视频| 成人免费看视频网站| 热久久最新网址|