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

Chronicle Queue入門

譯文 精選
開發
一文了解Chronicle Queue

  作者丨Shaolang Ai

  譯者 | 楊曉娟

  用Chronicle Queue構建的應用程序不會讓生產者放慢將消息放入隊列的速度(沒有背壓機制)。

  Chronicle Queue(編年史隊列)是低延遲、無代理、持久的消息隊列。

  與其最相近的是0MQ,但0MQ不存儲發布的消息。Chronicle Queue的開源版本不支持跨機器通信。Chronicle Queue最與眾不同之處在于它使用RandomAccessFile做堆外存儲因而不會產生垃圾。

  Chronicle Queue是以生產者為中心的,也就是說,用它構建的應用程序不會讓生產者放慢將消息放入隊列的速度(沒有背壓機制)。這種設計在對生產者的生產能力幾乎不可控的情況下非常有用,例如外匯價格更新。

術語

  大多數消息隊列使用術語Producer(生產者)和Consumer(消費者),Chronicle Queue使用Appender(附加器)和Tailer(零售商),用于區分它總是將消息附加到隊列中,并且零售商從隊列中讀取消息之后,從不“銷毀/丟棄”任何消息。與Message(消息)相比,Chronicle Queue更喜歡使用術語Excerpt(摘錄),因為寫入Chronicle Queue的blob可以是字節數組、字符串以及域模型。

Hello, World!

  我們用傳統的“Hello, World!”來演示基本用法。如果您使用的是Gradle,將以下內容添加到build.gradle.kts:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile  // line 1

plugins {
id("org.jetbrains.kotlin.jvm") version "1.3.71"
application
}

repositories {
mavenCentral()
mavenLocal()
}

dependencies {
implementation("org.jetbrains.kotlin:kotlin-bom")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("net.openhft.chronicle:chronicle-queue:5.19.8") // line 17

implementation("org.apache.logging.log4j:log4j-sl4fj18-impl:2.13.1")
}
application {
mainClass = "hello.AppKt"
}

tasks.withType<KotlinCompile> { // line 25
kotlinOptions.jvmTarget = "1.8"
}

  導入KotlinCompile(第1行)允許將Java 1.8指定為編譯目標(第25-27行)。第17-18行顯示了開始使用Chronicle Queue所需的其它依賴項。請注意build.gradle.kts假定要使用的包是hello。接下來看看演示Chronicle Queue用法的代碼:

package hello

import net.openhft.chronicle.queue.ChronicleQueue

fun main(args: Array<String>) {
val q: ChronicleQueue = ChronicleQueue.single("./build/hello-world")

try {
val appender: ExcerptAppender = q.acquireAppender()
appender.writeText("Hello, World!")

val tailer: ExcerptTailer = q.createTailer()
println(tailer.readText())
} finally {
q.close()
}
}

  ChronicleQueue.single()返回一個新建的使用給定的路徑存儲摘錄的ChronicleQueue。其余的代碼幾乎是不言自明的:獲得的appender把摘錄“Hello, World!”追加到排隊中;tailer從隊列中讀取并將摘錄打印到標準輸出。程序結束時一定要關閉隊列。

  還記得Chronicle Queue是持久的嗎?注釋掉兩個appender行,然后再用gradle run執行程序。您將看到程序還是在標準輸出上打印了Hello, World!:tailer讀取的是上次運行時寫入到隊列中的數據。它的持久性允許在tailers崩潰時重放收到的摘錄。

便道:摘錄類型

  Chronicle Queue僅接受以下類型的摘要:

  1. Serializable對象:請注意,由于依賴于反射,序列化類對象的效率很低

  2. Externalizable對象:如果與Java的兼容性很重要,但以犧牲手寫邏輯為代價

  3. net.openhft.chronicle.wire.Marshallable對象:使用二進制格式的高性能數據交換

  4. net.openhft.chronicle.bytes.BytesMarshallable對象:底層二進制或文本編碼

  “Hello, World!”演示了字符串,我們順便看一個使用Chronicle Wire庫中Marshallable的例子。

package types

import net.openhft.chronicle.wire.Marshallable
import net.openhft.chronicle.wire.SelfDescribingMarshallable

class Person(val name: String, val age: Int): SelfDescribingMarshallable()

