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

鳥瞰 Java 并發框架

開發 架構
幾年前 NoSQL 開始流行的時候,像其他團隊一樣,我們的團隊也熱衷于令人興奮的新東西,并且計劃替換一個應用程序的數據庫。

[[271016]]

1. 為什么要寫這篇文章

幾年前 NoSQL 開始流行的時候,像其他團隊一樣,我們的團隊也熱衷于令人興奮的新東西,并且計劃替換一個應用程序的數據庫。但是,當深入實現細節時,我們想起了一位智者曾經說過的話:“細節決定成敗”。最終我們意識到 NoSQL 不是解決所有問題的銀彈,而 NoSQL vs RDMS 的答案是:“視情況而定”。類似地,去年RxJava 和 Spring Reactor 這樣的并發庫加入了讓人充滿激情的語句,如異步非阻塞方法等。為了避免再犯同樣的錯誤,我們嘗試評估諸如 ExecutorService、 RxJava、Disruptor 和 Akka 這些并發框架彼此之間的差異,以及如何確定各自框架的正確用法。

本文中用到的術語在這里有更詳細的描述。

2. 分析并發框架的示例用例

3. 快速更新線程配置

在開始比較并發框架的之前,讓我們快速復習一下如何配置最優線程數以提高并行任務的性能。這個理論適用于所有框架,并且在所有框架中使用相同的線程配置來度量性能。

  • 對于內存任務,線程的數量大約等于具有***性能的內核的數量,盡管它可以根據各自處理器中的超線程特性進行一些更改。
    • 例如,在8核機器中,如果對應用程序的每個請求都必須在內存中并行執行4個任務,那么這臺機器上的負載應該保持為 @2 req/sec,在 ThreadPool 中保持8個線程。
  • 對于 I/O 任務,ExecutorService 中配置的線程數應該取決于外部服務的延遲。
    • 與內存中的任務不同,I/O 任務中涉及的線程將被阻塞,并處于等待狀態,直到外部服務響應或超時。因此,當涉及 I/O 任務線程被阻塞時,應該增加線程的數量,以處理來自并發請求的額外負載。
    • I/O 任務的線程數應該以保守的方式增加,因為處于活動狀態的許多線程帶來了上下文切換的成本,這將影響應用程序的性能。為了避免這種情況,應該根據 I/O 任務中涉及的線程的等待時間按比例增加此機器的線程的確切數量以及負載。

參考: http://baddotrobot.com/blog/2013/06/01/optimum-number-of-threads/

4. 性能測試結果

性能測試配置 GCP -> 處理器:Intel(R) Xeon(R) CPU @ 2.30GHz;架構:x86_64;CPU 內核:8個(注意:這些結果僅對該配置有意義,并不表示一個框架比另一個框架更好)。

5. 使用執行器服務并行化 IO 任務

5.1 何時使用?

如果一個應用程序部署在多個節點上,并且每個節點的 req/sec 小于可用的核心數量,那么 ExecutorService 可用于并行化任務,更快地執行代碼。

5.2 什么時候適用?

如果一個應用程序部署在多個節點上,并且每個節點的 req/sec 遠遠高于可用的核心數量,那么使用 ExecutorService 進一步并行化只會使情況變得更糟。

當外部服務延遲增加到 400ms 時,性能測試結果如下(請求速率 @50 req/sec,8核)。

5.3 所有任務按順序執行示例

  1. // I/O 任務:調用外部服務 
  2. String posts = JsonService.getPosts(); 
  3. String comments = JsonService.getComments(); 
  4. String albums = JsonService.getAlbums(); 
  5. String photos = JsonService.getPhotos(); 
  6.  
  7. // 合并來自外部服務的響應 
  8. // (內存中的任務將作為此操作的一部分執行) 
  9. int userId = new Random().nextInt(10) + 1; 
  10. String postsAndCommentsOfRandomUser = ResponseUtil.getPostsAndCommentsOfRandomUser(userId, posts, comments); 
  11. String albumsAndPhotosOfRandomUser = ResponseUtil.getAlbumsAndPhotosOfRandomUser(userId, albums, photos); 
  12.  
  13. // 構建最終響應并將其發送回客戶端 
  14. String response = postsAndCommentsOfRandomUser + albumsAndPhotosOfRandomUser; 
  15. return response; 

