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

Python 異步 IO 的未來(從 Web 后端開發的角度)

開發 后端
免責聲明:我是一個工程師,擁有10年以上的 WEB 后端開發經驗,大部分職業生涯都在編寫 Python代碼。所以本文大部分文字描述可能跟軟件開發的其他領域無關,同樣的,也跟使用 JVM 或 CLR 的開發者無關,他們只是用不同的方式解決問題。

免責聲明:我是一個工程師,擁有10年以上的 WEB 后端開發經驗,大部分職業生涯都在編寫 Python代碼。所以本文大部分文字描述可能跟軟件開發的其他領域無關,同樣的,也跟使用 JVM 或 CLR 的開發者無關,他們只是用不同的方式解決問題。

開發Web應用程序看起來與我們10年前做的有很大的不同。現在,我們用微服務建立的一切。它徹底改變了我們的應用程序的架構。

 2014年,如果你還在構建完整巨大的 web 應用程序,你需要改變這一行為,否則很快會被解雇

雖然我們的應用程序的設計發生了很大變化,但是我們的工具沒有。這里我要介紹未來我會如何編寫微服務。但是,首先,讓我們來看看我們有什么。

全局解釋鎖

對于聲名狼籍的Python GIL,Python的支持者說的比較多的是其他的腳本語言也有(Ruby,Perl,Node.js,還有一些)。對于不好的語言解釋器的設計,這是圣戰的源頭,但這對于web應用從來不是問題。我們總是以來許多進程共享一個數據庫。

在微服務面前,全局解釋鎖更加不是問題了。在大多數情況下,單個微服務甚至比十年前的典型web應用還小。盡管很小,它每秒也可以處理大量的請求,大多數是因為它針對查詢的類型,進行了高度的定制化和很好的調整。

而當構建的微服務需要等待其他服務回復的時間時,這開始成為一個問題。好戲由此開場。。。

 

 “異步I / O,或非阻塞I/ O是輸入/輸出處理的一種形式,它允許其他進程繼續在傳輸完成之前。”- 維基百科

任何異步庫基本是從左側到右側的流程來調整代碼的:

同步(左)與異步(右)請求進程對比圖

Python的異步I/O支持是相當的好。有一堆庫可以做這個工作(Twisted, Tornado, Gevent, Eventlet,這里僅列舉幾個)。每個庫都支持很多協議。你可以使用MySQL, Mongo, PostgreSQL, Redis, Memcache, ElasticSearch...,幾乎每個DB,和許多其他得服務。一些奇異的協議,像SSH或者Beanstalk只在幾個庫中支持。不過這些都不是問題,寫另一個協議或從一個I/O框架移植到另一個也不是很難。

當然,每一個I/O庫都支持客戶端和服務端HTTP。想必,這就是為什么HTTP是最常見的用于微服務之間通信的協議。不過大多數框架也支持各種其他協議(msgpack-rpc, thrift, zeromq, ice,這里僅列舉幾個)。

有很多框架存在,彼此在不同協議的使用便捷性和其他種類的并發抽象上的有所不同。當然對不同協議的支持已經變得越來越流行。直到Twisted在2002年發布,這種狀況才有所改變。是的,即使當python支持了yield和stacklessgreenlets出現,便捷性確實大大增加了,但是這也僅僅是增加一點點的便捷性。真正的改變是在2002年。

但是有些事情是大多數Python框架的弱項。當你在一個線程中操控很多個客戶端的請求時,你有可能把它們管道進單個連接中。也就是說,如果你在前端有三個GET請求,你可能向MySQL數據庫發送三次請求,但不等待回復。一旦收到(數據庫)的數據就盡快回復客戶端。就像上面圖中表示的,但是使用了單個DB連接。大多數python框架現在,在請求開始時從連接池中拉取一個連接,在請求結束時釋放連接,這樣高效的保證連接數目與同時請求數目相等。

