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

消息消費失敗如何處理?

開發 前端
在介紹消息中間件 MQ 之前,我們先來簡單的了解一下,為何要引用消息中間件。

[[384109]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。   

一、介紹

在介紹消息中間件 MQ 之前,我們先來簡單的了解一下,為何要引用消息中間件。

例如,在電商平臺中,常見的用戶下單,會經歷以下幾個流程。

當用戶下單時,創建完訂單之后,會調用第三方支付平臺,對用戶的賬戶金額進行扣款,如果平臺支付扣款成功,會將結果通知到對應的業務系統,接著業務系統會更新訂單狀態,同時調用倉庫接口,進行減庫存,通知物流進行發貨!

 

試想一下,從訂單狀態更新、到扣減庫存、通知物流發貨都在一個方法內同步完成,假如用戶支付成功、訂單狀態更新也成功,但是在扣減庫存或者通知物流發貨步驟失敗了,那么就會造成一個問題,用戶已經支付成功了,只是在倉庫扣減庫存方面失敗,從而導致整個交易失敗!

一單失敗,老板可以假裝看不見,但是如果上千個單子都因此失敗,那么因系統造成的業務損失,將是巨大的,老板可能坐不住了!

因此,針對這種業務場景,架構師們引入了異步通信技術方案,從而保證服務的高可用,大體流程如下:

 

當訂單系統收到支付平臺發送的扣款結果之后,會將訂單消息發送到 MQ 消息中間件,同時也會更新訂單狀態。

在另一端,由倉庫系統來異步監聽訂單系統發送的消息,當收到訂單消息之后,再操作扣減庫存、通知物流公司發貨等服務!

在優化后的流程下,即使扣減庫存服務失敗,也不會影響用戶交易。

正如《人月神話》中所說的,軟件工程,沒有銀彈!

當引入了 MQ 消息中間件之后,同樣也會帶來另一個問題,假如 MQ 消息中間件突然宕機了,導致消息無法發送出去,那倉庫系統就無法接受到訂單消息,進而也無法發貨!

針對這個問題,業界主流的解決辦法是采用集群部署,一主多從模式,從而實現服務的高可用,即使一臺機器突然宕機了,也依然能保證服務可用,在服務器故障期間,通過運維手段,將服務重新啟動,之后服務依然能正常運行!

但是還有另一個問題,假如倉庫系統已經收到訂單消息了,但是業務處理異常,或者服務器異常,導致當前商品庫存并沒有扣減,也沒有發貨!

這個時候又改如何處理呢?

今天我們所要介紹的正是這種場景,假如消息消費失敗,我們應該如何處理?

二、解決方案

針對消息消費失敗的場景,我們一般會通過如下方式進行處理:

  • 當消息消費失敗時,會對消息進行重新推送
  • 如果重試次數超過最大值,會將異常消息存儲到數據庫,然后人工介入排查問題,進行手工重試

 

當消息在客戶端消費失敗時,我們會將異常的消息加入到一個消息重試對象中,同時設置最大重試次數,并將消息重新推送到 MQ 消息中間件里,當重試次數超過最大值時,會將異常的消息存儲到 MongoDB數據庫中,方便后續查詢異常的信息。

基于以上系統模型,我們可以編寫一個公共重試組件,話不多說,直接干!

三、代碼實踐

本次補償服務采用 rabbitmq 消息中間件進行處理,其他消息中間件處理思路也類似!

3.1、創建一個消息重試實體類

  1. @Data 
  2. @EqualsAndHashCode(callSuper = false
  3. @Accessors(chain = true
  4. public class MessageRetryDTO implements Serializable { 
  5.  
  6.     private static final long serialVersionUID = 1L; 
  7.  
  8.     /** 
  9.      * 原始消息body 
  10.      */ 
  11.     private String bodyMsg; 
  12.  
  13.     /** 
  14.      * 消息來源ID 
  15.      */ 
  16.     private String sourceId; 
  17.  
  18.     /** 
  19.      * 消息來源描述 
  20.      */ 
  21.     private String sourceDesc; 
  22.  
  23.     /** 
  24.      * 交換器 
  25.      */ 
  26.     private String exchangeName; 
  27.  
  28.     /** 
  29.      * 路由鍵 
  30.      */ 
  31.     private String routingKey; 
  32.  
  33.     /** 
  34.      * 隊列 
  35.      */ 
  36.     private String queueName; 
  37.  
  38.     /** 
  39.      * 狀態,1:初始化,2:成功,3:失敗 
  40.      */ 
  41.     private Integer status = 1; 
  42.  
  43.     /** 
  44.      * 最大重試次數 
  45.      */ 
  46.     private Integer maxTryCount = 3; 
  47.  
  48.     /** 
  49.      * 當前重試次數 
  50.      */ 
  51.     private Integer currentRetryCount = 0; 
  52.  
  53.     /** 
  54.      * 重試時間間隔(毫秒) 
  55.      */ 
  56.     private Long retryIntervalTime = 0L; 
  57.  
  58.     /** 
  59.      * 任務失敗信息 
  60.      */ 
  61.     private String errorMsg; 
  62.  
  63.     /** 
  64.      * 創建時間 
  65.      */ 
  66.     private Date createTime; 
  67.  
  68.     @Override 
  69.     public String toString() { 
  70.         return "MessageRetryDTO{" + 
  71.                 "bodyMsg='" + bodyMsg + '\'' + 
  72.                 ", sourceId='" + sourceId + '\'' + 
  73.                 ", sourceDesc='" + sourceDesc + '\'' + 
  74.                 ", exchangeName='" + exchangeName + '\'' + 
  75.                 ", routingKey='" + routingKey + '\'' + 
  76.                 ", queueName='" + queueName + '\'' + 
  77.                 ", status=" + status + 
  78.                 ", maxTryCount=" + maxTryCount + 
  79.                 ", currentRetryCount=" + currentRetryCount + 
  80.                 ", retryIntervalTime=" + retryIntervalTime + 
  81.                 ", errorMsg='" + errorMsg + '\'' + 
  82.                 ", createTime=" + createTime + 
  83.                 '}'
  84.     } 
  85.  
  86.     /** 
  87.      * 檢查重試次數是否超過最大值 
  88.      * 
  89.      * @return 
  90.      */ 
  91.     public boolean checkRetryCount() { 
  92.         retryCountCalculate(); 
  93.         //檢查重試次數是否超過最大值 
  94.         if (this.currentRetryCount < this.maxTryCount) { 
  95.             return true
  96.         } 
  97.         return false
  98.     } 
  99.  
  100.     /** 
  101.      * 重新計算重試次數 
  102.      */ 
  103.     private void retryCountCalculate() { 
  104.         this.currentRetryCount = this.currentRetryCount + 1; 
  105.     } 
  106.  

3.2、編寫服務重試抽象類

  1. public abstract class CommonMessageRetryService { 
  2.  
  3.     private static final Logger log = LoggerFactory.getLogger(CommonMessageRetryService.class); 
  4.  
  5.     @Autowired 
  6.     private RabbitTemplate rabbitTemplate; 
  7.  
  8.     @Autowired 
  9.     private MongoTemplate mongoTemplate; 
  10.  
  11.  
  12.     /** 
  13.      * 初始化消息 
  14.      * 
  15.      * @param message 
  16.      */ 
  17.     public void initMessage(Message message) { 
  18.         log.info("{} 收到消息: {},業務數據:{}", this.getClass().getName(), message.toString(), new String(message.getBody())); 
  19.         try { 
  20.             //封裝消息 
  21.             MessageRetryDTO messageRetryDto = buildMessageRetryInfo(message); 
  22.             if (log.isInfoEnabled()) { 
  23.                 log.info("反序列化消息:{}", messageRetryDto.toString()); 
  24.             } 
  25.             prepareAction(messageRetryDto); 
  26.         } catch (Exception e) { 
  27.             log.warn("處理消息異常,錯誤信息:", e); 
  28.         } 
  29.     } 
  30.  
  31.     /** 
  32.      * 準備執行 
  33.      * 
  34.      * @param retryDto 
  35.      */ 
  36.     protected void prepareAction(MessageRetryDTO retryDto) { 
  37.         try { 
  38.             execute(retryDto); 
  39.             doSuccessCallBack(retryDto); 
  40.         } catch (Exception e) { 
  41.             log.error("當前任務執行異常,業務數據:" + retryDto.toString(), e); 
  42.             //執行失敗,計算是否還需要繼續重試 
  43.             if (retryDto.checkRetryCount()) { 
  44.                 if (log.isInfoEnabled()) { 
  45.                     log.info("重試消息:{}", retryDto.toString()); 
  46.                 } 
  47.                 retrySend(retryDto); 
  48.             } else { 
  49.                 if (log.isWarnEnabled()) { 
  50.                     log.warn("當前任務重試次數已經到達最大次數,業務數據:" + retryDto.toString(), e); 
  51.                 } 
  52.                 doFailCallBack(retryDto.setErrorMsg(e.getMessage())); 
  53.             } 
  54.         } 
  55.     } 
  56.  
  57.     /** 
  58.      * 任務執行成功,回調服務(根據需要進行重寫) 
  59.      * 
  60.      * @param messageRetryDto 
  61.      */ 
  62.     private void doSuccessCallBack(MessageRetryDTO messageRetryDto) { 
  63.         try { 
  64.             successCallback(messageRetryDto); 
  65.         } catch (Exception e) { 
  66.             log.warn("執行成功回調異常,隊列描述:{},錯誤原因:{}", messageRetryDto.getSourceDesc(), e.getMessage()); 
  67.         } 
  68.     } 
  69.  
  70.     /** 
  71.      * 任務執行失敗,回調服務(根據需要進行重寫) 
  72.      * 
  73.      * @param messageRetryDto 
  74.      */ 
  75.     private void doFailCallBack(MessageRetryDTO messageRetryDto) { 
  76.         try { 
  77.             saveMessageRetryInfo(messageRetryDto.setErrorMsg(messageRetryDto.getErrorMsg())); 
  78.             failCallback(messageRetryDto); 
  79.         } catch (Exception e) { 
  80.             log.warn("執行失敗回調異常,隊列描述:{},錯誤原因:{}", messageRetryDto.getSourceDesc(), e.getMessage()); 
  81.         } 
  82.     } 
  83.  
  84.     /** 
  85.      * 執行任務 
  86.      * 
  87.      * @param messageRetryDto 
  88.      */ 
  89.     protected abstract void execute(MessageRetryDTO messageRetryDto); 
  90.  
  91.     /** 
  92.      * 成功回調 
  93.      * 
  94.      * @param messageRetryDto 
  95.      */ 
  96.     protected abstract void successCallback(MessageRetryDTO messageRetryDto); 
  97.  
  98.     /** 
  99.      * 失敗回調 
  100.      * 
  101.      * @param messageRetryDto 
  102.      */ 
  103.     protected abstract void failCallback(MessageRetryDTO messageRetryDto); 
  104.  
  105.     /** 
  106.      * 構建消息補償實體 
  107.      * @param message 
  108.      * @return 
  109.      */ 
  110.     private MessageRetryDTO buildMessageRetryInfo(Message message){ 
  111.         //如果頭部包含補償消息實體,直接返回 
  112.         Map<String, Object> messageHeaders = message.getMessageProperties().getHeaders(); 
  113.         if(messageHeaders.containsKey("message_retry_info")){ 
  114.             Object retryMsg = messageHeaders.get("message_retry_info"); 
  115.             if(Objects.nonNull(retryMsg)){ 
  116.                 return JSONObject.parseObject(String.valueOf(retryMsg), MessageRetryDTO.class); 
  117.             } 
  118.         } 
  119.         //自動將業務消息加入補償實體 
  120.         MessageRetryDTO messageRetryDto = new MessageRetryDTO(); 
  121.         messageRetryDto.setBodyMsg(new String(message.getBody(), StandardCharsets.UTF_8)); 
  122.         messageRetryDto.setExchangeName(message.getMessageProperties().getReceivedExchange()); 
  123.         messageRetryDto.setRoutingKey(message.getMessageProperties().getReceivedRoutingKey()); 
  124.         messageRetryDto.setQueueName(message.getMessageProperties().getConsumerQueue()); 
  125.         messageRetryDto.setCreateTime(new Date()); 
  126.         return messageRetryDto; 
  127.     } 
  128.  
  129.     /** 
  130.      * 異常消息重新入庫 
  131.      * @param retryDto 
  132.      */ 
  133.     private void retrySend(MessageRetryDTO retryDto){ 
  134.         //將補償消息實體放入頭部,原始消息內容保持不變 
  135.         MessageProperties messageProperties = new MessageProperties(); 
  136.         messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON); 
  137.         messageProperties.setHeader("message_retry_info", JSONObject.toJSON(retryDto)); 
  138.         Message message = new Message(retryDto.getBodyMsg().getBytes(), messageProperties); 
  139.         rabbitTemplate.convertAndSend(retryDto.getExchangeName(), retryDto.getRoutingKey(), message); 
  140.     } 
  141.  
  142.  
  143.  
  144.     /** 
  145.      * 將異常消息存儲到mongodb中 
  146.      * @param retryDto 
  147.      */ 
  148.     private void saveMessageRetryInfo(MessageRetryDTO retryDto){ 
  149.         try { 
  150.             mongoTemplate.save(retryDto, "message_retry_info"); 
  151.         } catch (Exception e){ 
  152.             log.error("將異常消息存儲到mongodb失敗,消息數據:" + retryDto.toString(), e); 
  153.         } 
  154.     } 

3.3、編寫監聽服務類

在消費端應用的時候,也非常簡單,例如,針對扣減庫存操作,我們可以通過如下方式進行處理!

  1. @Component 
  2. public class OrderServiceListener extends CommonMessageRetryService { 
  3.  
  4.     private static final Logger log = LoggerFactory.getLogger(OrderServiceListener.class); 
  5.  
  6.     /** 
  7.      * 監聽訂單系統下單成功消息 
  8.      * @param message 
  9.      */ 
  10.     @RabbitListener(queues = "mq.order.add"
  11.     public void consume(Message message) { 
  12.         log.info("收到訂單下單成功消息: {}", message.toString()); 
  13.         super.initMessage(message); 
  14.     } 
  15.  
  16.  
  17.     @Override 
  18.     protected void execute(MessageRetryDTO messageRetryDto) { 
  19.         //調用扣減庫存服務,將業務異常拋出來 
  20.     } 
  21.  
  22.     @Override 
  23.     protected void successCallback(MessageRetryDTO messageRetryDto) { 
  24.         //業務處理成功,回調 
  25.     } 
  26.  
  27.     @Override 
  28.     protected void failCallback(MessageRetryDTO messageRetryDto) { 
  29.         //業務處理失敗,回調 
  30.     } 

當消息消費失敗,并超過最大次數時,會將消息存儲到 mongodb 中,然后像常規數據庫操作一樣,可以通過 web 接口查詢異常消息,并針對具體場景進行重試!

四、小結

可能有的同學會問,為啥不將異常消息存在數據庫?

起初的確是存儲在 MYSQL 中,但是隨著業務的快速發展,訂單消息數據結構越來越復雜,數據量也非常的大,甚至大到 MYSQL 中的 text 類型都無法存儲,同時這種數據結構也不太適合在 MYSQL 中存儲,因此將其遷移到 mongodb!

本文主要圍繞消息消費失敗這種場景,進行基礎的方案和代碼實踐講解,可能有理解不到位的地方,歡迎批評指出!

五、參考

 

1、石杉的架構筆記 - 如何處理消息消費失敗問題

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2024-09-23 08:04:45

MYSQL數據存儲

2025-11-20 08:49:23

2012-07-03 11:18:20

運維disable tab

2019-08-15 10:20:19

云計算技術安全

2018-12-25 09:44:42

2017-03-13 13:21:34

Git處理大倉庫

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux內核

2019-12-23 10:20:12

Web圖片優化前端

2017-10-26 08:43:18

JavaScript內存處理

2022-06-02 10:54:16

BrokerRocketMQ

2024-12-18 07:43:49

2024-05-23 12:11:39

2021-05-31 10:47:17

SpringSecuritySession

2023-07-03 13:50:13

ReactonResize事件

2024-08-26 10:47:22

2022-04-19 09:00:52

ReactTypeScript

2010-05-17 10:04:45

2011-02-28 14:08:31

網速變慢局域網網速

2025-01-09 10:20:53

點贊
收藏

51CTO技術棧公眾號

午夜写真片福利电影网| 善良的小姨在线| 成人高潮成人免费观看| 精品亚洲免费视频| 国模gogo一区二区大胆私拍| 国产精品一区二区人妻喷水| 欧美性理论片在线观看片免费| 国产精品国产自产拍高清av王其| av成人在线电影| 手机看片久久久| 伊人色**天天综合婷婷| 亚洲精美色品网站| 黄色免费网址大全| 在线heyzo| 久久久精品一品道一区| 成人性生交大片免费看小说 | 4438全国成人免费| 国产视频精品免费| 色综合www| 7777精品伊人久久久大香线蕉完整版 | 久久亚洲国产精品日日av夜夜| 欧美成人一区二区视频| 一区免费视频| 久久午夜a级毛片| 国产成人精品无码免费看夜聊软件| 精品久久国产一区| 欧美在线你懂的| 日本在线xxx| 亚洲男同gay网站| 亚洲国产精品国自产拍av| 国产在线观看一区| 国产成人精品免费看视频| 日产欧产美韩系列久久99| 国内成人精品视频| 五月天丁香激情| 99热国内精品永久免费观看| 亚洲色图色老头| 国产精品伦子伦| 风间由美性色一区二区三区四区 | 免费在线看v| 成人精品一区二区三区四区 | 看欧美ab黄色大片视频免费 | 色综合久久久网| 成人性免费视频| www欧美xxxx| 一区二区三区在线播放| 成年人黄色在线观看| 91在线播放网站| 国产色一区二区| 奇米影视首页 狠狠色丁香婷婷久久综合| 好吊色一区二区| 国产传媒一区在线| 91传媒免费看| 亚洲黄色片视频| 国产福利一区二区三区视频在线| 成人免费看片视频| 国产乱叫456在线| 国产一区二区在线免费观看| 成人精品一区二区三区| 国产精品久久久久久69| 国产一区二区在线视频| 91精品国产99久久久久久红楼| 国产免费福利视频| 国产麻豆91精品| 91精品国产91久久久久青草| 亚洲美女性生活| 不卡免费追剧大全电视剧网站| 国产精品一区视频网站| 四虎成人免费在线| 国产亚洲综合av| 一区二区不卡视频| а√天堂官网中文在线| 亚洲一区二区av在线| 男女超爽视频免费播放| 自拍网站在线观看| 欧美日韩在线播放| 国产精品探花在线播放| 国产成人tv| 亚洲欧美日韩区| 五月婷婷婷婷婷| 午夜欧美精品| 欧美性视频精品| 瑟瑟视频在线免费观看| 狠狠v欧美v日韩v亚洲ⅴ| 91精品国产高清久久久久久91裸体 | 精品国产三级电影在线观看| 极品白嫩丰满美女无套| 欧美丝袜一区| 久久久久久久久亚洲| 无码人妻丰满熟妇区bbbbxxxx| 轻轻草成人在线| 99高清视频有精品视频| 你懂的在线播放| 亚洲视频免费观看| 男人日女人下面视频| 黄色精品视频网站| 欧美成人r级一区二区三区| 性欧美13一14内谢| 亚州av乱码久久精品蜜桃| 国内精品中文字幕| 中文字幕 日韩有码| 国产精品亚洲第一区在线暖暖韩国 | 国产麻豆精品久久| 久久99精品久久久久久青青91| 精品欧美一区二区三区免费观看| 奇米色777欧美一区二区| av成人午夜| 在线看黄色av| 欧美日韩一二三四五区| 99精品视频国产| 久久不见久久见免费视频7| 久操成人在线视频| 中文字幕在线2019| av亚洲精华国产精华| 日本特级黄色大片| 久久精品女人天堂av免费观看| 日韩免费在线观看| 亚洲精品电影院| 美女精品网站| 国产一区在线免费| 污污视频在线看| 欧美日韩一区不卡| 亚洲最大成人网站| 亚洲小说欧美另类社区| 91香蕉嫩草影院入口| 久久精品国产亚洲a∨麻豆| 亚洲一二三四在线| 午夜xxxxx| 日韩欧美综合| 国产精品人成电影在线观看| 四虎精品在永久在线观看 | 国产精品欧美极品| 干日本少妇首页| ccyy激情综合| 久久999免费视频| 国产乱子伦精品无码码专区| 欧美国产日本视频| 国产又大又黄又粗的视频| 日韩美脚连裤袜丝袜在线| 欧美激情精品久久久久久大尺度| 国产精品色综合| 国产精品久久二区二区| 亚洲老女人av| 精品国产一区二区三区| 日本精品视频在线播放| 三级视频网站在线| 精品美女久久久久久免费| 天堂www中文在线资源| 国内自拍一区| 国产一区二区三区黄| sm在线观看| 亚洲国产欧美自拍| 国产一级18片视频| 久久无码av三级| 男人女人黄一级| 日韩av片子| 91精品中国老女人| 2024最新电影免费在线观看| 日韩亚洲欧美一区| 免费人成在线观看| av中文一区二区三区| 日本一区二区黄色| 国产成人精品免费视| 国产精品久久久久999| h视频在线观看免费| 欧美高清www午色夜在线视频| 成年人二级毛片| 国产91精品露脸国语对白| 成人免费观看cn| 国产欧美高清视频在线| 成人激情视频小说免费下载| xvideos国产在线视频| 精品黑人一区二区三区久久 | 一区二区三区伦理片| 日本在线不卡视频一二三区| 91免费网站视频| 国产精品玖玖玖在线资源| 69av成年福利视频| 成人欧美一区| 日韩欧美一区在线| 91美女免费看| 国产精品久久久久久久岛一牛影视| 天天操精品视频| 宅男噜噜噜66国产日韩在线观看| 欧美一区少妇| 日韩中文一区二区| 日韩av快播网址| 国产视频在线播放| 亚洲福利视频专区| 日韩精选在线观看| 一区二区三区中文在线| 三级网站在线免费观看| 国产精品一二一区| 欧美两根一起进3p做受视频| 欧美日韩免费| 水蜜桃一区二区三区| 爱爱精品视频| 国产精品视频免费在线| 91九色在线看| 在线日韩av观看| 人妻无码中文字幕免费视频蜜桃| 在线观看日韩精品| 日韩精品一区二区三区国语自制| 国产女同互慰高潮91漫画| 色哟哟无码精品一区二区三区| 免费观看日韩电影| 欧美综合在线播放| 欧美阿v一级看视频| 日本一区二区三不卡| 国产成人在线中文字幕| 国产又爽又黄的激情精品视频| 老司机深夜福利在线观看| 久久视频在线播放| 精品无吗乱吗av国产爱色| 精品国产乱码久久久久久久久| 一级全黄裸体免费视频| 一本到一区二区三区| 国产一级做a爰片在线看免费| 中文字幕在线不卡| 蜜桃久久精品成人无码av| 91网址在线看| 久久性爱视频网站| 国产在线播精品第三| www.日本一区| 日韩国产精品久久久| 尤物av无码色av无码| 亚洲福利免费| 国产亚洲黄色片| 欧美一区二区三区久久精品茉莉花| 亚洲高清123| 国产亚洲一区二区三区不卡| 欧美日韩在线不卡一区| 日本成人a网站| 国产欧美日韩在线播放| 伊人久久噜噜噜躁狠狠躁| 91色中文字幕| 国产午夜精品一区在线观看| 成人h视频在线| 91精品视频一区二区| 国产色综合天天综合网| 久久天堂影院| 91色精品视频在线| 国产一区二区在线观| 91久久精品国产91性色| 精品一区二区三区免费看| 成人妇女免费播放久久久| 国产精品高潮久久| 国产精品视频一区国模私拍| 欧美日一区二区三区| 国产精品入口免费视频一| 成人国产精品入口免费视频| 国产精品视频白浆免费视频| 久久精品嫩草影院| 91欧美日韩一区| 视频二区欧美| 国产一区二区三区av在线| 亚洲v天堂v手机在线| 欧美亚洲另类久久综合| 精品不卡一区| 在线观看成人一级片| 久久久久久美女精品 | 大香伊人中文字幕精品| 国内精品久久久久久| 国产99在线观看| 日本不卡免费高清视频| 国产精成人品2018| 亚洲free嫩bbb| 国产伦精品一区二区三区在线播放 | 欧美性淫爽ww久久久久无| 中文字幕日日夜夜| 欧美一区二区视频在线观看| 亚洲精品久久久蜜桃动漫| 日韩福利视频在线观看| 91九色在线porn| 欧美国产精品人人做人人爱| 竹内纱里奈兽皇系列在线观看| 国产精品久久久久久影视| www 久久久| 国产在线资源一区| 日韩av在线播放网址| 妺妺窝人体色www看人体| 亚洲在线电影| 中文字幕在线视频一区二区| aaa亚洲精品| 久久视频一区二区三区| 一区二区三区美女| 波多野结衣黄色网址| 欧美一卡二卡在线| 日韩美女一级视频| 久久伊人色综合| 中老年在线免费视频| 国产在线拍偷自揄拍精品| 精品午夜电影| 久久免费视频2| 免费日韩精品中文字幕视频在线| 午夜xxxxx| 国产三级一区二区| 久久丫精品久久丫| 欧美午夜片在线看| 天堂网在线资源| 不卡av日日日| 外国电影一区二区| 好吊色欧美一区二区三区| 四虎成人精品永久免费av九九| a级免费在线观看| 韩国精品一区二区| 一级黄色片大全| 亚洲亚洲人成综合网络| 亚洲视频一区在线播放| 日韩高清有码在线| 四虎影院观看视频在线观看| 国产精品丝袜高跟| 中文精品一区二区| 青青草视频在线免费播放| 国产精品亚洲一区二区在线观看| 在线电影国产精品| 色哟哟中文字幕| 欧美大秀在线观看| 粉嫩91精品久久久久久久99蜜桃| 欧美lavv| 国产亚洲一级| 亚洲av无码一区东京热久久| 亚洲女同女同女同女同女同69| 国产情侣免费视频| 亚洲欧美日韩网| 欧美aa一级| 国产在线精品一区二区三区| 欧美激情无毛| 欧美性猛交乱大交| 亚洲激情中文1区| 国产精品爽爽久久| 日韩中文理论片| 成人精品动漫| 亚洲午夜精品久久| 视频一区二区三区中文字幕| 毛茸茸多毛bbb毛多视频| 性感美女久久精品| 欧美 日韩 国产 在线| 欧美极品少妇xxxxⅹ免费视频| 亚洲欧美日本国产| wwwwww欧美| 国产精品1024| 久久无码精品丰满人妻| 精品福利在线导航| xxxx成人| 久草精品电影| 老牛国产精品一区的观看方式| 少妇大叫太粗太大爽一区二区| 日韩欧美在线一区| 国产大片在线免费观看 | 四虎在线精品| 中文字幕一区二区三区乱码| 精品一区二区影视| 国产十六处破外女视频| 日韩一区二区电影在线| 韩国成人免费视频| 精品在线视频一区二区| 免费在线亚洲欧美| 精品人妻无码一区| 91精品中文字幕一区二区三区| h片在线免费观看| av观看久久| 国产一区二区精品| 欧美老女人性生活视频| 欧美日韩不卡一区二区| 色在线视频网| 久久久久久久有限公司| 日韩国产欧美在线视频| 日韩亚洲欧美中文字幕| 欧美一级生活片| 欧美三级网站| 亚洲国产一区二区三区在线播| 久久91精品国产91久久小草| 久久精品国产av一区二区三区| 国产视频精品xxxx| 亚洲综合伊人| 日韩中文字幕三区| 国产精品久久久久婷婷二区次| 国产成a人亚洲精v品无码| 97色在线视频| 五月综合激情| 999精品免费视频| 欧美这里有精品| 国精一区二区三区| 日本在线视频不卡| 国产精品夜夜爽| 久操视频在线免费观看| 久久综合伊人77777| 九九视频精品全部免费播放| 6080国产精品| 欧美性69xxxx肥| √天堂8在线网| 青青影院一区二区三区四区| 国产成人免费高清| 中文字幕人成人乱码亚洲电影| 欧美国产精品人人做人人爱| 日韩电影免费网站| 色哟哟无码精品一区二区三区| 欧美欧美欧美欧美| 亚洲十八**毛片|