5.4 I/O 任務與 ExecutorService 并行執行代碼示例

  1. // 添加 I/O 任務 
  2. List<Callable<String>> ioCallableTasks = new ArrayList<>(); 
  3. ioCallableTasks.add(JsonService::getPosts); 
  4. ioCallableTasks.add(JsonService::getComments); 
  5. ioCallableTasks.add(JsonService::getAlbums); 
  6. ioCallableTasks.add(JsonService::getPhotos); 
  7.  
  8. // 調用所有并行任務 
  9. ExecutorService ioExecutorService = CustomThreads.getExecutorService(ioPoolSize); 
  10. List<Future<String>> futuresOfIOTasks = ioExecutorService.invokeAll(ioCallableTasks); 
  11.  
  12. // 獲取 I/O  操作(阻塞調用)結果 
  13. String posts = futuresOfIOTasks.get(0).get(); 
  14. String comments = futuresOfIOTasks.get(1).get(); 
  15. String albums = futuresOfIOTasks.get(2).get(); 
  16. String photos = futuresOfIOTasks.get(3).get(); 
  17.  
  18. // 合并響應(內存中的任務是此操作的一部分) 
  19. String postsAndCommentsOfRandomUser = ResponseUtil.getPostsAndCommentsOfRandomUser(userId, posts, comments); 
  20. String albumsAndPhotosOfRandomUser = ResponseUtil.getAlbumsAndPhotosOfRandomUser(userId, albums, photos); 
  21.  
  22. // 構建最終響應并將其發送回客戶端 
  23. return postsAndCommentsOfRandomUser + albumsAndPhotosOfRandomUser; 

6. 使用執行器服務并行化 IO 任務(CompletableFuture)

與上述情況類似:處理傳入請求的 HTTP 線程被阻塞,而 CompletableFuture 用于處理并行任務。

6.1 何時使用?

如果沒有 AsyncResponse,性能與 ExecutorService 相同。如果多個 API 調用必須異步并且鏈接起來,那么這種方法更好(類似 Node 中的 Promises)。

  1. ExecutorService ioExecutorService = CustomThreads.getExecutorService(ioPoolSize); 
  2.  
  3. // I/O 任務 
  4. CompletableFuture<String> postsFuture = CompletableFuture.supplyAsync(JsonService::getPosts, ioExecutorService); 
  5. CompletableFuture<String> commentsFuture = CompletableFuture.supplyAsync(JsonService::getComments, 
  6.     ioExecutorService); 
  7. CompletableFuture<String> albumsFuture = CompletableFuture.supplyAsync(JsonService::getAlbums, 
  8.     ioExecutorService); 
  9. CompletableFuture<String> photosFuture = CompletableFuture.supplyAsync(JsonService::getPhotos, 
  10.     ioExecutorService); 
  11. CompletableFuture.allOf(postsFuture, commentsFuture, albumsFuture, photosFuture).get(); 
  12.  
  13. // 從 I/O 任務(阻塞調用)獲得響應 
  14. String posts = postsFuture.get(); 
  15. String comments = commentsFuture.get(); 
  16. String albums = albumsFuture.get(); 
  17. String photos = photosFuture.get(); 
  18.  
  19. // 合并響應(內存中的任務將是此操作的一部分) 
  20. String postsAndCommentsOfRandomUser = ResponseUtil.getPostsAndCommentsOfRandomUser(userId, posts, comments); 
  21. String albumsAndPhotosOfRandomUser = ResponseUtil.getAlbumsAndPhotosOfRandomUser(userId, albums, photos); 
  22.  
  23. // 構建最終響應并將其發送回客戶端 
  24. return postsAndCommentsOfRandomUser + albumsAndPhotosOfRandomUser; 

7. 使用 ExecutorService 并行處理所有任務

使用 ExecutorService 并行處理所有任務,并使用 @suspended AsyncResponse response 以非阻塞方式發送響應。