對于多數數據庫來說,成千上萬個連接仍然是個問題。即使的典型的Sharding也無濟于事,因為對每個shard來說也是相同數目的連接。很多用戶采用了特殊的微服務(microservice)。這不僅僅是數據庫的問題,許多微服務(microservice)也同樣遇到這樣問題。

幸好asyncio架構允許更容易的構建流水線(pipelining),所以越來越多的asyncio協議采用這種技術。不幸的是連接代價巨大的數據庫(比如MySQL和PostgreSQL)使用了不支持(該技術)的C庫,而且沒有人有足夠的重視來寫一個更好的。

使用像Resque一樣的發布-訂閱

當前,許多工程團隊圍繞著發布-訂閱來構建微服務(microservices)架構。比如,他們運用RabbitMQ或者其競爭者之一的產品將所有內容發布成消息(message)。他們相信這是簡化他們的建構:

1.單總線(Single Bus),無須再考慮這個

2.能夠無需等待回復即可發布消息。不需要任何異步庫即可高效的獲取異步I/O

當部分工程師們以為這就是答案的時候,我認為這不適合普遍的情況。

 我認為將我的設計決策限制在使用特定插件及特定的消息調度算法不會解決我的所有網絡問題。

Zeromq 和 Nanomsg 方式

另一個頗具魅力的微服務架構是Zeromq。如果你對它不熟悉,你應該盡快了解它。Zeromq只不過是巧合的使用MQ(消息隊列)作為后綴,畢竟它不像 RabbitMQKafka以及其他的那樣擁有中心消息隊列。它是以socket形式工作在steroids。也就是說,它看起來就像常規的socket,確實會自動發送消息(分割TCP數據流為幀),重新連接,點對點平衡加載等等。

在 Zeromq 世界里有三種方式供你的服務于其他連接:

1.發布-訂閱,工作方式基本上和其他發布-訂閱應用程序相同

2.請求-回復,基本與RPC工作方式相同

3.Push-Pull,請求卻不需要回復,或者發布-訂閱發送消息到單一接收端(基于輪叫)

Nanomsg 做到了更多事情,它不僅支持上面提到的所有方式,而且增加了更多的通信模式(單就nanomsg而言):

1.監督者-應答者(Surveyor-respondent),允許向多點發送請求而且接收來至所有的請求

2.總線(Bus),允許向任何點發送消息

更多的是:nanomsg的前景在于通信模式是插件式的,也就是說,在未來更多的通信模式會被增加到庫中。

 

 我相信更多的通信模式會出現,而使用發布-訂閱或者HTTP難逃厄運

像nanomsg和zeromq作為腳本語言的優勢是:它們在一個單獨的線程中操控I/O。所以當你使用python做一些事情操控全局解釋器鎖(GIL)時,你的zeromq線程保持你的連接,清空消息緩沖器,接收和建立連接等等。

真實世界中的微服務

當聰明的黑客們創建了像 zeromq 、 nanomsg 和發布-訂閱總線( publish-subscribe buses )這樣優秀的項目的時候,實干的工程師們卻仍然使用舊的技術干活。

到目前為止我還沒有看到使用 zeromq 作為數據庫存取通訊方式的數據庫。嗯,現在是有很少一些使用了 zeromq 的開源服務。基本上所有現代的數據庫在通訊方式的實現上目前分成了以下兩個陣營:

1.創建并使用自身協議

2.使用 HTTP 協議

在這個方面數據庫算是個比較突出的例子。另外的例子比如 Docker , Docker 使用了基于 unix sockets 的 HTTP 協議作為其通訊協議,然而,當她需要使用全雙工流( full-duplex streams )來替代請求-回應( request-reply )模式的時候,就只能很不優雅地打破了其使用的協議的語義( protocol semantics )。

HTTP協議

我不得不說一些關于HTTP的事情。

對HTTP的支持普遍存在,但是使用python會很低效。不僅是因為不能像zeromq那樣在其他線程處理事務,對HTTP解析也很緩慢。常常持久連接(keep-alive connection)也不受支持。

