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

RabbitMQ都寫了,RocketMQ怎么能落下?

網絡 網絡管理
整體架構最近看到了我在Github上寫的rabbitmq-examples陸續被人star了,就想著寫個rocketmq-examples。對rabbitmq感興趣的小伙伴可以看我之前的文章。下面把RocketMQ的各個特性簡單介紹一下,這樣在用的時候心里也更有把握。

 整體架構最近看到了我在Github上寫的rabbitmq-examples陸續被人star了,就想著寫個rocketmq-examples。對rabbitmq感興趣的小伙伴可以看我之前的文章。下面把RocketMQ的各個特性簡單介紹一下,這樣在用的時候心里也更有把握。

[[335056]]

全網最全RabbitMQ總結,別再說你不會RabbitMQ

RocketMQ是阿里自研的消息中間件,RocketMQ的整體架構如下


主要有4個角色

 

Producer:消息生產者。類似,發信者 Consumer:消息消費者。類似,收信者 BrokerServer:消息的存儲,投遞,查詢。類似,郵局 NameServer:注冊中心,支持Broker的動態注冊與發現。類似,郵局的管理結構

再介紹幾個基本概念

Topic(主題):一類消息的集合,Topic和消息是一對多的關系。每個Broker可以存儲多個Topic的消息,每個Topic也可以分片存儲于不同的Broker

Tag(標簽):在Topic類別下的二級子類別。如財務系統的所有消息的Topic為Finance_Topic,創建訂單消息的Tag為Create_Tag,關閉訂單消息的Tag為Close_Tag。這樣就能根據Tag消費不同的消息,當然你也可以為創建訂單和關閉訂單的消息各自創建一個Topic

Message Queue(消息隊列):相當于Topic的分區,用于并行發送和消費消息。Message Queue在Broker上,一個Topic默認的Message Queue的數量為4

Producer Group(生產者組):同一類Producer的集合。如果發送的是事務消息且原始生產者在發送之后崩潰,Broker會聯系統一生產者組內的其他生產者實例以提交或回溯消費

Consumer Group(消費者組):同一類Consumer的集合。消費者組內的實例必須訂閱完全相同的Topic

Clustering(集群消費):相同Consumer Group下的每個Consumer實例平均分攤消息

Broadcasting(廣播消費):相同Consumer Group的每個Consumer實例都接收全量的消息

用圖演示一下Clustering和Broadcasting的區別

如果我有一條訂單程成交的消息,財務系統和物流系統都要同時訂閱消費這條消息,該怎么辦呢?定義2個Consumer Group即可


Consumer1和Consumer2屬于一個Consumer Group,Consumer3和Consumer4屬于一個Consumer Group,消息會全量發送到這2個Consuemr Group,至于這2個Consumer Group是集群消費還是廣播消費,自己定義即可

 

工作流程在官方文檔寫的很詳細,不再深入了

https://github.com/apache/rocketmq/tree/master/docs/cn

 

Message消息的各種處理方式涉及到的內容較多,所以我就不在文章中放代碼了,直接放GitHub了,目前還在不斷完善中

地址為:https://github.com/erlieStar/rocketmq-examples,

和之前的RabbitMQ一個風格,基本上所有知識點都涉及到了

地址為:https://github.com/erlieStar/rabbitmq-example

每個消息必須屬于一個Topic。RocketMQ中每個消息具有唯一的Message Id,且可以攜帶具有業務標識的Key,我們可以通過Topic,Message Id或Key來查詢消息

 

消息消費的方式

  1. Pull(拉取式消費),Consumer主動從Broker拉取消息
  2. Push(推送式消費),Broker收到數據后會主動推送給Consumer,實時性較高

消息的過濾方式

  • 指定Tag
  • SQL92語法過濾

消息的發送方式

  • 同步,收到響應后才會發送下一條消息
  • 異步,一直發,用異步的回調函數來獲取結果
  • 單向(只管發,不管結果)