圖片來自 http://tutorials.jenkov.com/java-nio/nio-vs-io.html

  • HTTP 線程處理傳入請求的連接,并將處理傳遞給 Executor Pool,當所有任務完成后,另一個 HTTP 線程將把響應發送回客戶端(異步非阻塞)。
  • 性能下降原因:
    • 在同步通信中,盡管 I/O 任務中涉及的線程被阻塞,但是只要進程有額外的線程來承擔并發請求負載,它仍然處于運行狀態。
    • 因此,以非阻塞方式保持線程所帶來的好處非常少,而且在此模式中處理請求所涉及的成本似乎很高。
    • 通常,對這里討論采用的例子使用異步非阻塞方法會降低應用程序的性能。

7.1 何時使用?

如果用例類似于服務器端聊天應用程序,在客戶端響應之前,線程不需要保持連接,那么異步、非阻塞方法比同步通信更受歡迎。在這些用例中,系統資源可以通過異步、非阻塞方法得到更好的利用,而不僅僅是等待。

  1. // 為異步執行提交并行任務 
  2. ExecutorService ioExecutorService = CustomThreads.getExecutorService(ioPoolSize); 
  3. CompletableFuture<String> postsFuture = CompletableFuture.supplyAsync(JsonService::getPosts, ioExecutorService); 
  4. CompletableFuture<String> commentsFuture = CompletableFuture.supplyAsync(JsonService::getComments, 
  5. ioExecutorService); 
  6. CompletableFuture<String> albumsFuture = CompletableFuture.supplyAsync(JsonService::getAlbums, 
  7. ioExecutorService); 
  8. CompletableFuture<String> photosFuture = CompletableFuture.supplyAsync(JsonService::getPhotos, 
  9. ioExecutorService); 
  10.  
  11. // 當 /posts API 返回響應時,它將與來自 /comments API 的響應結合在一起 
  12. // 作為這個操作的一部分,將執行內存中的一些任務 
  13. CompletableFuture<String> postsAndCommentsFuture = postsFuture.thenCombineAsync(commentsFuture, 
  14. (posts, comments) -> ResponseUtil.getPostsAndCommentsOfRandomUser(userId, posts, comments), 
  15. ioExecutorService); 
  16.  
  17. // 當 /albums API 返回響應時,它將與來自 /photos API 的響應結合在一起 
  18. // 作為這個操作的一部分,將執行內存中的一些任務 
  19. CompletableFuture<String> albumsAndPhotosFuture = albumsFuture.thenCombineAsync(photosFuture, 
  20. (albums, photos) -> ResponseUtil.getAlbumsAndPhotosOfRandomUser(userId, albums, photos), 
  21. ioExecutorService); 
  22.  
  23. // 構建最終響應并恢復 http 連接,把響應發送回客戶端 
  24. postsAndCommentsFuture.thenAcceptBothAsync(albumsAndPhotosFuture, (s1, s2) -> { 
  25. LOG.info("Building Async Response in Thread " + Thread.currentThread().getName()); 
  26. String response = s1 + s2; 
  27. asyncHttpResponse.resume(response); 
  28. }, ioExecutorService); 

8. RxJava

  • 這與上面的情況類似,唯一的區別是 RxJava 提供了更好的 DSL 可以進行流式編程,下面的例子中沒有體現這一點。
  • 性能優于 CompletableFuture 處理并行任務。

8.1 何時使用?

如果編碼的場景適合異步非阻塞方式,那么可以*** RxJava 或任何響應式開發庫。還具有諸如 back-pressure 之類的附加功能,可以在生產者和消費者之間平衡負載。

  1. int userId = new Random().nextInt(10) + 1; 
  2. ExecutorService executor = CustomThreads.getExecutorService(8); 
  3.  
  4. // I/O 任務 
  5. Observable<String> postsObservable = Observable.just(userId).map(o -> JsonService.getPosts()) 
  6. .subscribeOn(Schedulers.from(executor)); 
  7. Observable<String> commentsObservable = Observable.just(userId).map(o -> JsonService.getComments()) 
  8. .subscribeOn(Schedulers.from(executor)); 
  9. Observable<String> albumsObservable = Observable.just(userId).map(o -> JsonService.getAlbums()) 
  10. .subscribeOn(Schedulers.from(executor)); 
  11. Observable<String> photosObservable = Observable.just(userId).map(o -> JsonService.getPhotos()) 
  12. .subscribeOn(Schedulers.from(executor)); 
  13.  
  14. // 合并來自 /posts 和 /comments API 的響應 
  15. // 作為這個操作的一部分,將執行內存中的一些任務 
  16. Observable<String> postsAndCommentsObservable = Observable 
  17. .zip(postsObservable, commentsObservable, 
  18. (posts, comments) -> ResponseUtil.getPostsAndCommentsOfRandomUser(userId, posts, comments)) 
  19. .subscribeOn(Schedulers.from(executor)); 
  20.  
  21. // 合并來自 /albums 和 /photos API 的響應 
  22. // 作為這個操作的一部分,將執行內存中的一些任務 
  23. Observable<String> albumsAndPhotosObservable = Observable 
  24. .zip(albumsObservable, photosObservable, 
  25. (albums, photos) -> ResponseUtil.getAlbumsAndPhotosOfRandomUser(userId, albums, photos)) 
  26. .subscribeOn(Schedulers.from(executor)); 
  27.  
  28. // 構建最終響應 
  29. Observable.zip(postsAndCommentsObservable, albumsAndPhotosObservable, (r1, r2) -> r1 + r2) 
  30. .subscribeOn(Schedulers.from(executor)) 
  31. .subscribe((response) -> asyncResponse.resume(response), e -> asyncResponse.resume("error")); 