同時HTTP是復雜的,如果你認為不是這樣,你就錯了。來看個簡單的例子吧。你可能寫出下面的代碼:

  1. def simple_app(environ, start_response): 
  2.     status = '304 Not Modified' 
  3.     headers = [('Content-Length''5')] 
  4.     start_response(status, headers) 
  5.     return [b'hello'

理論上服務器會返回一個寫有“hello”的頁面(在wsgiref下測試),但是實際上:

  The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields   

(304響應必須不包含消息體,因此通常會被頭域后的第一個空行終止)

意思是說“hello”行會被客戶端在下次請求時識別成響應的第一行。這在一些設置中會導致緩存污染和安全漏洞。有多少使用HTTP的程序員意識到了這個現象呢?還有更多莫名其妙的細節。

 

 HTTP不要在內部消息中使用,因為它容易使用但不簡單,甚至復雜到使用了5個RFC也只描述了基本內容。即使誤解最簡單的內容可能會導致安全漏洞。

說實話,大多數微服務(microservice)使用了HTTP的子集,比如只認可200的響應碼(其他的都作為失敗),不使用特別的數據頭或類似的,這可能不會出問題。當然這不是真正意義上的HTTP(但是經常用來負載均衡的代理則需要真正的HTTP,比如HAProxy),而且需要對HTTP特性非常熟悉的人才能構建安全的HTTP子集。

那么Zeromq怎么樣

首先,它不是那種多功能的軟件:

1.它很難拓展(hack on)(使用了復雜的C++ Actor模型)

2.嵌入進一些程序的效果欠佳(也就是說它沒有使用好fork)

3.對故障切換(failover)和服務發現(service discovery)整合欠佳

4.對非冪等(non-idempotent)請求和有狀態路由(stateful routing)操控欠佳

Nanomsg在(1)表現相對要好但遠未達到完美。而在當前的設計中(2)還不能解決。(3)nanoconfig庫為nanomsg解決,但卻比nanomsg本身受到了更少的關注。(4)在nanomsg中可能最終解決但現在還沒有。

第二個大問題是工程師們還不太適應它的思考方式,例如對同樣的連接,redis協議使用發布-訂閱(pub-sub)和請求-響應(req-rep),mongo使用push-pull和請求-響應(req-rep),而zeromq不允許。nonomsq特別想修正工程師們頭腦中的這種想法,但這條路還很長。

別誤解我,zeromq很好。nanomsq從這個失誤中學到了很多,當它可用于生產環境時,它將是我用于服務間消息傳遞的第一選擇。

#p#

但是微服務怎么了?

好吧,最簡單的原因是,僅僅使用zeromq你甚至不能構建一個很小的服務。但是如果你的DB支持HTTP,你就可以使用HTTP在客戶端和服務端兩端構建服務。聽起來很簡單(但是記住HTTP很復雜)。

另外一個問題是I/O模型。當你的代碼是單線程的,你就不能在不使用連接的情況下,依然保持連接心跳。即使你使用異步循環,它也可能因做其他運算而停頓很久。

有時你想給連接發請求,但是連接實際上已經關閉了。有種廣泛使用的方法,讀取連接數據,檢出是否可用,因為通常發送請求后很難恢復:

  1. if s.read() == b''
  2.   self.reconnect() 
  3. s.write(request) 
  4. response = s.read() 

這意味著連接僅當你發送請求時才開始建立,而不是當zeromq或nanomsg中那樣只要準備好了。

而且這樣也不好做服務發現,現在你有三種簡單的選擇:

1.每次請求前檢查服務名字(如解析DNS)

2.下次連接請求時解析服務名字

3.永不更新服務(即,直到進程重啟)

大部分用戶選擇(3)。有時(2)可以直接用(work out of the box, 開箱即可用),但是它只有機器不可達后故障切換時才會發生。(1)相當低效,幾乎不可用。

I/O內核設計

[[124086]]

(I/O內核線程與Python線程使用RPC交互)

所以,我建議重新設計所有IO子系統,即,用C(或其他無GIL的語言)寫個庫來處理IO,這樣IO與程序主線程無關了。它應該與python主線程使用類似消息(messaging)的機制來通信。但是,不能發送Python對象,也不要在I/O線程內持有GIL。

I/O內核要支持多種協議,每個協議應該:(a)處理握手,(b)把流切分成消息,這樣完整的消息才會被轉發給主線程。如果可以設計連接細節,比如自動故障切換(automatic failover)的主從關系(master/slave relations),就更好了。

I/O線程應該可以解析名字,處理連接請求,能夠訂閱DNS名字變化,以及其他的一些高級特性。

注意,這些不僅僅對python有用,也適用于其他有GIL的腳本語言。事實上,對無GIL的語言,也能很好地工作,但可能沒那個必要。

先前的做法

這個思路部分存在于很多產品中:

1.上文提到的zeromq和nanomsg使用不同的線程來處理I/O

2.Kazoo(python版的zookeeper)使用單獨的(python式的)線程處理重連、ping連接

3.Twisted把阻塞計算轉移到線程池(盡管我們需要相反的東西,這已經算是工作量解除了) 

也許還有更多的例子,我仍然沒有看到用單獨線程來創建統一的I/O內核的嘗試。如果你知道,告訴我。

這種模式和最近出現的Ambassador模式很像。Ambassador是個進程,存在于每臺機器,進行服務發現,但是通過自身代理所有連接,即,所有服務都連接到localhost上Ambassador監聽的端口,然后Ambassador把連接轉發到真正的服務上去。類似的,I/O內核也應該代替主線程進行服務發現、與服務進行通信(協議仍然與Ambassador使用的那個有很大不同)。

意義所在

 難道是為了性能上能提升幾毫秒?

對。事實上,當使用多個服務來處理單個前端請求時,毫秒級的延遲累積地相當快。而且,這種技術可以在CPU使用率接近100%時,能挽救非線性增長的延遲。

 還是為了保持持久連接?如果你足夠小心地經常放棄CPU,它們在傳統的異步I/O上也工作得很好。

對。如果你在用異步I/O,那你已經非常出色了,因為很多人根本沒有看到這種必要。但是服務發現需要多少異步庫才算合理?(我的回答是:一個都不需要)

但用異步I/O也能進行服務發現。

當然。但是沒人這樣做。我認為應該趁機也解決這個問題。

下面是我設想的I/O內核應該做的任務:

檢測和統計

對CPU密集型的任務來說,定期發送統計會比較困難。這個需要被修復。主線程應該遞增在某個內存區域的計數器,而完全與I/O線程無關。

而且我們獲取請求-響應計時器的精確時間戳。通常它們對python主循環的工作量評估嚴重不準。

在正確的服務發現幫助下,我們甚至可以在真正的用戶試圖在此worker上執行請求前,知道哪些必要的服務不可用。

調試

假設你可以讓Python在任何時間獲取狀態。首先,我們總會有一批在處理中的請求。而且,我們可以像統計一樣,貼上一些標記點。最后,我們可以使用類似錯誤處理器(faulthandler)所用的一種方法來找出主線程的棧。

關鍵在于,有個線程可以回應調試請求,甚至是當主線程在做CPU密集型的事情,或者因為某些原因掛起時。

管道

請求應該盡可能通過管道傳輸,即,不管哪個前端請求需要數據庫請求,我們通過一個數據庫連接發送全部。

這樣,db連接數就可以很少,而且允許我們統計哪份副本較慢。

名字發現

我們不僅要解析DNS名字(不管我們選擇的是什么名字解析方案),還要當名字變化時獲取更新,比如zookeeper中的設置watch。

這個過程必須對應用透明,并且在應用開始請求前,連接已經存在。

統一

既然I/O內核就位,各個python的I/O框架只需要支持內核支持的協議。所有的新協議應該在內核里完成。這促使框架在方便上和效率上競爭,而不是協議的支持上。

節流(Throttling)

即使在Java和Go這些可以自由使用線程的語言里,也需要控制客戶端的連接數。該設計,不管到底哪個庫才是網絡請求的真正執行者,允許控制應用中單個位置處的請求數目。

設計隨想

下面是關于設計I/O內核的一些隨想(沒有順序),有些可能在最終設計時會被去掉。

1.I/O內核應該是單線程的。因為不太可能用Python代碼重載用C實現的I/O線程。相比于nanomsg或者zeromq,設計選擇更加簡單。

2.所有I/O應該在使用最小互鎖(minimal interlocking)的I/O線程內完成。因為喚醒其他線程比執行python字節碼的開銷要小(這樣設計也更簡單)。

3.相較于持有GIL(全局解釋鎖,global interpreter lock),從其他python對象復制數據代價更小。但是,如果可行,應該直接分配非python的緩沖區,并直接將數據串行化進去。

4.所有支持的協議至少應該可以用C切分成幀。這樣不完整的包不會到達python代碼,其他解析應該在主線程內用python對象直接完成。

5.服務發現(service discovery)應該可插拔(pluggable)。最可能的選項應該最先被實現(比如DNS名稱查詢)。

6.服務發現應該可以被簡單地集成到任何協議。事實上,對協議的實現者來說,使用服務發現比忽略它更簡單。

結束

當然建立這樣的工具不是一個周末就可以完成的事情。這是一份艱苦的工作,而且是無限長的旅程。

直到現在也適合重新思考為什么我們使用Python操控網絡。最近的工具比如穩定的libuv和Rust語言可以極大的簡化建立I/O內核。當然可以明智的使用go-python來原型化(prototype)代碼,但這容易做但是不是長久之計。

論及的方案,使用起來很簡潔。期望在未來我們能使用python建立高效,高性能的服務,尤其是在動態網絡配置方面,從而在性能差異明顯的問題上不需要使用其他語言重寫所有內容。

 
 

原文鏈接http://www.oschina.net/translate/the-future-of-asynchronous-io-in-python

責任編輯:張偉 來源: oschina
相關推薦

2022-09-14 09:13:02

ASGIPythonWeb

2013-05-22 15:43:39

谷歌web組件web開發

2024-11-22 08:28:43

2023-11-20 22:26:51

Go開發

2019-06-26 08:20:19

JavaScriptWeb開發

2022-10-27 09:59:55

視音學習

2013-08-09 12:48:48

802.11ac千兆WiFiAruba

2011-02-21 09:10:42

WebHTML 5JavaScript

2021-01-09 13:59:49

異步IO驅動式

2023-11-09 23:56:16

Web開發趨勢后端

2010-07-29 10:16:17

Linux內核Linux內存

2021-12-09 08:31:01

ReentrantLoAQS

2019-04-28 16:10:50

設計Redux前端

2020-04-01 10:48:45

Web開發LAMP

2021-02-06 23:21:35

SaaS開發低代碼

2022-03-03 08:01:41

阻塞與非阻塞同步與異步Netty

2011-12-27 11:14:36

Java

2015-08-28 08:44:43

web移動開發轉行

2023-08-01 08:43:29

Python多線程

2010-07-09 10:13:42

UDP協議
點贊
收藏

51CTO技術棧公眾號

色视频一区二区| 国产在线视频不卡二| 日韩风俗一区 二区| 青青影院一区二区三区四区| 国产亚洲自拍av| 久久影院资源站| 欧美亚洲综合久久| 成人在线视频一区二区三区| 无码国产伦一区二区三区视频 | 青青草免费在线视频观看| 黑人操亚洲女人| 奇米综合一区二区三区精品视频| 美女视频黄免费的亚洲男人天堂| 韩国中文字幕av| 最新日本在线观看| 91网站在线播放| 成人高h视频在线| 国产视频91在线| 少妇久久久久| 欧美一区二区免费| 青青草综合视频| 国内精品一区视频| 成人国产精品免费观看| 97在线免费观看| 亚洲熟女少妇一区二区| 日本精品久久| 亚洲欧美一区二区三区国产精品| 蜜芽一区二区三区| 亚洲网站在线看| 欧美黑人经典片免费观看| 97视频精彩视频在线观看| 日本少妇一区二区| 97av在线视频| 极品盗摄国产盗摄合集| 粉嫩久久久久久久极品| 欧美精品日韩综合在线| 成人免费毛片播放| 麻豆网站在线观看| 欧美国产视频在线| 成人久久久久久久| youjizz在线视频| 日韩在线高清| 欧美一区二区在线免费播放| 五月婷婷激情久久| 亚洲wwww| 亚洲视频一二区| 国产高清自拍一区| 国产女人18毛片水真多| 蜜臀久久99精品久久久画质超高清 | 亚洲精品一区二区三区新线路| 国产一区激情| 亚洲男子天堂网| 久久国产精品无码一级毛片| 午夜电影一区| 91久久精品午夜一区二区| 国产白丝袜美女久久久久| sqte在线播放| 国产丝袜美腿一区二区三区| 亚洲综合精品伊人久久| 好吊操这里只有精品| 亚洲福利久久| 日本成人中文字幕在线视频| 亚洲国产精品中文| 91热这里只有精品| 国内在线免费视频| 亚洲午夜成aⅴ人片| 神马影院午夜我不卡| 成年人在线观看| 国产人成亚洲第一网站在线播放| 粉嫩高清一区二区三区精品视频 | 川上优av中文字幕一区二区| 午夜精品久久一牛影视| 国产a级片网站| 涩涩在线视频| 色av一区二区| 精品综合久久久久| 精品国产一区二区三区2021| 日韩欧美国产一区二区三区| 99视频精品免费| av免费不卡国产观看| 欧美午夜视频在线观看| 精品人妻大屁股白浆无码| 国产大片在线免费观看| 国产精品欧美久久久久无广告| 中文字幕中文字幕在线中心一区| 视频在线观看入口黄最新永久免费国产| 2021国产精品久久精品| 日韩一区不卡| 香蕉视频在线免费看| 悠悠色在线精品| 国产又黄又爽免费视频| 丰满的护士2在线观看高清| 亚洲手机成人高清视频| 农民人伦一区二区三区| 黄页视频在线播放| 国产拍揄自揄精品视频麻豆 | 欧美大片专区| 97免费视频在线播放| 亚洲成人av网址| 自拍视频在线播放| 国产精品对白| 亚洲国产精品人久久电影| 魔女鞋交玉足榨精调教| 亚洲激情中文在线| www.日韩免费| 国产免费一区二区三区四区| 亚洲激情在线| 97国产精品视频人人做人人爱| 国产精品久久久久久人| 国产精品一区二区91| 国产欧美一区二区三区四区| 天堂在线资源8| 国产精品丝袜91| 在线观看不卡一区| 欧洲精品国产| 中日韩高清电影网| 18涩涩午夜精品.www| 亚洲日本一区二区三区在线不卡| 高清av在线| 亚洲成人动漫在线观看| 日本一二区免费| 亚洲va久久| 欧美大胆a视频| 国产精品a成v人在线播放| 麻豆精品久久精品色综合| 国产色视频一区| av中文在线观看| 国产蜜臀av在线一区二区三区| 青草视频在线观看视频| av日韩一区| 精品国产百合女同互慰| 影音先锋黄色资源| 国产欧美日韩精品一区二区三区| 中文字幕在线观看亚洲| 成人18视频免费69| 日韩国产成人精品| 精品久久久久久亚洲| 岛国在线视频| 亚洲自拍偷拍综合| 日本女优爱爱视频| 亚洲小说图片视频| 久久久99久久精品女同性| 久久午夜鲁丝片午夜精品| 国产欧美一区二区色老头| 国产精品久久7| 国际av在线| 亚洲欧美日韩久久| 亚洲熟妇av一区二区三区漫画| 视频精品导航| 国产性色av一区二区| 男女性高潮免费网站| 九九**精品视频免费播放| 国产精品久久久久久免费观看| 欧美白人做受xxxx视频| 亚洲免费伊人电影| 国产精品99久久免费黑人人妻| 精品视频在线你懂得| 主播福利视频一区| 一个人看的www日本高清视频| 不卡电影一区二区三区| 国产不卡一区二区视频| 卡通动漫精品一区二区三区| 国语自产在线不卡| 深夜影院在线观看| 亚洲老妇xxxxxx| 亚洲午夜精品在线观看| 欧美日韩有码| 国产欧美中文字幕| 青春草免费在线视频| 欧美一区二区三区男人的天堂| 欧美日韩三级在线观看| 成人国产精品免费网站| 国产对白在线播放| 日韩成人高清| 亚洲二区中文字幕| 亚洲天堂一区在线观看| 成人妖精视频yjsp地址| 亚洲一区二区三区免费观看| 亚洲黄色中文字幕| 亚洲成色777777女色窝| 国产美女激情视频| 日韩无码精品一区二区| 三级亚洲高清视频| 国偷自产av一区二区三区小尤奈| wwwav在线| 亚洲变态欧美另类捆绑| 国精品无码一区二区三区| 91高潮大合集爽到抽搐| 久久久久国产精品厨房| 中文字幕 欧美日韩| 精品成人一区| 91在线看www| 97蜜桃久久| 精品福利在线导航| 在线免费观看av网址| 椎名由奈av一区二区三区| 天天躁日日躁狠狠躁av| 热久久一区二区| 五月天婷亚洲天综合网鲁鲁鲁| 最新中文字幕在线播放| 啊v视频在线一区二区三区| 日本视频www色| 夜夜精品浪潮av一区二区三区| 特种兵之深入敌后| 久久成人一区| 日韩hmxxxx| 欧洲精品一区二区三区| 欧美俄罗斯乱妇| 后进极品白嫩翘臀在线视频| 欧美性三三影院| 国产网址在线观看| gogogo免费视频观看亚洲一| 狠狠躁狠狠躁视频专区| 99综合在线| 看高清中日韩色视频| 亚洲黄色网址| 色综合视频一区中文字幕| 久久经典视频| 亚洲国产精品久久久久秋霞不卡| 136福利视频导航| 91成人看片片| 后入内射无码人妻一区| 91麻豆文化传媒在线观看| 国产成人精品综合久久久久99| 另类小说综合欧美亚洲| 成人手机在线播放| 精品素人av| 成人av网站观看| 三妻四妾完整版在线观看电视剧| 亚洲人成人99网站| 香蕉av在线播放| 欧美性一区二区| 国产又黄又猛又粗又爽| 国产精品久久久爽爽爽麻豆色哟哟| 小早川怜子一区二区三区| 欧美黑吊大战白妞| 成人午夜激情片| 制服下的诱惑暮生| 夜夜嗨av一区二区三区网站四季av| 美女黄色片网站| 欧美a级片视频| 一区二区精品在线观看| 伊人精品综合| 91精品国产91久久久久青草| 欧美日韩视频免费看| 国产69精品久久久| 青青在线视频| 欧美多人爱爱视频网站| 女人天堂av在线播放| 亚洲人成网站999久久久综合| 国产精品久久免费| 同产精品九九九| 亚洲a∨无码无在线观看| av资源网一区| 日韩欧美国产片| 毛片av中文字幕一区二区| 欧美在线aaa| 亚洲免费精品| 青娱乐自拍偷拍| 91精品国产麻豆国产在线观看| 影音先锋欧美在线| 欧美在线精品一区| 日韩三级电影免费观看| 国产精品毛片视频| 91精品久久久久久久| jk漫画禁漫成人入口| 国产91久久婷婷一区二区| 色婷婷av在线| 国产69精品久久久久9| 两个人看的在线视频www| 欧美壮男野外gaytube| 日本黄色一区| 91福利视频导航| 国产一区丝袜| 2022国产精品| 国产精品网站在线看| 91影视免费在线观看| 综合中文字幕| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 91精品国产一区二区在线观看| 91网站在线看| 国产精品三p一区二区| 国产日韩专区在线| 国产成人av片| 国产精品一二一区| 小毛片在线观看| 国产精品视频麻豆| 久久久精品91| 一本色道久久综合狠狠躁的推荐| 在线播放精品视频| 一本久道久久综合中文字幕| 精品无码人妻一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 精品在线视频免费| 亚洲成人一二三| 中文字幕第三页| 欧美午夜不卡视频| xxxwww在线观看| 亚洲午夜精品视频| 中文av资源在线| 久久久久久成人| 国产一区二区主播在线| 成人欧美一区二区三区在线| 综合久久av| 久久久久资源| 欧美激情一区| 日本成人黄色网| 麻豆久久久久久| 粉色视频免费看| 国产九九视频一区二区三区| 少妇丰满尤物大尺度写真| 国v精品久久久网| 无码国产69精品久久久久网站 | 久久久精品少妇| 黑人精品xxx一区一二区| av黄色在线播放| 精品奇米国产一区二区三区| 日本免费不卡视频| 久久综合88中文色鬼| 女囚岛在线观看| 国产在线精品自拍| 欧美专区一区| 亚洲一区二区三区精品在线观看 | 日韩久久一级片| 成人深夜在线观看| 极品久久久久久| 五月天视频一区| 一级一片免费看| 亚洲国内精品在线| 女同一区二区免费aⅴ| 92看片淫黄大片欧美看国产片| 蜜桃在线一区| 一区二区三区欧美成人| 天使萌一区二区三区免费观看| 精品国产人妻一区二区三区| 亚洲综合激情小说| 超碰在线观看99| 麻豆91精品91久久久的内涵| 日韩国产精品一区二区| 制服诱惑一区二区| 182在线视频| 亚洲18女电影在线观看| 亚洲精品一区二三区| 亚洲美女免费精品视频在线观看| 日本最新在线视频| 国产精品入口夜色视频大尺度 | 伊人国产在线观看| 在线亚洲一区二区| 国内在线免费高清视频| 国产成人久久久精品一区| 啪啪亚洲精品| 亚洲一区二区蜜桃| 国产精品乱人伦一区二区| 日本三级网站在线观看| 精品国产1区2区3区| 成人观看网址| 欧美一进一出视频| 日韩精品亚洲专区| 波多野结衣家庭教师在线观看| 亚洲国产成人av网| 午夜国产在线观看| 欧美亚洲国产日韩2020| 国产精品视频一区二区三区| 一区二区三区四区| 国产福利91精品| 日韩精品一卡二卡| 亚洲日本欧美日韩高观看| 精品久久毛片| 欧美日韩综合精品| 日本欧美在线观看| 亚洲色婷婷一区二区三区| 亚洲成人精品av| 成人黄色免费短视频| 国产成人一区二区三区免费看| 欧美特黄一区| 精品夜夜澡人妻无码av| 亚洲不卡一区二区三区| 国产乱码久久久久| 丝袜亚洲另类欧美重口| 久久久久久久久成人| 影音先锋在线亚洲| 播五月开心婷婷综合| 波多野结衣视频在线看| 精品伊人久久97| 欧美亚洲黄色| 视频在线精品一区| 国产精品一区在线| 欧美在线视频第一页| 日韩高清av在线| 在线天堂资源| 久久一区二区三区av| 麻豆视频一区二区| 好吊操这里只有精品| 日韩中文字幕在线| 国产精品任我爽爆在线播放| www.射射射| 成人亚洲精品久久久久软件| 中文字幕欧美日韩一区二区三区| 日韩欧美久久| 亚洲一区bb|