消息的種類

  • 順序消息
  • 延遲消息
  • 批量消息
  • 事務消息

順序消息

順序消息分為局部有序和全局有序

官方介紹為普通順序消息和嚴格順序消息

局部有序:同一個業務相關的消息是有序的,如針對同一個訂單的創建和付款消息是有序的,只需要在發送的時候指定message queue即可,如下所示,將同一個orderId對應的消息發送到同一個隊列

  1. SendResult sendResult = producer.send(message, new MessageQueueSelector() { 
  2.  /** 
  3.   * @param mqs topic對應的message queue 
  4.   * @param msg send方法傳入的message 
  5.   * @param arg send方法傳入的orderId 
  6.   */ 
  7.  @Override 
  8.  public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) { 
  9.   // 根據業務對象選擇對應的隊列 
  10.   Integer orderId = (Integer) arg; 
  11.   int index = orderId % mqs.size(); 
  12.   return mqs.get(index); 
  13.  } 
  14. }, orderId); 

消費者所使用的Listener必須是MessageListenerOrderly(對于一個隊列的消息采用一個線程去處理),而平常的話我們使用的是MessageListenerConcurrently

全局有序:要想實現全局有序,則Topic只能有一個message queue。

延遲消息

RocketMQ并不支持任意時間的延遲,需要設置幾個固定的延時等級,從1s到2h分別對應著等級1到18

  1. // org.apache.rocketmq.store.config.MessageStoreConfig  
  2. private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h" 

批量消息

批量發送消息能顯著提高傳遞小消息的性能,限制是這批消息應該有相同的topic,相同的waitStoreMsgOK,而且不能是延時消息,一批消息的總大小不應超過1MB

事務消息

事務在實際的業務場景中還是經常遇到的,以轉賬為例子

張三給李四轉賬100元,可以分為如下2步

  1. 張三的賬戶減去100元
  2. 李四的賬戶加上100元

這2個操作要是同時成功,要是同時失敗,不然會造成數據不一致的情況,基于單個數據庫Connection時,我們只需要在方法上加上@Transactional注解就可以了。

如果基于多個Connection(如服務拆分,數據庫分庫分表),加@Transactional此時就不管用了,就得用到分布式事務

分布式事務的解決方案很多,RocketMQ只是其中一種方案,RocketMQ可以保證最終一致性

RocketMQ實現分布式事務的流程如下

 

  1. producer向mq server發送一個半消息
  2. mq server將消息持久化成功后,向發送方確認消息已經發送成功,此時消息并不會被consumer消費
  3. producer開始執行本地事務邏輯
  4. producer根據本地事務執行結果向mq server發送二次確認,mq收到commit狀態,將消息標記為可投遞,consumer會消費該消息。mq收到rollback則刪除半消息,consumer將不會消費該消息,如果收到unknow狀態,mq會對消息發起回查
  5. 在斷網或者應用重啟等特殊情況下,步驟4提交的2次確認有可能沒有到達mq server,經過固定時間后mq會對該消息發起回查
  6. producer收到回查后,需要檢查本地事務的執行狀態
  7. producer根據本地事務的最終狀態,再次提交二次確認,mq仍按照步驟4對半消息進行操作