fun main(args: Array<String>) {
    val person = Person("Shaolang", 3)
    val outputString = """
!types.Person {
name: Shaolang
age: 3
}
    """.trimIndent()

    println(person.toString() == outputString)

    val p = Marshallable.fromString<Person>(outputString)
    println(person == p)
    println(person.hashCode() == p.hashCode())
}

  運行上面的代碼片段會看到標準輸出上打印了三個true。SelfDescribtingMarshallable可以輕松持久化Chronicle Queue 中的Marshallable類。

寫入和讀取域對象

  有了從上面小便道得來的經驗,下面將演示向Chronicle Queue寫入和讀取Marshallable對象:

package docs

import net.openhft.chronicle.queue.ChronicleQueue
import net.openhft.chronicle.wire.SelfDescribingMarshallable

class Person(var name: String? = null, var age: Int? = null): SelfDescribingMarshallable()

class Food(var name: String? = null): SelfDescribingMarshallable()

fun main(args: Array<String>) {
    ChronicleQueue.single("./build/documents").use { q ->
        val appender = q.acquireAppender()
        appender.writeDocument(Person("Shaolang", 3))
        appender.writeText("Hello, World!")
        appender.writeDocument(Food("Burger"))

        val tailer = q.createTailer()

        val person = Person()
        tailer.readDocument(person)
        println(person)
        println("${tailer.readText()}\n")

        val food = Food()
        tailer.readDocument(food)
        println(food)
    }
}

  盡管在不同的VM進程中運行appender和tailer會更有意義,但將兩者保持在同一個VM中可以更容易理解討論,不必篩選無關的代碼。運行上面的代碼會看到如下輸出:

!docs.Person {
  name: Shaolang,
  age: 3
}
Hello, World!
!docs.Food {
  name: Burger,
}

  有幾點需要注意:

  1. 由于Chronicle Queue的目標是不產生垃圾,因而要求域模型是可變對象;這就是為什么兩個類在構造器中使用var而不是val。

  2. Chronicle Queue允許appender將不同的內容寫入同一隊列。

  3. tailer需要知道它應該讀什么才能得到正確的結果。

  如果我們把最后一個tailer.readDocument(food)改成tailer.readDocument(person)然后打印person,將看到以下打印內容(至少在Chronicle Queue 5.19.x中,它不會崩潰/拋出任何異常):

!docs.Person {
  name: Burger,
  age: !!null ""
}

  因為Person和Food有一個同名的屬性,Chronicle Queue會盡可能匹配Person,不能匹配的置為空。

  上面注意事項中的最后一點“關于tailer需要知道他們在讀什么”會有點麻煩:它們(tailer)現在背負著過濾的重擔,要從生產者不斷扔來的雪崩一樣的數據中獲得它們想要的信息。為了保持代碼庫穩健,我們需要使用觀察者模式.

(有點)只聽感興趣的東西

  除了直接使用摘錄附加器,另一種方法是使它具體化為傳給methodWriter方法的第一類。下面的片段重點介紹指定偵聽器的具體化:

package listener

import net.openhft.chronicle.queue.ChronicleQueue
import net.openhft.chronicle.queue.ChronicleReaderMain
import net.openhft.chronicle.wire.SelfDescribingMarshallable

class Person(var name: String? = null, var age: Int? = null): SelfDescribingMarshallable()

interface PersonListener {
    fun onPerson(person: Person)
}

fun main(args: Array<String>) {
    val directory = "./build/listener"

ChronicleQueue.single(directory).use { q ->
val observable: PersonListener = q.acquireAppender()
.methodWriter(PersonListener::class.java)
        observable.onPerson(Person("Shaolang", 3))
        observable.onPerson(Person("Elliot", 4))
    }

     ChronicleReaderMain.main(arrayOf("-d", directory))
}

  第17-18行用指定的PersonListener調用methodWriter獲得附加器。請注意,賦予observable的類型是PersonListener,不是ExcerptAppender。現在,任何對PersonListener的方法調用都會把給定的參數寫入隊列。但是,直接使用附加器寫入隊列和使用具體化的類寫入隊列是有區別的。為了看出區別,我們使用ChronicleReaderMain檢驗隊列:

0x47c900000000:
onPerson {
  name: Shaolang,
  age: 3
}
0x47c900000001:
onPerson {
  name: Elliot,
  age: 4
}

  注意,具體化類寫入隊列的摘錄用的是onPerson { ...} 而不是!listener.Person { ... }。 這種差異允許實現了PersonListener的tailer收到寫入隊列的新Person對象的通知并忽略它們不感興趣的對象。

  是的,你沒看錯:實現了PersonListener的tailer。不幸的是,Chronicle Queue(有點)將被觀察者和觀察者混為一談,因此很難區分它們。我認為區分差異的最簡單方法是使用以下片段注釋中所示的啟發式方法:

interface PersonListener {
onPerson(person: Person)
}
// this is an observer because it implements the listener interface
class PersonRegistry: PersonListener {
override fun onPerson(person: Person) {
// code omitted for brevity
}
}
fun main(args: Array<String>) {
// code omitted for brevity
val observable: PersonListener = q.acquireAppender() // this is an
.methodWriter(PersonListener::class.java) // observable
// another way to differentiate: the observer will never call the
// listener method, only observables do.
observable.onPerson(Person("Shaolang", 3))
// code omitted for brevity
}

  再來看一下tailer。盡管Chronicle Queue確保每個tailer能看到每一條摘錄,通過實現偵聽器類/接口并用已實現的偵聽器創建net.openhft.chronicle.bytes.MethodReader, tailer可以僅過濾出它想看到的摘錄:

package listener

import net.openhft.chronicle.bytes.MethodReader
import net.openhft.chronicle.queue.ChronicleQueue
import net.openhft.chronicle.wire.SelfDescribingMarshallable

class Person(var name: String? = null, var age: Int? = null): SelfDescribingMarshallable()

class Food(var name: String? = null): SelfDescribingMarshallable()

interface PersonListener {
    fun onPerson(person: Person)
}

class PersonRegistry: PersonListener {
    override fun onPerson(person: Person) {
        println("in registry: ${person.name}")
    }
}

fun main(args: Array<String>) {
    ChronicleQueue.single("./build/listener2").use { q ->
        val appender = q.acquireAppender()
        val writer: PersonListener = appender.methodWriter(PersonListener::class.java)
        writer.onPerson(Person("Shaolang", 3))
        appender.writeDocument(Food("Burger"))
        writer.onPerson(Person("Elliot", 4))

        val registry: PersonRegistry = PersonRegistry()
val reader: MethodReader = q.createTailer().methodReader(registry)
        reader.readOne()
        reader.readOne()
        reader.readOne()
    }
}

  這里的主要新內容是PersonRegistry的實現,它簡單地打印出所給的person的name。 代碼片段并沒直接用ExcerptTailer從隊列中讀取而是用給定的PersonRegistry由tailer創建了一個MethodReader。

  .methodWriter接受Class參數,而.methodReader接受的是對象。appender向隊列寫入三個摘錄:person(通過調用onPerson)、food(通過.writeDocument)和person。 因為tailer可以看到每一個摘錄,所以閱讀者也會調用三次“讀取”所有摘錄,但卻只會看到兩個輸出:

  in registry:Shaolang

  in registry:Elliot

  如果代碼片段只有兩個.readOne()調用而不是三個,那么輸出中就不會包含in registry:Elliot.

MethodReader使用鴨子類型

  還記得我們檢驗由具體化的PersonListener填充隊列時ChronicleReaderMain的輸出嗎?輸出的不是類名而是類似于onPerson { ... }。這表明MethodReader過濾與方法簽名匹配的摘錄,即它不關心包含方法簽名的接口/類;或者簡單地說,鴨子類型:

package duck

import net.openhft.chronicle.queue.ChronicleQueue
import net.openhft.chronicle.wire.SelfDescribingMarshallable

class Person(var name: String? = null, var age: Int? = null): SelfDescribingMarshallabl()

interface PersonListener {
    fun onPerson(person: Person)
}

interface VIPListener {
    fun onPerson(person: Person)
}

class VIPClub: VIPListener {
override fun onPerson(person: Person) {
        println("Welcome to the club, ${person.name}!")
    }
}

fun main(args: Array<String>) {
    ChronicleQueue.single("./build/duck").use { q ->
        val writer = q.acquireAppender().methodWriter(PersonListener::class.java)
        writer.onPerson(Person("Shaolang", 3))

        val club = VIPClub()
        val reader = q.createTailer().methodReader(club)
        reader.readOne()
    }
}

  注意,VIPClub實現了VIPListener,碰巧與PersonListener有相同的onPerson方法簽名。運行上面的代碼,你會看到打印的Welcome to the club, Shaolang!

