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

真實案例 | 如何處理 MQ 消費失敗的消息?

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

01、背景介紹

再次回顧一下當時提過的問題,為何項目中要引用 MQ 消息中間件?

我們知道,在電商平臺中常見的用戶下單,會經歷以下幾個流程。

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

圖片圖片

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

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

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

圖片圖片

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

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

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

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

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

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

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

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

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

02、解決方案

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

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

圖片圖片

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

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

03、代碼實踐

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

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

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class MessageRetryDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 原始消息body
     */
    private String bodyMsg;

    /**
     * 消息來源ID
     */
    private String sourceId;

    /**
     * 消息來源描述
     */
    private String sourceDesc;

    /**
     * 交換器
     */
    private String exchangeName;

    /**
     * 路由鍵
     */
    private String routingKey;

    /**
     * 隊列
     */
    private String queueName;

    /**
     * 狀態,1:初始化,2:成功,3:失敗
     */
    private Integer status = 1;

    /**
     * 最大重試次數
     */
    private Integer maxTryCount = 3;

    /**
     * 當前重試次數
     */
    private Integer currentRetryCount = 0;

    /**
     * 重試時間間隔(毫秒)
     */
    private Long retryIntervalTime = 0L;

    /**
     * 任務失敗信息
     */
    private String errorMsg;

    /**
     * 創建時間
     */
    private Date createTime;

    @Override
    public String toString() {
        return "MessageRetryDTO{" +
                "bodyMsg='" + bodyMsg + '\'' +
                ", sourceId='" + sourceId + '\'' +
                ", sourceDesc='" + sourceDesc + '\'' +
                ", exchangeName='" + exchangeName + '\'' +
                ", routingKey='" + routingKey + '\'' +
                ", queueName='" + queueName + '\'' +
                ", status=" + status +
                ", maxTryCount=" + maxTryCount +
                ", currentRetryCount=" + currentRetryCount +
                ", retryIntervalTime=" + retryIntervalTime +
                ", errorMsg='" + errorMsg + '\'' +
                ", createTime=" + createTime +
                '}';
    }

    /**
     * 檢查重試次數是否超過最大值
     *
     * @return
     */
    public boolean checkRetryCount() {
        retryCountCalculate();
        //檢查重試次數是否超過最大值
        if (this.currentRetryCount < this.maxTryCount) {
            return true;
        }
        return false;
    }

    /**
     * 重新計算重試次數
     */
    private void retryCountCalculate() {
        this.currentRetryCount = this.currentRetryCount + 1;
    }

}

3.2、編寫服務重試抽象類

public abstract class CommonMessageRetryService {

    private static final Logger log = LoggerFactory.getLogger(CommonMessageRetryService.class);

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private MongoTemplate mongoTemplate;


    /**
     * 初始化消息
     *
     * @param message
     */
    public void initMessage(Message message) {
        log.info("{} 收到消息: {},業務數據:{}", this.getClass().getName(), message.toString(), new String(message.getBody()));
        try {
            //封裝消息
            MessageRetryDTO messageRetryDto = buildMessageRetryInfo(message);
            if (log.isInfoEnabled()) {
                log.info("反序列化消息:{}", messageRetryDto.toString());
            }
            prepareAction(messageRetryDto);
        } catch (Exception e) {
            log.warn("處理消息異常,錯誤信息:", e);
        }
    }

    /**
     * 準備執行
     *
     * @param retryDto
     */
    protected void prepareAction(MessageRetryDTO retryDto) {
        try {
            execute(retryDto);
            doSuccessCallBack(retryDto);
        } catch (Exception e) {
            log.error("當前任務執行異常,業務數據:" + retryDto.toString(), e);
            //執行失敗,計算是否還需要繼續重試
            if (retryDto.checkRetryCount()) {
                if (log.isInfoEnabled()) {
                    log.info("重試消息:{}", retryDto.toString());
                }
                retrySend(retryDto);
            } else {
                if (log.isWarnEnabled()) {
                    log.warn("當前任務重試次數已經到達最大次數,業務數據:" + retryDto.toString(), e);
                }
                doFailCallBack(retryDto.setErrorMsg(e.getMessage()));
            }
        }
    }

    /**
     * 任務執行成功,回調服務(根據需要進行重寫)
     *
     * @param messageRetryDto
     */
    private void doSuccessCallBack(MessageRetryDTO messageRetryDto) {
        try {
            successCallback(messageRetryDto);
        } catch (Exception e) {
            log.warn("執行成功回調異常,隊列描述:{},錯誤原因:{}", messageRetryDto.getSourceDesc(), e.getMessage());
        }
    }

