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

基于 RocketMQ 的可靠事件處理策略

開發 架構
事務消息是RocketMQ提供的一種高級消息類型,支持在分布式場景下消息生產和本地事務的最終一致性。我們可以分別從生產者和消費者維度出發來分析可靠事件實現上的需求。

Seata 框架本身并沒有內置針對可靠事件模式的解決方案,但我們可以使用另一款已經介紹過的框架來實現這一目標,就是 RocketMQ。

RocketMQ 為開發人員提供了事務消息這一消息類型,專門用來應對分布式環境下的數據一致性問題。

事務消息的基本概念

事務消息是RocketMQ提供的一種高級消息類型,支持在分布式場景下消息生產和本地事務的最終一致性。我們可以分別從生產者和消費者維度出發來分析可靠事件實現上的需求。

  • 消息發送方:對于消息發送方而言,我們需要解決執行本地事務與發送消息的原子性問題,即保證本地事務執行成功,消息一定發送成功。
  • 消息接收方:對于消息接收方而言,我們需要解決接收消息與本地事務的原子性問題,即保證接收消息成功后,本地事務也一定執行成功。

事務消息的出現完美解決了可靠事件模式執行過程中可能出現的問題。事務消息提供了類似X/Open XA的分布事務功能,通過事務消息能達到分布式事務的最終一致性。

那么,RocketMQ 是如何做到這一點的呢?關鍵就在于它所提供的半消息機制。

所謂半消息(Half Message),是指暫不能投遞的消息。發送方已經將消息成功發送到了服務端,但是服務端未收到生產者對該消息的二次確認,此時該消息被標記成暫不能投遞狀態,處于該種狀態下的消息就是半消息。

介紹完半消息的概念,我們再來明確什么是半消息回查。

我們知道由于網絡閃斷、生產者應用重啟等原因,可能會導致某條事務消息的二次確認丟失。RocketMQ 服務端通過掃描發現某條消息長期處于半消息狀態時,就會主動向消息生產者詢問該消息的最終狀態(Commit 或 Rollback),這一過程就是半消息回查。圖 1 展示了 RocketMQ 中事務消息的整體架構。

圖1 RocketMQ 事務消息架構圖1 RocketMQ 事務消息架構

進一步,我們梳理 RocketMQ 事務消息的執行過程,如圖2所示。

圖2 RocketMQ 事務消息執行過程圖2 RocketMQ 事務消息執行過程

可以看到,圖 2 存在服務A和服務B這兩個微服務。其中服務 A 是消息發布者,而服務 B 是消息消費者,我們需要確保兩者之間數據的一致性。這里有 7 個步驟。

  1. 服務 A 向 RocketMQ 服務端發送事務消息。
  2. RocketMQ 將消息持久化成功之后,向服務A確認消息已經發送成功,此時消息為半消息。
  3. 服務 A 開始執行本地事務邏輯。
  4. 服務 A 根據本地事務執行結果向 RocketMQ 提交二次確認(Commit 或是 Rollback)。如果 RocketMQ 收到 Commit 結果,則將半消息標記為可投遞,服務 B 最終將收到該消息。而如果 RocketMQ 收到 Rollback 結果,則刪除半消息,服務 B 將不會接受該消息。
  5. 在斷網或者是應用重啟的特殊情況下,步驟 4 提交的二次確認最終未到達 RocketMQ,經過一定時間后 RocketMQ 將基于該消息向服務 A 發起消息回查。
  6. 服務 A 收到消息回查后,需要檢查對應消息的本地事務執行的最終結果。
  7. 服務 A 根據檢查得到的本地事務的最終狀態再次提交二次確認,RocketMQ 仍按照步驟 4 對半消息進行操作。

圖 2 更多是站在消息發布者的角度看待事務消息的發布流程。而針對消息消費而言,如果消費者處理事務消息時出現異常,RocketMQ 會進行重試操作,直到消息消費和本地事務處理都成功。這是一種回調機制,會被 RocketMQ 自動調用。

事務消息開發模式

介紹完 RocketMQ 事務消息的基本概念和執行流程之后,我們接著介紹它的開發模式。

實現消息發布者

當我們在微服務架構中引入事務消息之前,需要創建一張事務執行記錄表。事務執行記錄表的作用有兩個:一個是實現事務回查,另一個則是實現業務層冪等控制。

事務執行記錄表的創建腳本如以下代碼所示。