9. Disruptor

[Queue vs RingBuffer]

圖片1:http://tutorials.jenkov.com/java-concurrency/blocking-queues.html

圖片2:https://www.baeldung.com/lmax-disruptor-concurrency

  • 在本例中,HTTP 線程將被阻塞,直到 disruptor 完成任務,并且使用 countdowlatch 將 HTTP 線程與 ExecutorService 中的線程同步。
  • 這個框架的主要特點是在沒有任何鎖的情況下處理線程間通信。在 ExecutorService 中,生產者和消費者之間的數據將通過 Queue傳遞,在生產者和消費者之間的數據傳輸過程中涉及到一個鎖。Disruptor 框架通過一個名為 Ring Buffer 的數據結構(它是循環數組隊列的擴展版本)來處理這種生產者-消費者通信,并且不需要任何鎖。
  • 這個庫不適用于我們在這里討論的這種用例。僅出于好奇而添加。

9.1 何時使用?

Disruptor 框架在下列場合性能更好:與事件驅動的體系結構一起使用,或主要關注內存任務的單個生產者和多個消費者。

  1. static { 
  2.     int userId = new Random().nextInt(10) + 1; 
  3.  
  4.     // 示例 Event-Handler; count down latch 用于使線程與 http 線程同步 
  5.     EventHandler<Event> postsApiHandler = (event, sequence, endOfBatch) -> { 
  6.         event.posts = JsonService.getPosts(); 
  7.         event.countDownLatch.countDown(); 
  8.     }; 
  9.  
  10.     // 配置 Disputor 用于處理事件 
  11.     DISRUPTOR.handleEventsWith(postsApiHandler, commentsApiHandler, albumsApiHandler) 
  12.     .handleEventsWithWorkerPool(photosApiHandler1, photosApiHandler2) 
  13.     .thenHandleEventsWithWorkerPool(postsAndCommentsResponseHandler1, postsAndCommentsResponseHandler2) 
  14.     .handleEventsWithWorkerPool(albumsAndPhotosResponseHandler1, albumsAndPhotosResponseHandler2); 
  15.     DISRUPTOR.start(); 
  16.  
  17. // 對于每個請求,在 RingBuffer 中發布一個事件: 
  18. Event event = null
  19. RingBuffer<Event> ringBuffer = DISRUPTOR.getRingBuffer(); 
  20. long sequence = ringBuffer.next(); 
  21. CountDownLatch countDownLatch = new CountDownLatch(6); 
  22. try { 
  23.     event = ringBuffer.get(sequence); 
  24.     event.countDownLatch = countDownLatch; 
  25.     event.startTime = System.currentTimeMillis(); 
  26. } finally { 
  27.     ringBuffer.publish(sequence); 
  28. try { 
  29.     event.countDownLatch.await(); 
  30. } catch (InterruptedException e) { 
  31.     e.printStackTrace(); 

10. Akka

圖片來自:https://blog.codecentric.de/en/2015/08/introduction-to-akka-actors/

  • Akka 庫的主要優勢在于它擁有構建分布式系統的本地支持。
  • 它運行在一個叫做 Actor System 的系統上。這個系統抽象了線程的概念,Actor System 中的 Actor 通過異步消息進行通信,這類似于生產者和消費者之間的通信。
  • 這種額外的抽象級別有助于 Actor System 提供諸如容錯、位置透明等特性。
  • 使用正確的 Actor-to-Thread 策略,可以對該框架進行優化,使其性能優于上表所示的結果。雖然它不能在單個節點上與傳統方法的性能匹敵,但是由于其構建分布式和彈性系統的能力,仍然是***。

10.1 示例代碼

  1. // 來自 controller : 
  2. Actors.masterActor.tell(new Master.Request("Get Response", event, Actors.workerActor), ActorRef.noSender()); 
  3.  
  4. // handler : 
  5. public Receive createReceive() { 
  6.     return receiveBuilder().match(Request.class, request -> { 
  7.     Event event = request.event; // Ideally, immutable data structures should be used here. 
  8.     request.worker.tell(new JsonServiceWorker.Request("posts", event), getSelf()); 
  9.     request.worker.tell(new JsonServiceWorker.Request("comments", event), getSelf()); 
  10.     request.worker.tell(new JsonServiceWorker.Request("albums", event), getSelf()); 
  11.     request.worker.tell(new JsonServiceWorker.Request("photos", event), getSelf()); 
  12.     }).match(Event.class, e -> { 
  13.     if (e.posts != null && e.comments != null & e.albums != null & e.photos != null) { 
  14.     int userId = new Random().nextInt(10) + 1; 
  15.     String postsAndCommentsOfRandomUser = ResponseUtil.getPostsAndCommentsOfRandomUser(userId, e.posts, 
  16.     e.comments); 
  17.     String albumsAndPhotosOfRandomUser = ResponseUtil.getAlbumsAndPhotosOfRandomUser(userId, e.albums, 
  18.     e.photos); 
  19.     String response = postsAndCommentsOfRandomUser + albumsAndPhotosOfRandomUser; 
  20.     e.response = response; 
  21.     e.countDownLatch.countDown(); 
  22.     } 
  23.     }).build(); 

11. 總結

  • 根據機器的負載決定 Executor 框架的配置,并檢查是否可以根據應用程序中并行任務的數量進行負載平衡。
  • 對于大多數傳統應用程序來說,使用響應式開發庫或任何異步庫都會降低性能。只有當用例類似于服務器端聊天應用程序時,這個模式才有用,其中線程在客戶機響應之前不需要保留連接。
  • Disruptor 框架在與事件驅動的架構模式一起使用時性能很好;但是當 Disruptor 模式與傳統架構混合使用時,就我們在這里討論的用例而言,它并不符合標準。這里需要注意的是,Akka 和 Disruptor 庫值得單獨寫一篇文章,介紹如何使用它們來實現事件驅動的架構模式。
  • 這篇文章的源代碼可以在 GitHub 上找到。

 

責任編輯:武曉燕 來源: 純潔的微笑
相關推薦

2017-02-14 10:00:19

Java開發Lock

2012-03-06 11:01:44

Java

2013-07-22 09:59:36

日本大數據大數據

2017-08-07 20:50:27

JavaForkJoin

2017-08-04 11:41:53

Javathreadpool框架

2012-02-13 09:57:51

JavaDisruptor

2012-08-08 09:32:26

C++多進程并發框架

2010-05-04 08:44:42

Java并發模型

2012-05-10 10:18:14

JavaDisruptor

2024-08-26 09:51:57

2020-12-16 10:54:52

編程ForkJoin框架

2025-04-23 08:31:26

Java并發框架

2017-09-19 14:53:37

Java并發編程并發代碼設計

2012-08-09 08:56:34

C++

2024-04-16 09:50:23

點云跟蹤框架

2012-07-10 11:08:52

asyncoro

2022-05-11 07:36:12

Java線程安全

2025-06-10 10:15:00

Java容器并發

2023-12-14 07:36:16

Java并發原子類

2014-05-20 16:27:35

JVMScala
點贊
收藏

51CTO技術棧公眾號

5566日本婷婷色中文字幕97| 亚洲国产婷婷香蕉久久久久久| 亚洲7777| xxxx国产精品| 蜜桃av综合| 日韩视频在线免费观看| 国产吃瓜黑料一区二区| 亚洲天堂手机| 亚洲欧美日韩国产另类专区| 精品欧美日韩| 国产精品污视频| 国产亚洲综合精品| 久久av.com| 丝袜美腿中文字幕| 粉嫩一区二区三区在线观看| 午夜不卡在线视频| 中文字幕欧美日韩一区二区三区| 亚洲精品久久久久久动漫器材一区 | 水蜜桃亚洲精品| 亚洲毛片在线播放| 蜜臀va亚洲va欧美va天堂 | 亚洲国产精品va在线| 狠狠躁狠狠躁视频专区| 国产在线88av| 亚洲欧美国产77777| 青青草原成人| 日韩在线观看视频一区| 国内精品免费**视频| 国产精品18久久久久久麻辣| 国产精品第九页| 久久久久久久久久久9不雅视频| 亚洲男女性事视频| chinese麻豆新拍video| 亚洲综合网站| 91精品国产全国免费观看 | 成人黄页网站视频| 一本到高清视频免费精品| 久久人人爽人人爽人人av| 嫩草香蕉在线91一二三区| 国产视频视频一区| 欧美极品一区| 免费福利在线观看| 99久久99久久综合| 国产一区不卡在线观看| 动漫av一区二区三区| 高清在线不卡av| 99在线观看| 亚洲不卡免费视频| 国产成人在线电影| 97人人干人人| 亚洲第一免费视频| 国产suv精品一区二区三区| 亚洲在线观看视频| 国产高清免费av| 国产乱码精品一区二区三区av| 成人春色激情网| 国产精品久久久久久免费免熟| 麻豆一区二区在线| 成人写真福利网| 精品久久久久中文慕人妻| 国产一区二区看久久| 亚洲伊人久久大香线蕉av| 国产免费av观看| 国产精品一区二区在线观看不卡 | 日韩伦理一区二区三区| 日韩精品中文字幕视频在线| 中文幕无线码中文字蜜桃| 美女精品一区最新中文字幕一区二区三区| 日韩精品中文字幕在线| 免费观看a级片| 欧美成人精品一区二区三区在线看| 色妞在线综合亚洲欧美| 91aaa在线观看| 亚洲深夜福利| 国产精品视频区1| 国产欧美久久久精品免费| 亚洲国产另类 国产精品国产免费| 亚洲免费黄色录像| 香蕉大人久久国产成人av| 日韩欧美aaaaaa| 女同性恋一区二区三区| 国产成人影院| 精品国产一区二区三区在线观看 | 国产精品人成电影| 国产乱淫av片免费| 成人动漫一区二区三区| 欧美日韩一区二区三区在线视频| 阿v免费在线观看| 一区二区三区四区精品在线视频| 国产妇女馒头高清泬20p多| 日韩福利一区| 日韩欧美久久一区| 亚洲国产无码精品| 亚洲成人tv| 欧美一级免费看| 国产精品久久久久久久免费| 99久久久国产精品免费蜜臀| 一区二区三区在线视频111| 国内高清免费在线视频| 欧美在线观看一区二区| jjzz黄色片| 日韩欧美精品综合| 性欧美长视频免费观看不卡 | 日韩免费视频一区二区| 人人妻人人藻人人爽欧美一区| 91欧美在线| 欧美在线一级视频| 精品人妻午夜一区二区三区四区| 久久亚洲精华国产精华液 | 国产美女高潮在线| 91精品国产免费| 成人国产精品久久久网站| 午夜性色一区二区三区免费视频| 日本高清不卡在线| 亚洲国产欧美另类| 中文字幕一区二区三区在线播放| 116极品美女午夜一级| 亚洲一级大片| 久久久精品在线观看| 日韩在线 中文字幕| 成人免费视频国产在线观看| 国产又粗又爽又黄的视频| 日本综合字幕| 日韩精品在线观| 国产无套在线观看| 国产精品自在欧美一区| 亚洲欧洲一区二区| 色婷婷综合久久久中字幕精品久久 | 亚洲人成网站77777在线观看| 欧美美女18p| 91亚洲国产成人精品一区| 国产三级精品三级在线专区| 中文字幕无码精品亚洲35| 99re91这里只有精品| 久久99热精品这里久久精品| 一级日韩一级欧美| 国产三区在线成人av| 黑人糟蹋人妻hd中文字幕| 国产一区二区三区亚洲| 久久久久久网站| 成人毛片在线免费观看| 一卡二卡欧美日韩| 91精产国品一二三| 最新欧美人z0oozo0| 91传媒视频免费| 女子免费在线观看视频www| 91精品久久久久久久久99蜜臂| 国产视频123区| 蜜桃av一区二区三区电影| 日韩欧美视频一区二区三区四区| 在线免费日韩片| 亚洲色图第一页| 中文人妻熟女乱又乱精品| 中文字幕久久午夜不卡| 男女污污的视频| 成人免费a**址| 国产欧美中文字幕| 黄色在线视频网站| 欧美一区二区日韩| 国产亚洲欧美精品久久久www| 国产盗摄一区二区三区| 国产一二三在线视频| 美女一区2区| 国产不卡一区二区在线播放| 97超碰人人在线| 91精品国产手机| 国产在线视频99| 久久女同精品一区二区| 在线视频日韩一区| 国产精品传媒精东影业在线| 69堂成人精品视频免费| 韩日毛片在线观看| 亚洲一级黄色片| 国产剧情久久久| 亚洲成av人影院在线观看网| 中文字幕一区二区人妻在线不卡| 日韩黄色片在线观看| 91香蕉视频网址| 国产精东传媒成人av电影| 日本人成精品视频在线| 美女黄视频在线观看| 欧美精品一区男女天堂| 小泽玛利亚一区二区三区视频| 亚洲色图在线播放| 中文在线一区二区三区| 六月丁香婷婷色狠狠久久| 国产黄色片免费在线观看| 国产欧美日韩精品一区二区免费| 国产精品在线看| 成人免费一区二区三区牛牛| 亚洲视频国产视频| www.成人免费视频| 在线亚洲一区观看| 欧美日韩一级大片| 久久精品免费在线观看| 麻豆免费在线观看视频| 日韩福利电影在线观看| 亚洲爆乳无码精品aaa片蜜桃| 奇米狠狠一区二区三区| 国产精品二区二区三区| 成人影院在线免费观看| 国内精品400部情侣激情| 最新真实国产在线视频| 亚洲精品永久免费| av中文字幕在线免费观看| 91久久精品一区二区三区| 免费无码毛片一区二区app| 国产免费成人在线视频| 国产一级二级视频| 国产成人精品免费网站| 性欧美1819| 久久亚洲欧美| 六月婷婷在线视频| 综合av在线| 午夜精品区一区二区三| 自拍偷拍欧美一区| 国产一区二区无遮挡| 免费精品一区二区三区在线观看| 日韩av大片在线| 国产精品论坛| 久久久久久18| 性欧美1819sex性高清大胸| 日韩亚洲成人av在线| 国产中文字幕在线看| 日韩av在线网| 欧美特级特黄aaaaaa在线看| 日韩一二三区不卡| 国产又爽又黄免费软件| 欧美日韩一级视频| 亚洲综合成人av| 在线观看亚洲精品视频| 麻豆精品久久久久久久99蜜桃| 亚洲大片免费看| 久久精品免费av| 亚洲一二三四久久| 中文字幕av播放| 亚洲欧美一区二区三区极速播放 | 欧美性生活一区| 中文字幕精品无| 欧美亚洲禁片免费| 中文字幕无线码一区| 色8久久精品久久久久久蜜| 国产婷婷色一区二区在线观看| 欧美日韩国产一区二区| 日本少妇吞精囗交| 懂色av一区二区三区| 国产区一区二区三| 色诱视频网站一区| 亚洲 日本 欧美 中文幕| 欧美亚洲一区三区| 中文字幕在线观看免费| 欧美日韩国产色站一区二区三区| 最近中文字幕免费在线观看| 欧美日韩不卡一区二区| 国产aⅴ一区二区三区| 日韩精品一区二区三区蜜臀| 免费av网站在线播放| 亚洲精品www久久久久久广东| 少妇人妻一区二区| 亚洲嫩模很污视频| 一本一道波多野毛片中文在线 | 在线成人av电影| 久久精品亚洲欧美日韩精品中文字幕| 精品一区二区三区毛片| 一区二区亚洲| 熟妇人妻va精品中文字幕| 免费在线成人网| 中文字幕一二三区| 99国产精品一区| av手机在线播放| 亚洲特级片在线| 国产无遮挡裸体免费视频| 色噜噜狠狠色综合中国| 国产精品无码一区二区桃花视频| 欧美变态tickling挠脚心| 视频国产在线观看| 中文字幕一区电影| 金瓶狂野欧美性猛交xxxx| 69久久夜色精品国产69乱青草| 国产经典一区| 91免费版网站在线观看| 色天下一区二区三区| 一区二区不卡在线视频 午夜欧美不卡'| 影音先锋日韩在线| 5月婷婷6月丁香| 国产一区激情在线| 一出一进一爽一粗一大视频| 中文字幕在线不卡一区| 国产污片在线观看| 欧美少妇xxx| 欧美 日韩 国产 在线| 中文字幕国产精品| 成年网站在线视频网站| 国产精品狼人色视频一区| 国产成人精品亚洲线观看| 亚洲春色在线视频| 亚洲高清av| 国产5g成人5g天天爽| 久久久久国产精品免费免费搜索| 视频国产一区二区| 色综合天天天天做夜夜夜夜做| 99精品视频免费看| 影音先锋日韩有码| 国模精品视频| 99re视频在线观看| 久久视频国产| 激情六月丁香婷婷| 国产成人一区二区精品非洲| 中文字幕欧美激情极品| 欧美日韩在线视频一区二区| 国产aⅴ爽av久久久久成人| 中文字幕亚洲无线码a| 午夜不卡影院| 粉嫩高清一区二区三区精品视频 | 免费av一区| 日韩精品久久一区二区| 麻豆专区一区二区三区四区五区| 精品无码在线视频| 亚洲午夜av在线| 国产强被迫伦姧在线观看无码| 国产一区二区三区在线视频| 黄色软件视频在线观看| 国产99午夜精品一区二区三区| 色小子综合网| 九色91popny| 久久精品亚洲精品国产欧美| 99热只有这里有精品| 欧美精品一区二区精品网| 亚洲综合影视| 亚洲a在线播放| 亚洲一区二区| 超碰中文字幕在线观看| 国产精品国产自产拍高清av | 青青操国产视频| 欧美一区二区日韩| 1区2区3区在线视频| 91久热免费在线视频| 欧美成人精品一区二区三区在线看| 99视频在线视频| 国产精品美女久久久久aⅴ| 精品成人无码久久久久久| 亚洲片av在线| 成人自拍av| 五月天丁香综合久久国产| 免费观看在线色综合| 污污视频网站在线免费观看| 欧美挠脚心视频网站| 欧美极品视频| 亚洲伊人第一页| 伊人久久综合| 北岛玲一区二区| 91国产免费看| 日韩av中文| 成人av电影免费| 亚洲欧洲综合| 最近中文字幕免费| 欧美日韩综合一区| a级影片在线观看| 国产精品久久久久久久免费大片| 99成人免费视频| av女人的天堂| 在线播放国产精品二区一二区四区| 黄色网页在线看| 古典武侠综合av第一页| 国产视频一区免费看| 一级黄色性视频| 欧美猛男男办公室激情| 蜜臀av在线播放| 欧美一区二区三区成人久久片| 日韩成人精品在线| 精品国产国产综合精品| 欧美r级电影在线观看| 色综合亚洲图丝熟| 午夜精品一区二区三区四区| 国产精品一区免费视频| 日本中文在线播放| 少妇激情综合网| 999久久精品| 国产无套粉嫩白浆内谢的出处| 国产精品电影一区二区三区| 午夜精品在线播放| 国产91精品在线播放| 亚洲天天影视网| www在线观看免费视频| 3atv一区二区三区| 性感女国产在线| 亚洲欧美日韩不卡| 91女神在线视频| 国产人妻精品一区二区三| 97香蕉超级碰碰久久免费的优势| 成人在线丰满少妇av| 国产+高潮+白浆+无码| 欧美日韩国产系列| 在线观看v片| 亚洲天堂第一区| 中文欧美字幕免费| 手机看片福利在线| 亚洲字幕在线观看| 日韩成人一区二区三区在线观看| 妺妺窝人体色www婷婷|