    /**
     * 任務執行失敗,回調服務(根據需要進行重寫)
     *
     * @param messageRetryDto
     */
    private void doFailCallBack(MessageRetryDTO messageRetryDto) {
        try {
            saveMessageRetryInfo(messageRetryDto.setErrorMsg(messageRetryDto.getErrorMsg()));
            failCallback(messageRetryDto);
        } catch (Exception e) {
            log.warn("執行失敗回調異常,隊列描述:{},錯誤原因:{}", messageRetryDto.getSourceDesc(), e.getMessage());
        }
    }

    /**
     * 執行任務
     *
     * @param messageRetryDto
     */
    protected abstract void execute(MessageRetryDTO messageRetryDto);

    /**
     * 成功回調
     *
     * @param messageRetryDto
     */
    protected abstract void successCallback(MessageRetryDTO messageRetryDto);

    /**
     * 失敗回調
     *
     * @param messageRetryDto
     */
    protected abstract void failCallback(MessageRetryDTO messageRetryDto);

    /**
     * 構建消息補償實體
     * @param message
     * @return
     */
    private MessageRetryDTO buildMessageRetryInfo(Message message){
        //如果頭部包含補償消息實體,直接返回
        Map<String, Object> messageHeaders = message.getMessageProperties().getHeaders();
        if(messageHeaders.containsKey("message_retry_info")){
            Object retryMsg = messageHeaders.get("message_retry_info");
            if(Objects.nonNull(retryMsg)){
                return JSONObject.parseObject(String.valueOf(retryMsg), MessageRetryDTO.class);
            }
        }
        //自動將業務消息加入補償實體
        MessageRetryDTO messageRetryDto = new MessageRetryDTO();
        messageRetryDto.setBodyMsg(new String(message.getBody(), StandardCharsets.UTF_8));
        messageRetryDto.setExchangeName(message.getMessageProperties().getReceivedExchange());
        messageRetryDto.setRoutingKey(message.getMessageProperties().getReceivedRoutingKey());
        messageRetryDto.setQueueName(message.getMessageProperties().getConsumerQueue());
        messageRetryDto.setCreateTime(new Date());
        return messageRetryDto;
    }

    /**
     * 異常消息重新入庫
     * @param retryDto
     */
    private void retrySend(MessageRetryDTO retryDto){
        //將補償消息實體放入頭部,原始消息內容保持不變
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
        messageProperties.setHeader("message_retry_info", JSONObject.toJSON(retryDto));
        Message message = new Message(retryDto.getBodyMsg().getBytes(), messageProperties);
        rabbitTemplate.convertAndSend(retryDto.getExchangeName(), retryDto.getRoutingKey(), message);
    }



    /**
     * 將異常消息存儲到mongodb中
     * @param retryDto
     */
    private void saveMessageRetryInfo(MessageRetryDTO retryDto){
        try {
            mongoTemplate.save(retryDto, "message_retry_info");
        } catch (Exception e){
            log.error("將異常消息存儲到mongodb失敗,消息數據:" + retryDto.toString(), e);
        }
    }
}

3.3、編寫監聽服務類

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

@Component
public class OrderServiceListener extends CommonMessageRetryService {

    private static final Logger log = LoggerFactory.getLogger(OrderServiceListener.class);

    /**
     * 監聽訂單系統下單成功消息
     * @param message
     */
    @RabbitListener(queues = "mq.order.add")
    public void consume(Message message) {
        log.info("收到訂單下單成功消息: {}", message.toString());
        super.initMessage(message);
    }


    @Override
    protected void execute(MessageRetryDTO messageRetryDto) {
        //調用扣減庫存服務,將業務異常拋出來
    }

    @Override
    protected void successCallback(MessageRetryDTO messageRetryDto) {
        //業務處理成功,回調
    }

    @Override
    protected void failCallback(MessageRetryDTO messageRetryDto) {
        //業務處理失敗,回調
    }
}

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

04、小結

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

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

本文主要圍繞消息消費失敗這種場景,進行基礎的方案和代碼實踐講解,如果有描述不對的地方,歡迎大家留言指出!

05、參考

1、https://blog.csdn.net/qq_42046105/article/details/114156904

責任編輯:武曉燕 來源: 潘志的研發筆記
相關推薦