理解了原理,看代碼實現就很容易了,放一個官方的example

  1. public class TransactionListenerImpl implements TransactionListener { 
  2.  
  3.     private AtomicInteger index = new AtomicInteger(0); 
  4.  
  5.     private ConcurrentHashMap<String, Integer> localTrans = new ConcurrentHashMap<>(); 
  6.  
  7.     @Override 
  8.     public LocalTransactionState executeLocalTransaction(Message msg, Object arg) { 
  9.         int value = index.getAndIncrement(); 
  10.         int status = value % 3; 
  11.         localTrans.put(msg.getTransactionId(), status); 
  12.         return LocalTransactionState.UNKNOW; 
  13.     } 
  14.  
  15.     @Override 
  16.     public LocalTransactionState checkLocalTransaction(MessageExt msg) { 
  17.         Integer status = localTrans.get(msg.getTransactionId()); 
  18.         if (status != null) { 
  19.             switch (status) { 
  20.                 case 0: 
  21.                     return LocalTransactionState.UNKNOW; 
  22.                 case 1: 
  23.                     return LocalTransactionState.COMMIT_MESSAGE; 
  24.                 case 2: 
  25.                     return LocalTransactionState.ROLLBACK_MESSAGE; 
  26.                 default
  27.                     return LocalTransactionState.COMMIT_MESSAGE; 
  28.             } 
  29.         } 
  30.         return LocalTransactionState.COMMIT_MESSAGE; 
  31.     } 

實現分布式事務需要實現TransactionListener接口,2個方法的作用如下

  1. executeLocalTransaction,執行本地事務
  2. checkLocalTransaction,回查本地事務狀態

針對這個例子,所有的消息都會回查,因為返回的都是UNKNOW,回查的時候status=1的數據會被消費,status=2的數據會被刪除,status=0的數據會一直回查,直到超過默認的回查次數。

發送方代碼如下

  1. public class TransactionProducer { 
  2.  
  3.     public static final String RPODUCER_GROUP_NAME = "transactionProducerGroup"
  4.     public static final String TOPIC_NAME = "transactionTopic"
  5.     public static final String TAG_NAME = "transactionTag"
  6.  
  7.     public static void main(String[] args) throws Exception { 
  8.         TransactionListener transactionListener = new TransactionListenerImpl(); 
  9.         TransactionMQProducer producer = new TransactionMQProducer(RPODUCER_GROUP_NAME); 
  10.  
  11.         ExecutorService executorService = new ThreadPoolExecutor(2, 5, 100, TimeUnit.SECONDS, 
  12.                 new ArrayBlockingQueue<>(100), new ThreadFactory() { 
  13.  
  14.             @Override 
  15.             public Thread newThread(Runnable r) { 
  16.                 Thread thread = new Thread(); 
  17.                 thread.setName("transaction-msg-check-thread"); 
  18.                 return thread; 
  19.             } 
  20.         }); 
  21.         producer.setExecutorService(executorService); 
  22.         producer.setTransactionListener(transactionListener); 
  23.         producer.start(); 
  24.  
  25.         for (int i = 0; i < 100; i++) { 
  26.             Message message = new Message(TOPIC_NAME, TAG_NAME, 
  27.                     ("hello rocketmq " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)); 
  28.             SendResult sendResult = producer.send(message); 
  29.             System.out.println(sendResult); 
  30.         } 
  31.  
  32.         TimeUnit.HOURS.sleep(1); 
  33.         producer.shutdown(); 
  34.     } 

看到這,可能有人會問了,我們先執行本地事務,執行成功后再發送消息,這樣可以嗎?

其實這樣做還是有可能會造成數據不一致的問題。假如本地事務執行成功,發送消息,由于網絡延遲,消息發送成功,但是回復超時了,拋出異常,本地事務回滾。但是消息其實投遞成功并被消費了,此時就會造成數據不一致的情況

那消息投遞到mq server,consumer消費失敗怎么辦?

如果是消費超時,重試即可。如果是由于代碼等原因真的消費失敗了,此時就得人工介入,重新手動發送消息,達到最終一致性。

消息重試

發送端重試

producer向broker發送消息后,沒有收到broker的ack時,rocketmq會自動重試。重試的次數可以設置,默認為2次

  1. DefaultMQProducer producer = new DefaultMQProducer(RPODUCER_GROUP_NAME); 
  2. // 同步發送設置重試次數為5次 
  3. producer.setRetryTimesWhenSendFailed(5); 
  4. // 異步發送設置重試次數為5次 
  5. producer.setRetryTimesWhenSendAsyncFailed(5); 

消費端重試

順序消息的重試

對于順序消息,當Consumer消費消息失敗后,RocketMQ會不斷進行消息重試,此時后續消息會被阻塞。所以當使用順序消息的時候,監控一定要做好,避免后續消息被阻塞

無序消息的重試

當消費模式為集群模式時,Broker才會自動進行重試,對于廣播消息是不會進行重試的

當consumer消費消息后返回ConsumeConcurrentlyStatus.CONSUME_SUCCESS表明消費消息成功,不會進行重試

當consumer符合如下三種場景之一時,會對消息進行重試

  • 返回ConsumeConcurrentlyStatus.RECONSUME_LATER
  • 返回null
  • 主動或被動拋出異常

RocketMQ默認每條消息會被重試16次,超過16次則不再重試,會將消息放到死信隊列,當然我們也可以自己設置重試次數

每次重試的時間間隔如下

第幾次重試 與上次間隔時間 第幾次重試 與上次間隔時間
1 10s 10 7分鐘
2 30s 11 8分鐘
3 1分鐘 12 9分鐘
4 2分鐘 13 10分鐘
5 3分鐘 14 20分鐘
6 4分鐘 15 30分鐘
7 5分鐘 16 1小時
8 6分鐘 17 2小時

重試隊列和死信隊列

當消息消費失敗,會被發送到重試隊列

當消息消費失敗,并達到最大重試次數,rocketmq并不會將消息丟棄,而是將消息發送到死信隊列

死信隊列有如下特點

  1. 里面存的是不能被正常消費的消息
  2. 有效期與正常消息相同,都是3天,3天后會被刪除
  3. 每個死信隊列對應一個Consumer Group ID,即死信隊列是消費者組級別的
  4. 如果一個Consumer Group沒有產生死信消息,則RocketMQ不會創建對應的死信隊列
  5. 死信隊列包含了一個Consumer Group下的所有死信消息,不管該消息屬于哪個Topic
  6. 重試隊列的命名為 %RETRY%消費組名稱 死信隊列的命名為 %DLQ%消費組名稱

RocketMQ高性能和高可用的方式

整體架構

rocketmq是通過broker主從機制來實現高可用的。相同broker名稱,不同brokerid的機器組成一個broker組,brokerId=0表明這個broker是master,brokerId>0表明這個broker是slave。

 

消息生產的高可用:創建topic時,把topic的多個message queue創建在多個broker組上。這樣當一個broker組的master不可用后,producer仍然可以給其他組的master發送消息。rocketmq目前還不支持主從切換,需要手動切換

消息消費的高可用:consumer并不能配置從master讀還是slave讀。當master不可用或者繁忙的時候consumer會被自動切換到從slave讀。這樣當master出現故障后,consumer仍然可以從slave讀,保證了消息消費的高可用

消息存儲結構

RocketMQ需要保證消息的高可靠性,所以要將數據通過磁盤進行持久化存儲。

將數據存到磁盤會不會很慢?其實磁盤有時候比你想象的快,有時候比你想象的慢。目前高性能磁盤的順序寫速度可以達到600M/s,而磁盤的隨機寫大概只有100k/s,和順序寫的性能相差6000倍,所以RocketMQ采用順序寫。

并且通過mmap(零拷貝的一種實現方式,零拷貝可以省去用戶態到內核態的數據拷貝,提高速度)具體原理并不是很懂,有興趣的小伙伴可以看看相關書籍

總而言之,RocketMQ通過順序寫和零拷貝技術實現了高性能的消息存儲

和消息相關的文件有如下幾種

 

  • CommitLog:存儲消息的元數據
  • ConsumerQueue:存儲消息在CommitLog的索引
  • IndexFile:提供了一種通過key或者時間區間來查詢消息的方法

刷盤機制

 

  1. 同步刷盤:消息被寫入內存的PAGECACHE,返回寫成功狀態,當內存里的消息量積累到一定程度時,統一觸發寫磁盤操作,快速寫入 。吞吐量低,但不會造成消息丟失
  2. 異步刷盤:消息寫入內存的PAGECACHE后,立刻通知刷盤線程刷盤,然后等待刷盤完成,刷盤線程執行完成后喚醒等待的線程,給應用返回消息寫成功的狀態。吞吐量高,當磁盤損壞時,會丟失消息

主從復制

如果一個broker有master和slave時,就需要將master上的消息復制到slave上,復制的方式有兩種

  • 同步復制:master和slave均寫成功,才返回客戶端成功。maste掛了以后可以保證數據不丟失,但是同步復制會增加數據寫入延遲,降低吞吐量
  • 異步復制:master寫成功,返回客戶端成功。擁有較低的延遲和較高的吞吐量,但是當master出現故障后,有可能造成數據丟失

負載均衡

Producer負載均衡

producer在發送消息時,默認輪詢所有queue,消息就會被發送到不同的queue上。而queue可以分布在不同的broker上

 

Consumer負載均衡

默認的分配算法是AllocateMessageQueueAveragely,如下圖

還有另外一種平均的算法是AllocateMessageQueueAveragelyByCircle,也是平均分攤queue,只是以環狀輪流分queue的形式,如下圖:


如果consumer數量比message queue還多,則多會來的consumer會被閑置。所以不要讓consumer的數量多于message queue的數量

 

圖形化管理工具

在rocketmq-externals這個項目中提供了rocketmq的很多擴展工具

github地址如下:https://github.com/apache/rocketmq-externals

其中有一個子項目rocketmq-console提供了rocketmq的圖像化工具,提供了很多實用的功能,如前面說的通過Topic,Message Id或Key來查詢消息,重新發送消息等,還是很方便的

本文轉載自微信公眾號「Java識堂」,可以通過以下二維碼關注。轉載本文請聯系Java識堂公眾號。

 

責任編輯:武曉燕 來源: Java識堂
相關推薦

2021-08-27 14:14:39

ThreadLocal源碼操作

2025-01-02 08:31:33

2022-07-27 22:48:29

消息中間件RocketMQ架構設計

2024-10-15 09:27:36

2024-02-06 07:56:20

數據庫分布式數據庫架構產品

2023-03-10 08:00:03

KafkaActiveMQ

2018-08-14 10:04:52

搜狗

2021-11-04 12:42:55

RocketMQ啟動消費

2025-07-21 09:02:45

2019-04-11 10:26:15

架構運維技術

2022-10-08 09:33:00

平臺中間件

2023-10-24 07:50:18

消息中間件MQ

2015-06-19 07:30:35

AWS遷移遺留應用云遷移

2023-03-09 10:22:00

SpringBootRabbitMQ

2023-09-18 08:27:20

RabbitMQRocketMQKafka

2016-11-10 21:00:49

消息存儲數據

2022-02-07 12:10:01

消息

2024-11-05 10:24:50

2024-11-20 08:09:19

RabbitMQ項目客戶端
點贊
收藏

51CTO技術棧公眾號

久久综合免费视频| 欧美三级一区二区| 精品人伦一区二区三区| 国产主播第一页| 91麻豆国产自产在线观看亚洲| 日韩一级完整毛片| 国产精品沙发午睡系列| 天堂中文а√在线| 成人av电影在线网| 国产精品一区二区三区久久| 国产一级在线观看视频| 欧美日韩国产高清电影| 精品国产三级a在线观看| 日韩中文字幕组| 欧美另类tv| 日本一区二区动态图| 国产v亚洲v天堂无码| 久久精品国产亚洲av麻豆蜜芽| 国产精品videosex极品| 中文字幕亚洲图片| 欧美 变态 另类 人妖| 精品国产亚洲一区二区三区在线| 色综合久久综合网欧美综合网 | 丰满人妻一区二区三区无码av | 国产精品h片在线播放| 欧美日韩国产精品综合| 日韩久久视频| 亚洲欧美国产精品va在线观看| 九九热视频免费| 日韩一区二区三区在线免费观看| 亚洲国产毛片aaaaa无费看| 一区二区三区视频在线播放| 日本在线视频1区| 成人性视频免费网站| 成人免费在线视频网站| 日韩精选在线观看| 亚洲欧美日韩一区在线观看| 欧美激情免费看| 高h视频免费观看| 欧美gay男男猛男无套| 国产一区二区日韩| www.久久国产| 中文字幕亚洲影视| 亚洲精品美女在线| 中文在线一区二区三区| 国产伦精品一区二区三区在线播放| 91精品国产一区二区三区| 在线观看免费的av| 亚洲高清影院| 在线综合+亚洲+欧美中文字幕| 午夜宅男在线视频| 久久69成人| 欧美日韩国产a| 在线黄色免费观看| 久久天天久久| 欧美日韩国产另类不卡| 中文字幕一区久久| 国产精品一区二区精品视频观看| 3d成人h动漫网站入口| 亚洲制服在线观看| 91综合久久爱com| 精品成a人在线观看| 丰满少妇xbxb毛片日本| 久久a级毛片毛片免费观看| 亚洲国产精品美女| 成人在线视频免费播放| 五月天亚洲色图| 国产小视频国产精品| 精品一区二区三孕妇视频| 成人在线丰满少妇av| www.日韩.com| 免费无遮挡无码永久在线观看视频 | 欧美第一页在线观看| 欧美人成在线| 97超级碰碰碰| 怡红院成永久免费人全部视频| 久99久精品视频免费观看| 亚洲xxxx在线| 午夜av免费在线观看| 国产日韩欧美麻豆| 大桥未久一区二区三区| av电影院在线看| 91精品办公室少妇高潮对白| 亚洲色图偷拍视频| 开心激情综合| 自拍亚洲一区欧美另类| 九九视频在线观看| 日韩中文字幕亚洲一区二区va在线| 91精品国产综合久久香蕉922| 丰满肥臀噗嗤啊x99av| 国产亚洲欧美激情| 精品国产三级a∨在线| 色是在线视频| 69堂国产成人免费视频| 伊人网综合视频| 欧美一级淫片| 性亚洲最疯狂xxxx高清| 在线观看亚洲一区二区| 成人午夜在线播放| 亚洲精品日韩在线观看| 成全电影大全在线观看| 欧美日韩色综合| 中文字幕在线视频播放| 国产精品久久久久久| 欧美亚洲免费电影| 国产乱码久久久久| 久久女同性恋中文字幕| 97在线免费视频观看| 国精产品一区二区三区有限公司| 精品久久久久久无| 美女网站视频色| 亚洲一区二区毛片| 91久久中文字幕| 免费动漫网站在线观看| 亚洲图片欧美一区| 欧美在线aaa| 色婷婷久久久| 久久久久久久久久久成人| 伊人网视频在线| 久久精品在线免费观看| 99在线免费视频观看| а天堂中文最新一区二区三区| 亚洲乱码一区av黑人高潮| 欧美黄片一区二区三区| 老司机精品视频在线| 日本视频一区二区在线观看| 国产高清视频色在线www| 欧美一区二区三区婷婷月色| 午夜国产福利视频| 日本麻豆一区二区三区视频| 久久综合狠狠综合久久综青草| 欧美寡妇性猛交xxx免费| 7777精品伊人久久久大香线蕉完整版| 国产av自拍一区| 老鸭窝毛片一区二区三区| 国产欧美丝袜| 国产第一页在线视频| 精品久久人人做人人爰| 国产a免费视频| 国产精品亚洲а∨天堂免在线| 在线观看欧美激情| 图片一区二区| 久久精品国产久精国产一老狼 | 日韩欧美国产一区在线观看| 国产男女猛烈无遮挡在线喷水| 蜜臀国产一区二区三区在线播放| 日韩国产欧美一区| 精品日韩视频| 中文字幕日韩电影| 中文字幕日日夜夜| 国产精品三级在线观看| 在线观看国产一级片| 天天做天天爱天天综合网2021 | 色综合av综合无码综合网站| 日韩深夜影院| 国产成人一区三区| av大片在线播放| 欧美日韩亚洲高清一区二区| 日日噜噜夜夜狠狠久久波多野| 激情偷乱视频一区二区三区| 黄色污污在线观看| 盗摄牛牛av影视一区二区| 久久欧美在线电影| 撸视在线观看免费视频| 欧美三级韩国三级日本一级| 看免费黄色录像| 成人一级片网址| 日本成年人网址| 日韩精品免费一区二区在线观看 | 日本高清视频在线| 欧美色道久久88综合亚洲精品| 久操视频免费看| 麻豆成人av在线| 国产小视频免费| 天堂网av成人| 国产欧美最新羞羞视频在线观看| 黄色成年人视频在线观看| 精品国产伦一区二区三区观看方式 | 18加网站在线| 日韩电影大片中文字幕| 国产在线一级片| 亚洲最新视频在线观看| 最新在线黄色网址| 美女免费视频一区| av免费观看国产| 成人在线电影在线观看视频| 成人av蜜桃| 日韩成人亚洲| 色综合天天综合网国产成人网 | 久久久精品国产亚洲| 黄色片一区二区| 欧美性色黄大片| 久久久久香蕉视频| 国产欧美综合色| 女同性αv亚洲女同志| 玖玖精品视频| 日韩一区二区高清视频| 精品少妇av| 国产一区二区三区高清视频| 78精品国产综合久久香蕉| 欧美精品videos性欧美| 999国产在线视频| 亚洲国产精品大全| 国产情侣自拍小视频| 色八戒一区二区三区| 国产精品99精品无码视| 国产精品拍天天在线| 免费日本黄色网址| 国产激情视频一区二区在线观看| 人妻丰满熟妇av无码区app| 欧美啪啪一区| 强伦女教师2:伦理在线观看| 一本久久青青| 国产日本一区二区三区| 成人豆花视频| 国产精品第七十二页| 美女网站在线看| 欧美黄色小视频| 国产91在线视频蝌蚪| 中文字幕欧美在线| 免费黄网站在线观看| 亚洲精品久久久久久久久久久久 | 国产美女激情视频| 亚洲一区二区欧美激情| 51精品免费网站| 中文字幕高清一区| 久久成人激情视频| 久久影视一区二区| 在线观看国产三级| 成人免费观看视频| www.欧美com| 国产福利一区在线观看| 日本一二三四区视频| 麻豆成人综合网| www.cao超碰| 蜜桃精品视频在线| www.精品在线| 免费人成黄页网站在线一区二区| 已婚少妇美妙人妻系列| 久久免费高清| 欧美黑人又粗又大又爽免费| 美女精品在线观看| 欧美精品一区二区三区免费播放| 免费一区视频| 国产真实乱子伦| 久久午夜电影| 成年人在线看片| 日韩电影在线免费看| 亚洲最大综合网| 美国一区二区三区在线播放| 欧美激情第3页| 国产美女视频91| 伊人av在线播放| 成人短视频下载| 给我免费观看片在线电影的| 91麻豆免费看| 手机看片福利视频| 国产精品精品国产色婷婷| 91av手机在线| 一区二区三区四区蜜桃| 四虎永久在线精品| 欧美性xxxx在线播放| 99re这里只有精品在线| 欧美天堂一区二区三区| 国产口爆吞精一区二区| 精品国产一区二区在线观看| 色在线免费视频| 国产亚洲视频中文字幕视频| 天堂资源在线中文| 欧美黑人巨大xxx极品| 韩国成人二区| 国产精品女视频| 中文成人激情娱乐网| 国产精品初高中精品久久| 神马香蕉久久| 在线一区亚洲| 狠狠久久婷婷| 久久综合久久色| 国产一区免费电影| 无码任你躁久久久久久老妇| 久久久久国产免费免费| 亚洲一二三四五六区| 亚洲一区二区三区国产| 日韩精品在线一区二区三区| 欧美一区二区三区日韩视频| 天天操天天操天天| 日韩专区中文字幕| 黑人极品ⅴideos精品欧美棵| 日本一区二区不卡| 日本精品在线播放| 久久这里精品国产99丫e6| 久久精品国产大片免费观看| 成人在线观看你懂的| 捆绑调教美女网站视频一区| 国产情侣久久久久aⅴ免费| 国产欧美久久久精品影院| 久久黄色免费视频| 日韩欧美国产成人| 91极品身材尤物theporn| 日韩av一区二区在线| www免费在线观看| 日韩av123| 白白在线精品| 在线国产精品网| 国产精品一区亚洲| 国产精品久久久久野外| 久久久久久久综合日本| 国产在线综合网| 欧美日韩一本到| 欧洲免费在线视频| 欧美精品18videos性欧| www 久久久| 一区二区成人国产精品 | 国产精品女主播视频| 色爱综合av| 中国丰满熟妇xxxx性| 韩国一区二区三区| 快灬快灬一下爽蜜桃在线观看| 五月婷婷激情综合| 高h放荡受浪受bl| 久久在线视频在线| 日韩av懂色| 小说区图片区图片区另类灬| 免费在线成人| www.88av| 亚洲成人免费影院| 亚洲精品18在线观看| 久热爱精品视频线路一| 日韩在线你懂得| 亚洲精品中文字幕在线| 日韩电影在线免费看| 欧洲美一区二区三区亚洲| 欧美视频在线观看免费| 亚州av在线播放| 7m第一福利500精品视频| 国产ts一区| a级黄色小视频| 成人精品鲁一区一区二区| 欧美色图一区二区| 日韩欧美在线观看一区二区三区| 里番在线观看网站| 国产主播在线一区| 久久久久久久久久久妇女| 亚洲欧美视频二区| 国产精品成人免费在线| 一区二区视频播放| 久久精品国产91精品亚洲| 亚洲欧美一级| 免费在线精品视频| 国产一区二区三区四区五区美女| 婷婷久久综合网| 日韩精品一区二区三区三区免费| 香蕉成人app免费看片| 粉嫩av一区二区三区免费观看| 国产在线日韩| 搡老熟女老女人一区二区| 日韩欧美精品中文字幕| 国产福利电影在线| 国产日韩欧美日韩| 亚洲欧洲中文字幕| 91精品人妻一区二区三区四区| 午夜精品久久久久久久久 | 久久精品国产一区二区电影| 久久69av| 1024av视频| 国产亚洲精品aa午夜观看| 中文字幕一区二区三区免费看| www.国产一区| 澳门成人av| 成人性生生活性生交12| 成人免费在线视频| 好吊视频一二三区| 欧美在线激情网| 青青一区二区三区| 久久发布国产伦子伦精品| 午夜欧美大尺度福利影院在线看 | 欧美国产日韩精品免费观看| 一级片免费网站| 久久久视频免费观看| av亚洲免费| 亚洲欧美综合视频| 色88888久久久久久影院按摩| 男人天堂久久久| 精品国产一区二区三区免费| 日韩综合在线视频| 青青草国产在线观看| 亚洲欧美一区二区三区久久| 国产精品麻豆| 北条麻妃69av| 亚洲人成在线播放网站岛国| 五月婷婷久久久| 91情侣偷在线精品国产| 国产精品久久久一区二区| 欧美激情精品久久久久久免费| 亚洲国模精品私拍| 成人97精品毛片免费看| 免费日韩视频在线观看| 亚洲精品美腿丝袜| 成人影视在线播放| 国产精品一区二区欧美黑人喷潮水|