代碼清單1 事務執行記錄表 SQL 定義代碼

CREATE TABLE `tx_record` (
    `tx_no` varchar(64) NOT NULL COMMENT '事務Id',
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
    PRIMARY KEY (`tx_no`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='事務記錄表'

接下來我們要引入 RocketMQ 內置的TransactionListener接口。

為了實現事務消息,開發人員的主要開發工作量就體現在對這個接口的實現過程中。TransactionListener接口的定義如下所示。

代碼清單2 TransactionListener接口定義代碼

public interface TransactionListener {
    //當發送事務消息成功之后,該方法會被觸發,本地事務將被執行
    LocalTransactionState executeLocalTransaction(final Message msg, final Object arg);

    //當沒有收到事務消息的響應時,服務器會發送確認消息來檢查事務狀態,該方法會被觸發并獲取本地事務狀態
    LocalTransactionState checkLocalTransaction(final MessageExt msg);
}

可以看到,TransactionListener接口的兩個方法分別完成了本地事務執行和本地事務回查這兩個核心操作。那么我們應該如何實現這兩個方法呢?這里給出這兩個方法的執行偽代碼。

代碼清單3 TransactionListener接口兩個方法實現偽代碼

executeLocalTransaction {
 執行本地事務
 如果失敗就選擇回滾事務,反之提交事務
}

checkLocalTransaction {
 實現事務回查
 根據事務執行記錄判斷,已執行則提交事務
}

注意:這兩個方法需要消息的發布者來實現,但調用方是 RocketMQ 自身,而且這個調用過程是自動觸發的,不需要開發做任何干預。

圖 3 圍繞消息發布者展示了其所需要實現的各個核心步驟。

圖3 事務消息中消息發布者實現過程圖3 事務消息中消息發布者實現過程

如果我們使用 Spring 框架來集成 RocketMQ,那么圖 3 中的業務服務實現類的實現過程可以參考如下代碼示例。

代碼清單3 消息發布端業務服務實現類示例代碼。

@Service
public class CustomerTicketServiceImpl implements ICustomerTicketService {
    @Autowired
    TxRecordMapper txRecordMapper;

    @Autowired
    RocketMQTemplate rocketMQTemplate;

    @Override
    public void generateTicket(AddCustomerTicketReqVO addCustomerTicketReqVO) {
        //從VO中創建TicketGeneratedEvent
        TicketGeneratedEvent ticketGeneratedEvent = createTicketGeneratedEvent(addCustomerTicketReqVO);

        //將Event轉化為JSON對象
        JSONObject jsonObject =new JSONObject();
        jsonObject.put("ticketGeneratedEvent",ticketGeneratedEvent);
        String jsonString = jsonObject.toJSONString();

        //生成消息對象
        Message<String> message = MessageBuilder.withPayload(jsonString).build();

        //發送事務消息
        rocketMQTemplate.sendMessageInTransaction("producer_group_ticket","topic_ticket",message,null);
    }

    @Override
    @Transactional
    public void doGenerateTicket(TicketGeneratedEvent ticketGeneratedEvent) {
        //冪等判斷
        if(Objects.nonNull(txRecordMapper.findTxRecordByTxNo(ticketGeneratedEvent.getTxNo()))){
            return ;
        }

        //插入工單
        CustomerTicket customerTicket = CustomerTicketConverter.INSTANCE.convertEvent(ticketGeneratedEvent);
        customerTicket.setStatus(1);
        save(customerTicket);

        //添加事務日志
        txRecordMapper.addTxRecord(ticketGeneratedEvent.getTxNo());
    }
    ...
}

上述代碼展示的是一個插入客服工單(CustomerTicket)的過程,generateTicket和doGenerateTicket方法分別對應圖 3 中的發送消息和執行本地事務這兩個環節。

注意:這里使用了RocketMQTemplate的sendMessageInTransaction方法來發送事務消息。同時,我們也看到了事務執行記錄表的一種應用場景,即實現業務層冪等控制。

接下來繼續實現圖3所示的TransactionListener接口,示例代碼如下:

代碼清單4 TransactionListener接口實現類示例代碼。

@Component
@RocketMQTransactionListener(txProducerGroup = "producer_group_ticket")
public class ProducerListener implements RocketMQLocalTransactionListener {
    @Autowired
    ICustomerTicketService customerTicketService;

    @Autowired
    TxRecordMapper txRecordMapper;

    //事務消息發送后的回調方法,當消息發送給MQ成功,此方法被回調
    @Override
    @Transactional
    public RocketMQLocalTransactionState executeLocalTransaction(Message message, Object o) {
        try {
            //解析消息,轉成Event對象
            TicketGeneratedEvent ticketGeneratedEvent = convertEvent(message);

            //執行本地事務
            customerTicketService.doGenerateTicket(ticketGeneratedEvent);

            //當返回RocketMQLocalTransactionState.COMMIT,自動向MQ發送commit消息,MQ將消息的狀態改為可消費
            return RocketMQLocalTransactionState.COMMIT;
        } catch (Exception e) {
            e.printStackTrace();
            //如果本地事務執行失敗,就將消息設置為回滾狀態
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }

    //事務狀態回查
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message message) {
        //解析消息,轉成Event對象
        TicketGeneratedEvent ticketGeneratedEvent = convertEvent(message);

        //根據事務Id判斷是否存在已執行的事務
        Boolean isTxNoExisted = Objects.nonNull(txRecordMapper.findTxRecordByTxNo(ticketGeneratedEvent.getTxNo()));

        //如果事務已執行則返回COMMIT,反之返回UNKNOWN狀態
        if(isTxNoExisted){
            return RocketMQLocalTransactionState.COMMIT;
        }else{
            return RocketMQLocalTransactionState.UNKNOWN;
        }
    }
    ...
}

這段代碼清晰地展示了TransactionListener接口中兩個核心方法的實現過程。在executeLocalTransaction方法中,我們通過調用CustomerTicketService業務服務類的doGenerateTicket方法完成了本地事務;而在checkLocalTransaction方法中,我們則實現了事務回查機制。這里同樣展示了事務執行記錄表的另一種應用場景,即實現事務回查。

實現消息消費者

類似,當使用事務消息時,消息消費者的實現過程同樣遵循一定的開發規范,如圖 4 所示。

圖4 事務消息中消息消費者實現過程圖4 事務消息中消息消費者實現過程

可以看到,相比于消息發布者,消息消費者的實現過程要簡單很多。

代碼清單5 消息消費實現類示例代碼。

@Component
@RocketMQMessageListener(consumerGroup = "consumer_group_ticket",topic = "topic_ticket")
public class Consumer implements RocketMQListener<String> {
    @Autowired
    IChatRecordService chatRecordService;

    //接收消息
    @Override
    public void onMessage(String message) {
        log.info("開始消費消息:{}",message);

        //解析消息
        JSONObject jsonObject = JSONObject.parseObject(message);
        String ticketGeneratedEventString = jsonObject.getString("ticketGeneratedEvent");

        //轉成TicketGeneratedEvent
        TicketGeneratedEvent ticketGeneratedEvent = JSONObject.parseObject(ticketGeneratedEventString, TicketGeneratedEvent.class);

        //添加本地聊天記錄
        chatRecordService.generateChatRecord(ticketGeneratedEvent);
    }
}

可以看到,這個消息消費者的實現過程沒有任何特殊之處,我們只需要實現RocketMQListener接口的onMessage方法,并在該方法中調用業務服務實現類中的業務方法即可。

消費者端的業務服務實現類的實現過程如下。

代碼清單6 消息消費端業務服務實現類示例代碼:

@Service
public class ChatRecordServiceImpl implements IChatRecordService {
    @Autowired
    TxRecordMapper txRecordMapper;

    @Override
    @Transactional
    public void generateChatRecord(TicketGeneratedEvent ticketGeneratedEvent) {
        //冪等判斷
        if(Objects.nonNull(txRecordMapper.findTxRecordByTxNo(ticketGeneratedEvent.getTxNo()))){
            return ;
        }

        //插入聊天記錄
        ChatRecord chatRecord = ChatRecordConverter.INSTANCE.convertEvent(ticketGeneratedEvent);
        save(chatRecord);

        //添加事務日志
        txRecordMapper.addTxRecord(ticketGeneratedEvent.getTxNo());
    }
}

這里同樣通過事務執行記錄表實現了業務層冪等控制,并最終完成本地事務的提交。

作為總結,我們使用時序圖來詳細展示事務消息發送和消費過程,如圖 5 所示。

圖5 事務消息發送和消費時序圖圖5 事務消息發送和消費時序圖


責任編輯:武曉燕 來源: 一安未來
相關推薦

2021-02-02 11:01:31

RocketMQ消息分布式

2021-04-27 07:52:18

RocketMQ消息投遞

2021-09-12 14:30:43

虛擬化存儲

2019-04-03 10:19:41

云遷移云端云提供商

2022-12-27 17:56:40

ack機制RocketMQ

2013-12-12 16:14:21

storm入門教程storm消息處理

2011-04-19 10:57:18

2022-11-16 08:31:12

AOPRocketMQ組件

2025-06-05 08:00:00

Go事件驅動系統編程

2010-09-15 10:20:03

2009-12-23 16:06:46

WPF事件策略

2011-03-29 13:10:56

SQL Server

2022-02-09 15:44:20

RocketMQLinux系統

2023-04-03 08:39:33

中間件go語言

2024-08-14 08:11:41

2023-03-14 07:31:17

EoscGo語言

2017-03-14 13:51:23

AndroidView事件分發和處理

2023-03-09 10:22:00

SpringBootRabbitMQ

2023-11-08 00:23:08

網關API

2024-02-28 09:12:27

RocketMQKosmosAZ
點贊
收藏

51CTO技術棧公眾號

欧美二区视频| 欧美男男激情videos| 精品中文字幕一区二区| 久久国产精品影片| 黄色录像a级片| 免费观看亚洲| 国产精品久久久久久久久免费樱桃| 国产在线播放不卡| 国产在线拍揄自揄拍| 曰本一区二区三区视频| 欧美群妇大交群的观看方式| 51xx午夜影福利| 五十路在线视频| 青娱乐精品在线视频| 久久99久久99精品中文字幕| 日本japanese极品少妇| 日韩欧乱色一区二区三区在线| 一区二区三区四区亚洲| 日本福利一区二区三区| 精品国产黄色片| 日韩精品电影在线| 欧美激情久久久久| 欧美成人久久久免费播放| 国产精品一线| 欧美巨大另类极品videosbest| 国产乱子伦农村叉叉叉| 欧美日本网站| 国产成人av一区二区三区在线| 国产精品久在线观看| 国产污视频在线看| 亚洲色图网站| 中文字幕成人精品久久不卡| 国产麻豆天美果冻无码视频| 人人爱人人干婷婷丁香亚洲| 91官网在线观看| 成人性生活视频免费看| www国产在线观看 | 日本55丰满熟妇厨房伦| 日本免费久久| 欧美丝袜一区二区| 国内精品视频一区二区三区| a黄色片在线观看| 国产精品每日更新| 深夜福利成人| 可以在线观看的黄色| 99热这里都是精品| av一本久道久久波多野结衣| 国产乱码精品一区二三区蜜臂| 日韩二区三区在线观看| 青青草成人在线| 特一级黄色大片| 极品av少妇一区二区| 欧美日本中文字幕| 久久久久成人片免费观看蜜芽| 亚洲色图网站| 色综合视频一区中文字幕| 日韩在线观看视频一区二区| 999精品色在线播放| 中文字幕综合一区| 国精产品视频一二二区| 成人精品中文字幕| 中文日韩电影网站| 亚洲天堂岛国片| 成人免费电影网址| 深夜福利91大全| 男女全黄做爰文章| 国产精品久久占久久| 日韩有码在线观看| 激情国产一区二区| 亚洲精品自在久久| 少妇饥渴放荡91麻豆| 国产精品调教| 日韩精品亚洲视频| 中文字幕网站在线观看| re久久精品视频| 中文字幕在线亚洲| 婷婷久久综合网| 欧美91精品| 久久久久久久久电影| 欧美精品一级片| 精品999成人| 7777精品视频| 无码人妻黑人中文字幕| 免费一级欧美片在线观看| 国产精品久久一区| av免费在线不卡| 成人成人成人在线视频| 欧美一区二区三区成人久久片| 成人18在线| 一区二区三区.www| 国产男女在线观看| 毛片无码国产| 色欧美片视频在线观看 | 亚洲深夜福利| 国产欧美日韩综合精品| 性欧美videos另类hd| 91美女片黄在线| 中文字幕日韩一区二区三区| 国产精品蜜臀| 欧美影视一区二区三区| 美女被艹视频网站| 蜜桃a∨噜噜一区二区三区| 中文字幕不卡av| 国产一级特黄视频| 日韩av不卡在线观看| 粉嫩高清一区二区三区精品视频| 麻豆导航在线观看| 一区二区三区不卡视频| 99免费视频观看| 91精品国产自产精品男人的天堂| 亚洲人成在线电影| 久久久精品视频在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产不卡一区二区在线观看 | www.欧美.com| www亚洲国产| 亚洲欧美小说色综合小说一区| 3751色影院一区二区三区| 无码人妻aⅴ一区二区三区| 亚洲成av人片乱码色午夜| 日韩免费观看视频| 欧美一区二区在线观看视频| 国产精品久久久久永久免费观看 | 欧美日韩三级一区| 性欧美成人播放77777| 欧美在线首页| 国产色婷婷国产综合在线理论片a| 无码国精品一区二区免费蜜桃| 亚洲三级在线看| 天天干天天爽天天射| 青青草久久爱| 欧美交受高潮1| 国产精品伦一区二区三区| 国产欧美久久久精品影院| 黄色片视频在线免费观看| 日韩一区二区三区高清在线观看| 色偷偷av一区二区三区乱| 欧美性猛交xxxx乱大交hd | 男人的天堂官网| 亚洲主播在线| 国产综合欧美在线看| 色yeye免费人成网站在线观看| 在线成人av网站| 国产精品69久久久久孕妇欧美| 久久一区中文字幕| 免费av一区二区三区| 深夜成人在线| 亚洲精品成a人在线观看| 日本一级黄色大片| 波多野结衣中文一区| 日韩极品视频在线观看| 亚洲一区二区三区中文字幕在线观看 | 99久久婷婷国产一区二区三区| 欧美国产综合一区二区| 999在线免费视频| 精品九九在线| 国产精品成人在线| 成人欧美亚洲| 欧美高清dvd| 国产日韩欧美在线观看视频| 国内精品视频666| 9999在线观看| 欧美影院在线| 久久久久久网址| 少妇无码一区二区三区| 欧美日韩美女视频| 成人午夜剧场视频网站| 天堂成人国产精品一区| 先锋影音网一区| 日韩电影免费观看高清完整版在线观看| 色视频www在线播放国产成人 | 精品蜜桃在线看| 日操夜操天天操| 92精品国产成人观看免费| 动漫av网站免费观看| 国产成人精品一区二区免费看京| 国产精品激情自拍| 国产理论在线观看| 欧美一级艳片视频免费观看| xxxx 国产| 国产日韩成人精品| 久久精品无码一区二区三区毛片 | 国产亚洲欧美日韩日本| 中文字幕国内自拍| 国产精品草草| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 久久久综合网站| 久国产精品视频| 亚洲国产免费看| 神马影院午夜我不卡| 精品国产亚洲一区二区三区大结局 | 91手机视频在线观看| av2020不卡| 中文字幕日韩有码| 亚洲乱码精品久久久久..| 欧美午夜影院在线视频| 91传媒免费观看| 成人av电影在线播放| 中文字幕第80页| 欧美日本免费| 日韩精彩视频| 国产成人精品福利| 国产日韩在线看| 国产污视频在线播放| 中文字幕日韩综合av| 男人天堂综合网| 欧美日本在线播放| 精品人妻一区二区三区免费看| 亚洲美女精品一区| 国产真实乱人偷精品人妻| 国产成人精品影视| 九热视频在线观看| 99国产一区| 免费在线精品视频| 精品国产一级毛片| 国精产品99永久一区一区| 欧美日韩卡一| 日本成人免费在线| 牛牛精品在线视频| 久久偷看各类女兵18女厕嘘嘘| 欧美欧美欧美| 亚洲成人免费网站| 91久久精品国产91性色69| 日韩欧美在线一区| 五月天婷婷丁香| 亚洲同性同志一二三专区| 男人舔女人下部高潮全视频| 国产成人亚洲综合a∨婷婷图片| 欧美自拍小视频| 亚洲综合社区| 福利视频一二区| 欧美福利视频| 一区二区三区电影| 精品免费av| 欧美高清视频一区| 亚洲资源网站| 久久精品女人的天堂av| 第一区第二区在线| 超碰在线观看97| 久久伊人影院| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产成人免费精品| 国产精品久久二区| 芒果视频成人app| 国产91色在线|免| 亚洲一区资源| 日本一区二区在线播放| 欧美大片高清| 国产精品电影网| 欧美暴力调教| 国产精品久久久久久久美男| 456成人影院在线观看| 国产精品男人爽免费视频1| 日韩欧美一区二区三区免费观看| 国产成人精品午夜| 成人黄色免费短视频| 国产91色在线|免| 欧美国产日韩电影| 国产免费一区二区三区在线能观看| 天然素人一区二区视频| 国产精品美女主播| 香蕉成人在线| 亚洲一区二区日本| 91精品国产自产精品男人的天堂| av激情久久| 香蕉一区二区| 日本一区免费观看| 97人人精品| 97在线免费视频观看| 最新成人av网站| 欧美女人性生活视频| 免费在线视频一区| 伊人成人免费视频| 成人精品gif动图一区| 亚洲av网址在线| 国产片一区二区| 女同久久另类69精品国产| 一区二区三区精品视频| 成年人免费看毛片| 在线这里只有精品| 国产麻豆精品一区| 亚洲成人av在线| 国产精品ⅴa有声小说| xxxx性欧美| caoporn视频在线| 国产精品久久久久9999| 久久精品九色| 欧美大香线蕉线伊人久久国产精品 | 国产精品免费区二区三区观看| 亚洲成人一品| 综合操久久久| 国产日韩1区| 成人黄色一级大片| 99久久精品免费看| 任你操精品视频| 亚洲18女电影在线观看| 中文字幕人妻一区二区三区视频| 欧美一级在线免费| 国产三级视频在线看| 欧美成人午夜免费视在线看片| 中文字幕高清在线播放| 成人国产在线视频| 日韩美女毛片| 2021狠狠干| 久久天堂成人| 欧美午夜精品一区二区| 国产欧美视频一区二区| 国产一级视频在线播放| 欧美日韩在线亚洲一区蜜芽| 天堂在线中文网| 美女国内精品自产拍在线播放| 深夜成人影院| 国产欧美日韩一区| 亚洲欧美网站在线观看| 亚洲天堂av线| 97久久久精品综合88久久| 欧美特级一级片| 欧美亚洲国产怡红院影院| 色呦呦免费观看| 欧美成人免费va影院高清| 日韩国产激情| 久久国产日韩欧美| 韩国久久久久| 亚洲五月激情网| 亚洲国产高清在线观看视频| 日本天堂网在线| 精品国产伦一区二区三区免费| 免费a级毛片在线播放| 日韩av电影在线播放| 看全色黄大色大片免费久久久| 99久re热视频精品98| 美女脱光内衣内裤视频久久影院| 少妇真人直播免费视频| 亚瑟在线精品视频| 亚洲女人18毛片水真多| 欧美成人午夜剧场免费观看| 国产精品日本一区二区三区在线| 日韩亚洲视频| 日韩av一区二区在线影视| 午夜一区二区三区免费| 欧美色视频日本高清在线观看| 日本美女一级片| 97国产suv精品一区二区62| jazzjazz国产精品麻豆| 99久久免费观看| 国产99久久久国产精品潘金| 日本aⅴ在线观看| 91精品国产一区二区人妖| 国产在线更新| 91麻豆蜜桃| 欧美视频网站| 中文字幕55页| 亚洲精品久久嫩草网站秘色| 精品国产99久久久久久宅男i| 久久国产天堂福利天堂| 午夜视频一区二区在线观看| 青草网在线观看| 丁香啪啪综合成人亚洲小说| 久久精品免费在线| 精品视频在线导航| 竹内纱里奈兽皇系列在线观看| 麻豆成人av| 日韩av不卡一区二区| 国产精品免费在线视频| 欧美精品三级日韩久久| 在线看一级片| 国产精品xxxx| 亚洲欧美日韩精品一区二区| 在线免费观看成年人视频| 在线免费精品视频| 麻豆视频在线免费观看| 91精品综合久久| 亚洲美女一区| 51妺嘿嘿午夜福利| 欧美一区二区在线看| 1234区中文字幕在线观看| 免费日韩电影在线观看| 免费人成在线不卡| 午夜免费激情视频| 亚洲精品第一页| 欧美日韩女优| 成人手机在线播放| 91视视频在线观看入口直接观看www | 中文字幕线观看| 一级特黄大欧美久久久| 四虎在线免费看| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 色婷婷精品视频| 亚洲综合日韩欧美| 亚洲综合成人网| 国产毛片av在线| 亚洲一区二区三区成人在线视频精品| 伊人成人在线| 日韩av片在线| 日韩精品一区二区三区中文精品| 中文字幕一区久| 成人区一区二区| 国产欧美一区二区三区网站 | 色婷婷综合久久久中字幕精品久久 | 奇米视频888|