2021-03-01 07:31:53

消息支付高可用

2025-11-20 08:49:23

2012-07-03 11:18:20

運維disable tab

2016-07-04 14:22:47

DevOps案例軟件

2025-07-21 09:02:45

2018-12-25 09:44:42

2025-01-10 08:20:00

MQ消息架構

2021-09-30 07:26:15

MQ消息丟失

2023-07-26 08:21:33

2024-06-18 14:08:22

2019-08-15 10:20:19

云計算技術安全

2021-03-24 10:40:26

Python垃圾語言

2025-11-11 09:05:09

2020-10-18 07:25:55

MQ消息冪等架構

2024-11-13 00:59:13

2021-03-08 10:19:59

MQ消息磁盤

2012-12-12 09:49:41

2020-12-29 09:11:33

LinuxLinux內核

2017-03-13 13:21:34

Git處理大倉庫

2011-12-15 12:32:19

JavaNIO
點贊
收藏

51CTO技術棧公眾號

一级黄色小视频| 69久久精品无码一区二区| 四虎精品成人影院观看地址| 久久激情网站| 久久精品亚洲精品| 久久性爱视频网站| 国产极品久久久久久久久波多结野| 国产精品久久午夜夜伦鲁鲁| 国产福利一区二区三区在线观看| 99久久久久久久久| 亚洲国产成人精品女人| 亚洲精品电影在线| 中文字幕在线综合| 国产激情视频在线看| 欧美国产乱子伦| 国产精品久久国产精品| 羞羞色院91蜜桃| 亚洲黄色大片| 久久精品99无色码中文字幕 | 国产一区二区三区香蕉| 欧美一区二区三区艳史| 亚洲成人生活片| 国产一区毛片| 亚洲级视频在线观看免费1级| 伊人成人222| 国产伦精品一区二区三区视频金莲 | 国产精品色悠悠| 日本三级黄色大片| 亚洲精品在线观看91| 亚洲热线99精品视频| 欧美群妇大交群中文字幕| 成人免费看黄网站| 丁香社区五月天| 激情一区二区| 欧美另类高清videos| 国产亚洲精品精品精品| 亚洲性视频大全| 亚洲激情在线观看| 国产一精品一aⅴ一免费| 婷婷久久综合九色综合99蜜桃| 欧美日韩中国免费专区在线看| 丰满人妻一区二区三区53号| 137大胆人体在线观看| 26uuu精品一区二区| 国产精品免费视频一区二区| 亚洲av无码专区在线| 精品一区二区在线播放| 国产一区二区在线免费| 中文字幕视频二区| 奇米一区二区三区| 国产精品免费一区| 亚洲永久精品一区| 日韩**一区毛片| 国产成人精品久久二区二区91| 韩国av中文字幕| 亚洲少妇一区| 欧美一性一乱一交一视频| 国产成人精品片| 丰满少妇被猛烈进入| 色135综合网| 在线观看日韩欧美| 成人黄色a级片| 欧美日韩在线网站| 日韩视频在线免费观看| 国产喷水在线观看| 中文字幕免费一区二区| 欧美大片网站在线观看 | 亚洲精品国久久99热| 天堂av免费看| 黄页网站大全在线免费观看| 亚洲综合丝袜美腿| av在线com| а√天堂8资源在线| 午夜精品国产更新| 国产偷人视频免费| 99久久综合国产精品二区| 欧美日韩一区精品| 亚洲三级在线视频| 欧美久久香蕉| 一区二区三区www| 久艹在线观看视频| 欧美女优在线观看| 9色精品在线| 欧美又大又粗又长| 最近日韩免费视频| 国产精品资源在线观看| 国产午夜精品在线| 黄色av免费在线观看| 国产精品护士白丝一区av| 青青草综合视频| 男人久久天堂| 欧美日韩国产大片| 人妻av一区二区| 精品久久精品| 欧美日韩成人在线观看| 久久久国产精品成人免费| 日韩avvvv在线播放| 91在线短视频| 韩国三级在线观看久| 亚洲欧美在线观看| 老太脱裤子让老头玩xxxxx| 日本精品另类| 亚洲精品一区二区三区四区高清| av网站免费在线看| 激情婷婷久久| 成人免费在线网址| 青青草在线免费观看| 亚洲婷婷国产精品电影人久久| 国产91视频一区| 亚洲伦乱视频| 欧美成人性福生活免费看| 精品无码人妻一区| 欧美日韩福利| 国产精品一区二区三区久久久| 日韩永久免费视频| 亚洲桃色在线一区| 免费在线观看的毛片| 师生出轨h灌满了1v1| 国产成人免费精品| 亚洲精品国精品久久99热一| 国产又粗又硬又长又爽| 日韩精品一卡二卡三卡四卡无卡| 成人毛片网站| 日本中文字幕电影在线免费观看 | 日韩国产高清污视频在线观看 | 午夜欧美大尺度福利影院在线看| 天天操天天爱天天爽| 狼人天天伊人久久| 欧美成人免费在线观看| 中文字幕精品在线观看| 91免费国产视频网站| 91精品国产毛片武则天| 日韩成人免费av| 中文字幕日韩免费视频| 国产真人无遮挡作爱免费视频| 99久久精品久久久久久清纯| 成人毛片100部免费看| 亚洲青青一区| 色婷婷综合成人av| 日韩av免费播放| 国产午夜一区二区三区| 六月丁香激情网| 高清欧美性猛交xxxx黑人猛| 欧美久久久精品| 国产在成人精品线拍偷自揄拍| 欧美国产一区视频在线观看| jizzjizz国产精品喷水| 国产精品18hdxxxⅹ在线| 九九久久精品一区| av网站在线免费看| 亚洲欧美国产高清| 污污视频在线免费| 综合一区av| 99精品国产高清在线观看| 国产精品久久麻豆| 日韩欧美国产三级电影视频| 99久久婷婷国产综合| 国产高清在线观看免费不卡| 国产一区 在线播放| 成人搞黄视频| 91精品国产99| 久久久久久久久亚洲精品| 色偷偷久久人人79超碰人人澡| 蜜臀久久99精品久久久久久| **国产精品| 蜜桃av一区二区| 久中文字幕一区| 欧美成人a交片免费看| 中文字幕国产亚洲| 国产免费叼嘿网站免费| 亚洲精品免费在线观看| 黑人巨大猛交丰满少妇| 99国产一区| 欧美二区在线| 9999在线精品视频| 午夜精品视频在线| porn视频在线观看| 3d动漫精品啪啪1区2区免费| 久久久久久久久97| 久久久久久久综合日本| 97超碰成人在线| 国产精品分类| 欧美欧美一区二区| 91精品福利观看| 隔壁老王国产在线精品| 蜜桃免费在线| 日韩美女主播在线视频一区二区三区| 一级aaa毛片| 中文字幕av一区二区三区| 性生活一级大片| 免费视频一区| 在线观看三级网站| 色棕色天天综合网| 国产成人精品日本亚洲11| 欧美va在线观看| 色综合久久88| www亚洲人| 亚洲精品99999| 国产一区二区麻豆| 色综合久久久久网| 久久久全国免费视频| 亚洲国产成人午夜在线一区| 精品人妻一区二区免费| 日本免费在线视频不卡一不卡二| 日本福利视频网站| 成人3d动漫在线观看| 国产欧美日韩一区| 四虎国产精品成人免费影视| 欧美一性一乱一交一视频| 操你啦视频在线| 国产亚洲综合久久| 天天干天天色天天| 欧美一区三区二区| 国产免费a视频| 欧美日韩国产专区| 九九视频免费在线观看| 国产精品黄色在线观看| 一色道久久88加勒比一| 成人精品国产一区二区4080| 成年人三级黄色片| 99久久99久久精品国产| 国产精品一区三区| 网站一区二区三区| 午夜亚洲性色福利视频| 青春草国产视频| 无码一区二区三区视频| 色噜噜一区二区| 日韩大胆成人| 国产精品av一区| 精品久久国产一区| 国产一区二区丝袜高跟鞋图片| sese综合| 57pao国产精品一区| 不卡av免费观看| 欧美丰满少妇xxxxx| 老司机午夜在线| 国产一区二区欧美日韩| 蜜桃视频在线观看视频| 日韩精品一区二区视频| 好吊色视频一区二区| 日韩一区二区三区电影| 国产91视频在线| 欧美日韩国产欧美日美国产精品| 欧美性受xxx黑人xyx性爽| 色综合久久久久久久久| 久久精品视频5| 欧美视频在线视频| 一本一道无码中文字幕精品热| 狠狠躁夜夜躁人人躁婷婷91 | 欧美视频国产精品| 日韩不卡在线播放| 日韩欧美国产网站| 久久99国产综合精品免费| 欧美性色视频在线| 国产视频1区2区| 在线精品视频一区二区三四 | 国产嫩草在线视频| 欧美激情视频一区| 678在线观看视频| 午夜精品www| 在线天堂资源| 国产成人亚洲综合91| 久久天天久久| 成人综合网网址| 日韩免费一级| 精品日本一区二区三区在线观看| 偷拍亚洲精品| 日韩国产精品一区二区| 久久免费大视频| 日本精品福利视频| 一本久道久久久| 男人插女人下面免费视频| 极品少妇一区二区三区精品视频 | 日韩黄色片视频| 老鸭窝91久久精品色噜噜导演| 精品www久久久久奶水| 蜜桃久久精品一区二区| 亚洲国产综合av| 91视频一区二区| jizzjizz日本少妇| 亚洲永久精品国产| 日韩美一区二区| 91精品午夜视频| 少妇无码一区二区三区| 一个人www欧美| 在线中文字幕视频观看| 2021久久精品国产99国产精品| 成人看片网站| 99在线视频免费观看| 五月综合久久| 五月天综合婷婷| 亚洲在线观看| 三日本三级少妇三级99| 91丨九色丨蝌蚪丨老版| 欧美风情第一页| 亚洲最色的网站| 国产精品成人无码| 亚洲成人a级网| 婷婷成人激情| 欧美一级大片视频| 深夜激情久久| 日韩动漫在线观看| 1000部精品久久久久久久久| 免费看黄色一级大片| 播五月开心婷婷综合| 97精品在线播放| 日韩欧美成人免费视频| jlzzjlzz亚洲女人18| 一区二区欧美激情| 阿v视频在线| 91精品综合视频| 欧美日韩播放| 又粗又黑又大的吊av| 国产一区中文字幕| 精品亚洲aⅴ无码一区二区三区| 亚洲一区二区三区视频在线播放| 亚洲一区二区影视| 亚洲欧美日韩直播| www.综合| 国产精品一区二区免费| 成人激情诱惑| 乱子伦视频在线看| 成人黄色777网| 国内偷拍精品视频| 91精品国产综合久久久久久漫画| 国产三级电影在线| 91sa在线看| 久久精品亚洲成在人线av网址| 久久视频免费在线| 国产一区二区在线影院| 日本美女黄色一级片| 欧美午夜理伦三级在线观看| 青春草在线观看| 91国产在线精品| 精品av导航| 欧美精品久久久久久久久久久| 国产精品一级片| 欧美国产精品一二三| 女海盗2成人h版中文字幕| 国产精品欧美一区二区三区奶水| 伊甸园亚洲一区| 动漫av网站免费观看| thepron国产精品| 国产精品2020| 亚洲福利视频网| caoporn视频在线| 国产精品一国产精品最新章节| 国内自拍一区| 无码人妻一区二区三区在线| 亚洲一区国产视频| 免费观看a视频| 国内伊人久久久久久网站视频| 免费看久久久| 国模吧无码一区二区三区| 久久影院电视剧免费观看| 日韩欧美在线观看免费| 亚洲欧美综合图区| 日韩中文视频| 在线观看日本一区| 国产在线播放一区三区四| 一区视频免费观看| 精品va天堂亚洲国产| 麻豆理论在线观看| 日本高清一区| 久久成人麻豆午夜电影| 成熟的女同志hd| 亚洲国产成人一区| 韩国主播福利视频一区二区三区| 日本一区二区精品| 国内精品久久久久影院薰衣草| 清纯粉嫩极品夜夜嗨av| 亚洲成人1234| 三上悠亚激情av一区二区三区 | 欧美男男同志| 国产欧美va欧美va香蕉在线| 中文字幕一区二区三区久久网站| 亚洲国产精品第一页| 欧美性猛交xxxx免费看久久久| 9191在线观看| 97超级碰碰| 男人的天堂亚洲| 久草手机视频在线观看| 精品日韩99亚洲| 免费欧美电影| 日本一道在线观看| 91麻豆国产香蕉久久精品| 一区二区三区播放| 亚州精品天堂中文字幕| 欧美中文字幕一区二区| 国产吃瓜黑料一区二区| 色婷婷久久综合| а√天堂资源地址在线下载| 国产区二精品视| 久久精品国产亚洲一区二区三区| 久久久久久久久99| 最新91在线视频| 狼人天天伊人久久| 黄色片免费网址| 色88888久久久久久影院野外| 18av在线播放|