命名tailer

  到目前為止,在所有的演示中,我們一直創建的都是匿名的tailer。因為它們是匿名的,所以每次(重新)運行都會讀取隊列中的所有摘錄。有時,這樣的行為是可接受的,甚至是可取的,但有時卻不是。只需命名tailer就可以從上次停止的位置繼續讀取:

package restartable

import net.openhft.chronicle.queue.ChronicleQueue
import net.openhft.chronicle.queue.ExcerptTailer

fun readQueue(tailerName: String, times: Int) {
    ChronicleQueue.single("./build/restartable").use { q ->
       val tailer = q.createTailer(tailerName)       // tailer name given
       for (_n in 1..times) {
          println("$tailerName: ${tailer.readText()}")
        }

        println()       // to separate outputs for easier visualization
  }
}

fun main(args: Array<String>) {
    ChronicleQueue.single("./build/restartable").use { q ->
        val appender = q.acquireAppender()
        appender.writeText("Test Message 1")
        appender.writeText("Test Message 2")
        appender.writeText("Test Message 3")
        appender.writeText("Test Message 4")
}

    readQueue("foo", 1)
    readQueue("bar", 2)
    readQueue("foo", 3)
    readQueue("bar", 1)
}

  注意,tailer的名字是通過createTailer方法指定的。上面的代碼中有兩個tailer(命名為foo和bar)讀取隊列并在運行時輸出以下內容:

foo: Test Message 1

bar: Test Message 1
bar: Test Message 2

foo: Test Message 2
foo: Test Message 3
foo: Test Message 4

bar: Test Message 3 

注意,foo和bar第二次從隊列中讀取數據時,會從之前斷開的位置開始。

滾動文件

  Chronicle Queue根據創建隊列時定義的滾動周期滾動使用的文件;默認情況下,每天滾動文件。要改變滾動周期,就不能使用簡單的ChronicleQueue.single方法:

package roll

import net.openhft.chronicle.queue.ChronicleQueue
import net.openhft.chronicle.queue.RollCycles
import net.openhft.chronicle.impl.single.SingleChronicleQueueBuilder

fun main(args: Array<String>) {
   var qbuilder: SingleChronicleQueueBuilder = ChronicleQueue.singleBuilder("./build/roll")
   qbuilder.rollCycle(RollCycles.HOURLY)
   val q: ChronicleQueue = qbuilder.build()
   // code omitted for brevity
}

  首先,得到一個SingleChronicleQueueBuilder實例,并通過.rollCycle方法設置滾動周期。 上面的代碼段將隊列配置為每小時滾動一次文件。配置好后,調用構造器的.build()獲取ChronicleQueue實例。請注意,appender和tailer(s)在訪問同一個隊列時必須使用相同的滾動周期。

  由于SingleChronicleQueueBuilder支持流式接口,代碼也可以做如下簡化:

val q: ChronicleQueue = ChronicleQueue.singleBuilder("./build/roll")
                                      .rollCycle(RollCycles.HOURLY)
                                      .build()

接下來

  這篇文章介紹了Chronicle Queue的術語和基礎知識。以下網站有更多信息可供挖掘:

  1. Chronicle Queue GitHub repository

  2. Stack Overflow tagged questions

  3. Peter Lawre's Blog


原文鏈接

https://dzone.com/articles/bit-by-bit

譯者介紹  

楊曉娟,51CTO社區編輯,資深研發工程師,信息系統項目管理師,擁有近20年Java開發經驗。

責任編輯:張潔 來源: 51CTO技術棧
相關推薦

2022-03-23 09:00:00

微服務KafkaChronicle

2020-09-24 14:07:31

谷歌Chronicle網絡安全

2018-01-25 11:49:51

谷歌Chronicle安全企業

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2023-07-31 11:16:45

Web前端worker服務

2009-08-03 15:06:43

C# Stack對象C# Queue對象

2023-09-21 09:00:00

Merge Que開發工具Mergify

2024-08-19 04:00:00

2025-09-12 11:00:00

Akamai云計算安全

2013-07-15 15:51:32

iOS多線程GCD基本概念Dispatch Qu

2019-05-22 08:11:51

Winnti惡意軟件Linux

2021-05-20 10:47:58

Resource Qu阿里云PostgreSQL

2021-06-11 06:10:09

