精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国外成人免费视频| 久久精品国亚洲| 密臀av一区二区三区| 137大胆人体在线观看| 国产在线国偷精品产拍免费yy| 欧美成人黄色小视频| 色天使在线视频| 国产亚洲高清一区| 色欧美日韩亚洲| 黄色一级视频播放| 牛牛影视精品影视| 国产激情一区二区三区四区| 青青精品视频播放| 91成人福利视频| 黄色录像二级片| 免费网站成人| 99re亚洲国产精品| 91九色单男在线观看| 日日摸天天添天天添破| 亚洲天堂免费| 国产亚洲精品久久久久久| 亚洲av无码久久精品色欲| 超碰一区二区| 亚洲h精品动漫在线观看| 黄频视频在线观看| 免费一级毛片在线观看| 国产.欧美.日韩| 成人网在线观看| 精品视频一二三区| 国产精品久久久免费 | 国产美女主播一区| 在线观看 中文字幕| 综合激情视频| 精品国产一区二区在线| 亚洲黄色在线网站| 国产香蕉精品| 精品久久五月天| 91香蕉视频免费看| 99久久久国产精品免费调教网站| 精品高清美女精品国产区| 国产尤物av一区二区三区| 日本视频在线观看| 国产精品系列在线| 日韩免费av一区二区三区| 巨骚激情综合| 久久免费视频色| 久热国产精品视频一区二区三区| 秋霞网一区二区| 丁香一区二区三区| 国产精品二区在线观看| 亚洲欧美高清视频| 粉嫩欧美一区二区三区高清影视| 91黄在线观看| www.热久久| 国产精品一二三四区| 亚洲最大福利视频网站| 91香蕉视频污版| 久久久夜色精品| 综合久久精品| 欧美日韩国产va另类| 欧美成人免费观看视频| 国产综合色产| 国产69精品99久久久久久宅男| 久久久久久久久99| 亚洲精品四区| 欧美性视频精品| 无码人妻精品一区二区三区9厂| 久久久久99| 国产精品国产福利国产秒拍| 中文字幕在线观看1| 久久精品国产**网站演员| 成人激情视频在线| 亚洲精品国产一区二| 成人av电影在线网| 欧美日韩一区二区三| 成人18在线| 亚洲色图制服诱惑| 无码熟妇人妻av在线电影| 性爽视频在线| 欧美图区在线视频| 国产精品二区视频| 欧洲亚洲成人| 最新的欧美黄色| 福利所第一导航| 亚洲欧美日本日韩| 国产精品入口夜色视频大尺度| 97人人爽人人爽人人爽| 白白色 亚洲乱淫| 日韩av图片| 日本片在线观看| 在线观看国产一区二区| 国产精品探花在线播放| 牛牛精品成人免费视频| 自拍偷拍亚洲精品| 福利一区二区三区四区| 免费成人在线观看| 国产成人av一区二区三区| 麻豆影视在线| 亚洲一区二区综合| 亚洲xxxx2d动漫1| 福利在线一区| www.日韩欧美| 4438国产精品一区二区| 成人一区二区不卡免费| 国产一区二区你懂的| 国产精品免费久久久久久| 亚洲国产精品18久久久久久| 国产亚洲视频系列| 亚洲 欧美 综合 另类 中字| 日韩另类视频| 欧美久久久久久久久久| 中文字幕国产专区| 欧美日韩第一区| 国产免费成人av| 久久天堂电影| 亚洲成人在线网站| 天美一区二区三区| 欧美一区电影| 51色欧美片视频在线观看| 国产女18毛片多18精品| 久久久久久久国产精品影院| www.夜夜爱| 91国产精品| 中文字幕精品一区久久久久| 偷偷操不一样的久久| 国产69精品一区二区亚洲孕妇| 亚洲精品国产一区| 成人性生交大片免费网站 | 欧美综合在线观看| 亚洲精品国产手机| 亚洲精品伦理在线| 午夜免费一级片| 色综合天天爱| 国产精品网红福利| 国产一级免费在线观看| 狠狠综合久久av一区二区小说| 四虎国产精品免费| 亚洲一区欧美| 亚洲综合在线播放| 国产在线一区二区视频| 8x8x8国产精品| 国产精品久久久免费看| 美女www一区二区| 五月天色一区| 四虎视频在线精品免费网址| 色偷偷噜噜噜亚洲男人的天堂| 日本中文字幕久久| 久久精品一区四区| 91n.com在线观看| 久久国产影院| 96pao国产成视频永久免费| 中文人妻一区二区三区| 亚洲欧美成人影院| 91麻豆精品国产91久久久使用方法 | 国内精品免费| 欧美日本啪啪无遮挡网站| 99热这里只有精品在线观看| 亚洲日本va在线观看| av噜噜在线观看| 午夜日韩视频| 国产区欧美区日韩区| 日韩深夜视频| 国产亚洲欧美日韩精品| 亚洲一级片免费看| 久久精品网站免费观看| 天天操天天摸天天爽| 水蜜桃久久夜色精品一区| 成人午夜一级二级三级| bt在线麻豆视频| 亚洲第一福利视频| 久久久久在线视频| 国产精品伦一区| 香蕉视频在线观看黄| 欧美日本亚洲韩国国产| 精品一区日韩成人| 777午夜精品电影免费看| 色偷偷av亚洲男人的天堂| 国产黄色一区二区| 精品久久久久久久久久国产| 俄罗斯毛片基地| 国产成人自拍网| 男女av免费观看| 久久久9色精品国产一区二区三区| 91成人在线看| 欧美一区国产| 欧美人交a欧美精品| 丝袜+亚洲+另类+欧美+变态| 欧美日韩免费观看一区二区三区| 顶臀精品视频www| 26uuu欧美| 天堂av手机在线| 亚洲综合国产| 青草全福视在线| 亚洲aaa级| 亚洲自拍小视频免费观看| 性欧美freesex顶级少妇| 久久香蕉国产线看观看av| 手机亚洲第一页| 欧美一级欧美三级| 在线观看日本网站| 亚洲一区在线观看免费观看电影高清| 亚洲一区二区三区加勒比| 久久亚洲天堂网| 中文在线资源观看网站视频免费不卡 | 亚洲在线观看网站| 亚洲黄页一区| 伊人久久大香线蕉av一区| 久久男人av| 亚洲尤物视频网| 欧美日韩尤物久久| 97在线观看免费高清| 免费av网站在线观看| 亚洲欧美日韩一区二区在线| 朝桐光av在线一区二区三区| 欧美三级日韩在线| 午夜婷婷在线观看| 亚洲国产aⅴ成人精品无吗| 中文乱码字幕高清一区二区| 91蜜桃视频在线| 亚洲av成人精品一区二区三区| 九色porny丨国产精品| 老熟妇仑乱视频一区二区| 99热免费精品| 国产精品久久久久9999爆乳| 亚洲国产一成人久久精品| 亚洲成人第一| 九九在线精品| 久久精品magnetxturnbtih| 91麻豆精品国产91久久久久推荐资源| 国产综合久久久久| 福利精品在线| 国产精品网站入口| 狠狠久久综合| 国产精品三级久久久久久电影| 国产大学生av| 国产欧美一区二区精品久久久| 国产美女精品在线观看| 日韩免费一级| 97久久夜色精品国产九色| 国产精品国产三级在线观看| 国产日韩av高清| 激情欧美一区二区三区黑长吊| 国产成人精品电影| 欧美极品免费| 国产精品久久久久久中文字| 久久久人成影片一区二区三区在哪下载 | 九一精品久久久| 日韩电影一区二区三区| 免费激情视频在线观看| 日韩精品视频网| 亚洲最大综合网| 久久草av在线| gogogo高清免费观看在线视频| 全部av―极品视觉盛宴亚洲| 男操女免费网站| 久久99国产乱子伦精品免费| 中文字幕日韩综合| 国产一区二区精品在线观看| 成人一区二区三区仙踪林| 成人自拍视频在线| 国精产品一区一区三区免费视频 | 手机av在线看| 一区二区三区中文在线| 劲爆欧美第一页| 精品福利樱桃av导航| 黄色av网站免费观看| 欧美日韩一卡二卡三卡| 国产精品一区二区人人爽| 日韩欧美亚洲国产精品字幕久久久 | 欧美日韩性视频| 日本天堂网在线观看| 色综合久久久久综合体| 中文字幕一二区| 日韩午夜激情免费电影| 天天av综合网| 色系列之999| 麻豆av在线播放| 欧美做受高潮1| 欧美系列精品| 成人18视频| 国产精品一区二区99| 大桥未久一区二区三区| 亚洲尤物在线| 97人人爽人人| 91一区二区在线观看| 国产亚洲精品精品精品| 亚洲欧美日韩一区二区| 久久免费激情视频| 欧美丰满美乳xxx高潮www| 色婷婷综合视频| 国产小视频国产精品| 宅男在线观看免费高清网站| 91av在线不卡| 二区三区精品| 久久久婷婷一区二区三区不卡| 欧美r级电影| 国产二区视频在线播放| 国模大尺度一区二区三区| 成人h动漫精品一区| 亚洲人123区| 久久久久久久久久久影院| 欧美一级理论性理论a| 黄色av网站在线免费观看| 欧美高清自拍一区| 久久人体av| 欧美日本亚洲| 欧美网站在线| 国产精品区在线| 久久久久久久网| 激情五月色婷婷| 日韩一区二区免费电影| www.成人.com| 欧洲成人在线视频| 国产一区二区三区亚洲| 国产日韩欧美大片| 蜜臀av性久久久久蜜臀av麻豆| 亚洲调教欧美在线| 亚洲五码中文字幕| 99久久99久久久精品棕色圆| 国产一区二区三区在线| 黄色视屏在线免费观看| 高清视频一区| 欧美日韩亚洲一区二区三区在线| 国产一级做a爰片久久| 久久精品人人做人人爽97| 国产性xxxx高清| 亚洲国产成人精品女人久久久| 国产人成网在线播放va免费| 国产成人综合av| 小嫩嫩12欧美| 丰满爆乳一区二区三区| 成熟亚洲日本毛茸茸凸凹| 欧美精品色哟哟| 日韩欧美色综合网站| 久热国产在线| 成人激情视频在线播放| 青青草成人影院| 男女视频在线看| 国产精品美女久久久久aⅴ| 国产精品传媒在线观看| 在线成人免费网站| 欧美色片在线观看| 丝袜美腿玉足3d专区一区| 日日夜夜一区二区| 国产精品情侣呻吟对白视频| 在线精品亚洲一区二区不卡| 国产在线观看免费| 国产精品va在线| 日韩在线看片| 五月天婷婷在线观看视频| 亚洲欧洲性图库| 99在线观看免费| 欧美成人激情在线| 国产成人精品亚洲线观看| av在线播放天堂| 97精品视频在线观看自产线路二| 国产精品久久久久久99| 亚洲欧美在线看| 福利视频一区| 四虎精品欧美一区二区免费| 成人网在线免费视频| 日韩乱码人妻无码中文字幕| 日韩成人中文字幕| 日韩精品三区| 中文精品一区二区三区 | 91理论片午午论夜理片久久| 亚洲国产日韩欧美在线| 在线观看免费视频国产| 大伊人狠狠躁夜夜躁av一区| 国产尤物视频在线| 国产中文日韩欧美| 亚洲二区免费| gv天堂gv无码男同在线观看| 欧美美女一区二区| 91老司机福利在线| 日本一区二区三区在线视频 | 成人免费观看a| 亚洲黄色天堂| 国产成人免费观看网站| 91精品国产综合久久久久久| av中文字幕在线看| 天堂资源在线亚洲视频| 高清在线成人网| 国产午夜性春猛交ⅹxxx| 中文字幕免费精品一区高清| 日本少妇精品亚洲第一区| 国产精品沙发午睡系列| 亚洲欧洲成人精品av97| 人妻91麻豆一区二区三区| 国产精品xxx视频| 国产一区视频在线观看免费| 国产精品毛片一区二区| 欧美一区二区视频在线观看 | 成人黄色免费网站在线观看| 亚洲毛片av| 亚洲综合久久av一区二区三区| 亚洲精品98久久久久久中文字幕| 国产麻豆一区| 国内外成人激情视频| 亚洲精品国产一区二区三区四区在线 |