Python數據結構算法

2011-02-28 13:34:51

SpringMVC

2012-11-05 10:33:40

IBMdw

2021-06-16 12:57:27

FreeDOS

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2024-02-26 00:26:16

ChatGPTMQQueue

2024-04-28 08:14:29

C#隊列Queue

2024-05-30 08:05:17

點贊
收藏

51CTO技術棧公眾號

欧美国产日韩在线| 91国内精品野花午夜精品| 亚洲最大福利视频网| 精品少妇久久久| 亚欧日韩另类中文欧美| 精品视频免费在线| 分分操这里只有精品| 日本一区二区三区在线观看视频| 日本女人一区二区三区| 欧美激情精品久久久久| 免费看黄色av| 国偷自产av一区二区三区| 欧美午夜精品一区二区蜜桃| www.国产亚洲| www.在线视频.com| 91偷拍与自偷拍精品| 91在线国产电影| 久久人人爽人人爽人人片av免费| 欧美精品一级| 日韩在线观看免费全集电视剧网站| 久久精品无码专区| 激情小说亚洲| 欧美日韩亚洲系列| 欧美a级免费视频| 在线观看国产原创自拍视频| 成人黄页在线观看| 91香蕉国产在线观看| 亚洲成人av网址| 国产一区91| 久久人人看视频| avtt天堂在线| 91九色精品国产一区二区| 国产丝袜精品第一页| 久久久久久久穴| 国产一区二区色噜噜| 欧美性极品xxxx娇小| www.欧美黄色| 在线免费观看污| 国产精品久久久久久久久图文区 | 免费av一区| 亚洲成人教育av| 国产成人av片| 日韩中文字幕| 日韩亚洲欧美在线观看| 性久久久久久久久久久久久久| 日韩高清在线| 欧美性猛交一区二区三区精品| 欧美激情成人网| 日本电影欧美片| 色综合夜色一区| 苍井空浴缸大战猛男120分钟| 成人福利电影| 亚洲不卡在线观看| 国产精品裸体瑜伽视频| 波多野结依一区| 亚洲成av人片在线观看无码| 岛国大片在线播放 | 热久久这里只有精品| 成人免费看片98欧美| 亚洲三级影院| 538国产精品视频一区二区| 日本一区二区欧美| 亚洲综合欧美| 国产精品久久久久久久美男| 艳妇乳肉豪妇荡乳av无码福利| 日韩国产高清在线| 国产精品无av码在线观看| 曰批又黄又爽免费视频| 激情丁香综合五月| 99久久精品免费看国产一区二区三区| 国产成人毛毛毛片| 成人精品视频.| 精品在线不卡| 波多野结衣在线影院| 一区精品在线播放| 久久男人资源站| 成人黄色动漫| 欧美性生活久久| 欧美国产在线一区| 久久久久高潮毛片免费全部播放| 日韩激情在线视频| 国产白丝一区二区三区| 综合天堂av久久久久久久| 隔壁老王国产在线精品| 日韩精品久久久久久免费| 蜜臀久久99精品久久久久久9| 91在线色戒在线| 天天干在线观看| 日本一区二区免费在线| 97超碰人人爱| 黄色软件视频在线观看| 欧美日韩一区高清| 久久免费精品国产| 日韩片欧美片| 午夜精品视频在线| 中文字幕在线观看精品| 国产v综合v亚洲欧| 日本免费高清一区二区| 亚洲奶水xxxx哺乳期| 欧美日韩在线视频首页| 亚洲精品永久视频| 精品福利一区| 久久精品国产99国产精品澳门| 久久精品国产亚洲av无码娇色| 日韩精品一卡二卡三卡四卡无卡| 亚洲最大福利视频网| 美女做暖暖视频免费在线观看全部网址91| 18涩涩午夜精品.www| 黑人糟蹋人妻hd中文字幕| 久久丁香四色| 一本一道久久a久久精品逆3p| 久久成人国产精品入口| 美女视频一区二区| 奇米精品在线| 擼擼色在线看观看免费| 欧美一二三区在线观看| 一级特黄曰皮片视频| 亚洲毛片视频| 成人免费看片网址| 麻豆视频在线免费观看| 色婷婷久久99综合精品jk白丝| 国产高潮失禁喷水爽到抽搐| 99久久亚洲精品蜜臀| 国产精品99蜜臀久久不卡二区| 熟妇人妻av无码一区二区三区| 亚洲少妇中出一区| 欧美大尺度做爰床戏| 网友自拍区视频精品| 欧美福利视频在线观看| 国产欧美第一页| 国产精品美女久久久久久久久久久| 国产黄色一级网站| 国产色噜噜噜91在线精品| 九九久久精品一区| 999av视频| 日韩久久一区二区| 在线观看免费视频高清游戏推荐| 亚洲激情77| 45www国产精品网站| 无码h黄肉3d动漫在线观看| 亚洲一区成人在线| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 国产精品久久久亚洲一区| 操一操视频一区| 特级毛片在线| 日韩精品一区二区三区中文不卡| 动漫性做爰视频| 狠狠久久亚洲欧美| 蜜臀av.com| 亚洲无线观看| 午夜精品蜜臀一区二区三区免费| 免费国产精品视频| 五月婷婷久久丁香| mm131美女视频| 久久综合伊人| 麻豆精品蜜桃一区二区三区| 中文字幕资源网在线观看免费| 亚洲精品一区二区三区不| 国产在线观看黄色| 日本一区二区三区四区| 蜜臀av免费观看| 国产精品不卡| 波多野结衣久草一区| hd国产人妖ts另类视频| 亚洲精品电影网| 免费av中文字幕| 亚洲欧洲av一区二区三区久久| 黄色三级视频在线播放| 狠狠噜噜久久| 日韩aⅴ视频一区二区三区| 亚洲成av在线| 久久久精品影院| 日日夜夜精品免费| 在线精品观看国产| 久久免费看少妇高潮v片特黄| 粉嫩蜜臀av国产精品网站| 国产主播在线看| 人人狠狠综合久久亚洲婷| 成人黄色激情网| 川上优av中文字幕一区二区| 亚洲深夜福利网站| 国产理论片在线观看| 亚洲va天堂va国产va久| 免费看黄色三级| 国产九色精品成人porny| 国产伦精品一区二区三区四区视频_| 一道本一区二区三区| 国产原创欧美精品| 麻豆成全视频免费观看在线看| 一区二区国产精品视频| 亚洲精品18p| 91久久精品国产91性色tv| tube国产麻豆| 国产午夜亚洲精品理论片色戒| 色黄视频免费看| 国产欧美在线| 欧美日韩午夜爽爽| 精品国产123区| 古典武侠综合av第一页| 国产91欧美| 91精品国产一区| 91国内在线| 在线观看亚洲视频| 天天干天天爱天天操| 黄色在线免费观看| 亚洲自拍偷拍图区| 国产一区在线观看免费| xnxx国产精品| 中文字幕人妻一区| 狠狠色丁香久久婷婷综| 欧美私人情侣网站| 亚洲欧洲视频| 在线观看17c| 日韩精品影视| 欧美深深色噜噜狠狠yyy| 亚洲一区二区电影| 3d精品h动漫啪啪一区二区| 欧美不卡高清一区二区三区| 97视频国产在线| 亚洲男同gay网站| 久久亚洲欧美日韩精品专区| 国产在线观看免费网站| 亚洲经典中文字幕| 精品人妻一区二区三区蜜桃| 精品视频在线看| 91丨九色丨海角社区| 色综合久久88色综合天天免费| 久久av高潮av无码av喷吹| 亚洲乱码一区二区三区在线观看| 国产精品久久久久久成人| 久久久亚洲国产美女国产盗摄| 污污免费在线观看| 粉嫩绯色av一区二区在线观看| 男插女视频网站| 国内不卡的二区三区中文字幕 | 成人黄色毛片| 国产成人久久精品| 欧美xo影院| 国产a∨精品一区二区三区不卡| 91超碰国产在线| 97在线视频精品| 在线女人免费视频| 91成人在线观看国产| 免费在线小视频| 91av在线影院| 欧美极品影院| 国产精品久久久久久久美男| 78精品国产综合久久香蕉| 国产精品丝袜久久久久久不卡| 色成人免费网站| 国产乱肥老妇国产一区二 | 国产麻豆视频在线观看| 《视频一区视频二区| 91精品少妇一区二区三区蜜桃臀| 中文字幕中文乱码欧美一区二区| 少妇视频一区二区| 亚洲免费观看高清| 日韩欧美综合视频| 亚洲国产精品久久一线不卡| 日韩av一区二区在线播放| 精品日韩中文字幕| 日本欧美www| 欧美精品粉嫩高潮一区二区| 99久久精品国产色欲| 欧美变态凌虐bdsm| 亚洲人在线观看视频| 亚洲人成自拍网站| 久久综合之合合综合久久| 久久99视频免费| 欧产日产国产精品视频 | 免费视频爱爱太爽了| 在线成人www免费观看视频| 国产中文字幕免费观看| 日本不卡视频在线观看| 九一精品久久久| 99久久综合精品| 色综合99久久久无码国产精品| 亚洲日本欧美天堂| 日本网站在线播放| 欧美日韩国产综合视频在线观看| 国产高清免费在线观看| 日韩经典第一页| 精品欧美色视频网站在线观看| 欧美夫妻性视频| 日本少妇一区| 成人激情av| 成人激情开心网| 男人天堂av片| 蜜臀av性久久久久蜜臀aⅴ| 俄罗斯女人裸体性做爰| 久久夜色精品一区| 久久久久久久久久网站| 日韩欧美亚洲范冰冰与中字| 一区二区久久精品66国产精品 | 亚洲先锋成人| 亚洲一区二区三区四区五区xx| 国产成人啪午夜精品网站男同| 女尊高h男高潮呻吟| 亚洲视频精选在线| 日韩中文字幕高清| 亚洲国产精品va在线看黑人动漫| 69视频在线| 18久久久久久| 网站一区二区| 亚洲高清资源综合久久精品| 亚洲欧洲另类| 日批视频免费看| 国产精品成人一区二区艾草 | 久久中文免费视频| 在线观看日韩高清av| 亚洲第一免费视频| 日韩在线观看网站| 日日av拍夜夜添久久免费| 99久久无色码| 亚洲人metart人体| 免费一级特黄录像| 91浏览器在线视频| 国产精品7777777| 精品国产青草久久久久福利| 日本在线观看视频| 国产不卡av在线免费观看| 加勒比色老久久爱综合网| 今天免费高清在线观看国语| 蜜臀久久99精品久久久画质超高清 | 亚洲午夜在线播放| 日韩美女av在线| 阿v视频在线观看| 国产一区精品视频| 精品999成人| 国产a√精品区二区三区四区| 亚洲三级免费电影| 国产又黄又爽视频| 日韩在线观看免费全| 国产极品一区| 亚洲欧美久久234| 日韩激情一二三区| 久久久久久久久久久久久久久| 婷婷开心激情综合| 国产又爽又黄网站亚洲视频123| 久久久久久久久久久网站| 日韩在线亚洲| 欧美在线观看视频免费| 国产成人激情av| 久久久久无码国产精品| 欧美大片在线观看一区| av手机免费在线观看| 国产欧美日韩伦理| 国产亚洲毛片| 欧美黄色一级生活片| 欧洲一区二区三区免费视频| 黄色影院在线播放| 国产精品亚洲激情| 久久久久国产精品| 中文字幕乱码在线人视频| 一区二区成人在线| 五月天久久久久久| 国产成人精品视| 日韩理论电影大全| 又黄又爽又色的视频| 亚洲综合激情网| 艳母动漫在线看| 国产精品亚洲网站| 伊人色**天天综合婷婷| 日本wwwwwww| 欧美性生交xxxxxdddd| av在线资源网| 亚洲一区二区三区视频播放| 激情久久久久久| 大黑人交xxx极品hd| 欧美性生活大片视频| 超碰免费公开在线| 国内精品视频免费| 日本亚洲一区二区| 欧美xxxx黑人xyx性爽| 亚洲国产精品yw在线观看 | 99亚洲伊人久久精品影院红桃| 亚洲一区二区观看| 欧美日韩中文国产| 日本小视频在线免费观看| 久久久水蜜桃| 另类成人小视频在线| 久久精品国产亚洲av高清色欲| 亚洲网址你懂得| 欧美片网站免费| 欧美黄网站在线观看| 日韩理论在线观看| 你懂的在线播放| 91免费观看| 日韩福利视频网| 久一视频在线观看| 色悠悠久久88| 四虎影视精品| 中文字幕第66页| 在线亚洲欧美专区二区| 日本三级在线观看网站| 亚洲第一综合| 成人av免费网站| 99视频免费看| 国产精品露脸自拍| 国产精品久久国产愉拍|