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

億級(jí)高性能通知系統(tǒng)實(shí)踐

開發(fā) 架構(gòu)
在運(yùn)維層面,也應(yīng)該考慮服務(wù)不同機(jī)房的部署,以保證服務(wù)的可用性,為了應(yīng)對(duì)流量的變化同時(shí)也基于成本的考慮,也可以基于服務(wù)的綜合指標(biāo)進(jìn)行彈性擴(kuò)縮容。

在一個(gè)公司中,消息通知系統(tǒng)是不可或缺的一部分,每個(gè)團(tuán)隊(duì)都可能開發(fā)了一套獨(dú)自的消息通知組件,隨著公司業(yè)務(wù)團(tuán)隊(duì)的日益增長(zhǎng),維護(hù)繁瑣、排查問題復(fù)雜、開發(fā)成本等問題就會(huì)凸顯出來。(例如我們的企微群通知,由于消息內(nèi)容不同模板不同,一個(gè)項(xiàng)目?jī)?nèi)使用的組件就有3種,還不包含其他通知部分。)

基于這樣的背景,我們就迫切需要開發(fā)一套通用的消息通知系統(tǒng)。那么如何高效地處理大量的消息請(qǐng)求以及服務(wù)穩(wěn)定性的保障,成為了開發(fā)者需要面對(duì)的重要挑戰(zhàn)。本文將探討如何構(gòu)建高性能的消息通知系統(tǒng)。

1 服務(wù)劃分

圖片圖片

  • 配置層: 主要是后臺(tái)管理系統(tǒng),做一些發(fā)送的配置,包括請(qǐng)求方式、請(qǐng)求地址、預(yù)期響應(yīng)結(jié)果、通道綁定、通道選擇、重試策略以及結(jié)果查詢等功能。
  • 接口層:對(duì)外提供服務(wù)的方式,支持RPC與MQ的方式,后續(xù)如需Http或其他方式可以擴(kuò)展添加。
  • 基礎(chǔ)服務(wù)層:業(yè)務(wù)核心層,包括消息的首次發(fā)送與重試發(fā)送,消息通道的路由選擇以及服務(wù)的調(diào)用包裝。其中可以看到正常與異常的服務(wù)發(fā)送執(zhí)行器,通過這樣的設(shè)計(jì)可以對(duì)異常服務(wù)的發(fā)送與正常服務(wù)發(fā)送進(jìn)行隔離,避免異常服務(wù)的發(fā)送對(duì)正常服務(wù)造成影響。比如請(qǐng)求某一消息通道的接口耗時(shí)長(zhǎng)了,導(dǎo)致請(qǐng)求該通道的資源占用時(shí)間較長(zhǎng),從而影響的正常服務(wù)的請(qǐng)求調(diào)用。執(zhí)行器的選擇是根據(jù)路由器進(jìn)行路由的,其中路由策略包括配置的路由策略以及動(dòng)態(tài)服務(wù)異常自發(fā)現(xiàn)路由策略。所謂正常服務(wù)與異常服務(wù)指的是調(diào)用的下游服務(wù)方是否正常,比如我們發(fā)送支付成功的消息或調(diào)用第三方短信服務(wù),如果在一段時(shí)間響應(yīng)都比較慢或直接失敗等我們就可以判定為異常服務(wù)。
  • 通用組件層:主要是對(duì)一些通用組件的封裝。
  • 存儲(chǔ)層:包括緩存層與持久化層,緩存層主要是緩存配置的發(fā)送策略、重試策略以及其他一些需要進(jìn)行緩存的內(nèi)容,持久化層主要是ES與MySQL,MySQL存儲(chǔ)消息的發(fā)送記錄以及配置,ES主要存儲(chǔ)消息的發(fā)送記錄供用戶查詢。

2 系統(tǒng)設(shè)計(jì)

2.1 首次消息發(fā)送

圖片圖片

在接受消息發(fā)送請(qǐng)求的時(shí)候,一般會(huì)通過 RPC 服務(wù)請(qǐng)求和 MQ 消息消費(fèi)進(jìn)行處理,這兩種方式各有優(yōu)缺點(diǎn),RPC 這種方式,我們無需考慮消息的丟失問題,MQ 可以實(shí)現(xiàn)異步解耦、削峰填谷。

2.1.1 冪等性的處理

為了防止接收到同樣的消息內(nèi)容進(jìn)行發(fā)送處理,我們通常會(huì)做一些冪等性的設(shè)計(jì)。冪等性的判斷有很多手段,比如先加鎖再查詢或利用數(shù)據(jù)庫的唯一主鍵等來實(shí)現(xiàn),但其實(shí)在我們消息量很大的時(shí)候,查數(shù)據(jù)庫就有點(diǎn)慢了。因?yàn)榘l(fā)送消息的這種場(chǎng)景,重復(fù)消息一般在短時(shí)間內(nèi)發(fā)生的,一般不會(huì)有跨很多天來一筆已經(jīng)發(fā)送過的消息,所以可以設(shè)計(jì)利用 Redis 來實(shí)現(xiàn),先判斷是否有相同的Redis Key,再判斷消息內(nèi)容是否相同,有可能相同的Redis Key,發(fā)送不同的消息內(nèi)容,這種是允許的,具體看對(duì)應(yīng)的業(yè)務(wù)需求。

private boolean isDuplicate(MessageDto messageDto) {
        String redisKey = getRedisKey(messageDto);
        boolean isDuplicate = false;
        try {
            if (!RedisUtils.setNx(redisKey, messageDto, 30*60L)) {
                isDuplicate = true;
            }
            if (isDuplicate) {
                MessageDto oldDTO = RedisUtils.getObject(redisKey);
                if (Objects.equals(messageDto,oldDTO)) {
                    log.info("消息重復(fù)了");
                } else {
                    isDuplicate = false;
                }
            }
        } catch (Exception e) {
            isDuplicate = false;
        }
        return isDuplicate;
    }

2.1.2 問題服務(wù)動(dòng)態(tài)發(fā)現(xiàn)器

上文提到路由器中的路由策略包括配置的路由策略和動(dòng)態(tài)服務(wù)異常自發(fā)現(xiàn)路由策略,其中動(dòng)態(tài)服務(wù)異常自發(fā)現(xiàn)路由策略核心在于服務(wù)異常自發(fā)現(xiàn),核心是依據(jù)問題服務(wù)動(dòng)態(tài)發(fā)現(xiàn)器實(shí)現(xiàn)的,當(dāng)我們發(fā)現(xiàn)某一個(gè)消息通道服務(wù)異常時(shí)可以自動(dòng)路由采用異常通知執(zhí)行器執(zhí)行。

我們主要是借助sentinel的API在各自節(jié)點(diǎn)JVM內(nèi)實(shí)現(xiàn)的,針對(duì)設(shè)置的時(shí)間窗口內(nèi)請(qǐng)求的總次數(shù)和失敗的總次數(shù)進(jìn)行統(tǒng)計(jì),達(dá)到設(shè)定值,就認(rèn)為請(qǐng)求的服務(wù)有問題了,認(rèn)定其為異常服務(wù)。核心主要是以下兩個(gè)方法,其中l(wèi)oadExecuteHandlerRules方法主要是對(duì)流控規(guī)則的設(shè)定,我們可以通過Apollo或Nacos進(jìn)行動(dòng)態(tài)的修改,judge方法是對(duì)請(qǐng)求和失敗的攔截,判斷允許正常訪問,一旦攔截后就認(rèn)為是異常服務(wù),在內(nèi)存中進(jìn)行標(biāo)記記錄,后續(xù)請(qǐng)求通過異常執(zhí)行器執(zhí)行處理。

當(dāng)我們看到這兒會(huì)不會(huì)有疑問,問題服務(wù)在啥時(shí)候會(huì)恢復(fù)正常呢,難道服務(wù)出現(xiàn)一次問題,就一直被認(rèn)定為問題服務(wù)了?當(dāng)時(shí)不是的,我們也設(shè)計(jì)了類似熔斷器那樣的自動(dòng)恢復(fù)功能,在判斷為問題服務(wù)后會(huì)經(jīng)過一段時(shí)間的靜默期,靜默期內(nèi)所有對(duì)該服務(wù)的請(qǐng)求都走異常通知器的執(zhí)行流程,當(dāng)靜默期過后,此時(shí)到達(dá)了半熔斷期,就是如果訪問正常的次數(shù)達(dá)到一定值后,就會(huì)恢復(fù)為正常。

//加載執(zhí)行器的規(guī)則 durationInSec 時(shí)間窗口長(zhǎng)度  requestCount  請(qǐng)求總量 failCount失敗總量
    public void loadExecuteHandlerRules(Long durationInSec,Long requestCount,Long failCount) {
        List<ParamFlowRule> rules = new ArrayList<>();
        //REQUEST_RESOURCE  請(qǐng)求資源 可自定義
        rules.add(ofParamFlowRule(REQUEST_RESOURCE, requestCount, durationInSec));
        //REQUEST_RESOURCE  失敗資源 可自定義
        rules.add(ofParamFlowRule(FAIl_RESOURCE, failCount, durationInSec));
        ParamFlowRuleManager.loadRules(rules);
    }

    public ParamFlowRule ofParamFlowRule(String resource, Long failCount, Long durationInSec) {
        ParamFlowRule rule = new ParamFlowRule();
        rule.setResource(FAIl_RESOURCE);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(failCount);
        rule.setDurationInSec(durationInSec);
        rule.setParamIdx(0);
        return rule;
    }
//key 請(qǐng)求的標(biāo)識(shí)key,可以是對(duì)應(yīng)某一服務(wù)的標(biāo)識(shí),reqSuc 請(qǐng)求是否成功,false是失敗,true是成功
    public static boolean judge(String key, boolean reqSuc) {
        return isBlock(REQUEST_RESOURCE, reqSuc, key) && isBlock(FAIl_RESOURCE, reqSuc, key);
    }

    public Boolean isBlock(String resource, boolean reqSuc, String key) {
        boolean block = false;
        Entry failEntry = null;
        try {
            failEntry = entry(resource, EntryType.IN, reqSuc ? 0 : 1, key);
        } catch (BlockException e) {
            block = true;
        } finally {
            if (failEntry != null) {
                failEntry.exit();
            }
        }
        return block;
    }

2.1.3 sentinel 滑動(dòng)窗口的實(shí)現(xiàn)原理(環(huán)形數(shù)組)

圖片圖片

根據(jù)傳入的時(shí)間窗口大小和數(shù)量,計(jì)算數(shù)組的數(shù)量,數(shù)組的下標(biāo)就是windowsId,windowsStart是每個(gè)數(shù)組的起始時(shí)間值。

例如:統(tǒng)計(jì) 1s 的請(qǐng)求量,設(shè)置兩個(gè)窗口,那么每個(gè)窗口對(duì)應(yīng)的id 就是0、1,相應(yīng)的時(shí)間范圍就是 0m-500ms,500ms-1000ms。如果當(dāng)前時(shí)間是 700ms,那么對(duì)應(yīng)的窗口 id=(700/500)%2=0, 對(duì)應(yīng)的 windowStart=700-(700%500)=200,對(duì)應(yīng)的起始就是 id 為 0 的窗口;如果當(dāng)前時(shí)間是 1200ms,對(duì)應(yīng)的窗口 id=(1200/500)%2=0;對(duì)應(yīng)的 windowStart=1200-(1200%500)=1000 大于 id=0 的起始時(shí)間,重置 id 為 0 的窗口起始值,id=0 的位置不變。

2.1.4 線程池的動(dòng)態(tài)調(diào)整

消息處理完成后,利用線程池進(jìn)行異步發(fā)送,線程池分為正常服務(wù)的線程池和異常服務(wù)的線程池,至于為啥設(shè)計(jì)不同的線程池,我們?cè)谙旅娣€(wěn)定性設(shè)計(jì)方面闡述。線程池核心參數(shù)的設(shè)定一般會(huì)根據(jù)任務(wù)類型和 CPU 核數(shù)進(jìn)行一個(gè)初始化的設(shè)定,后續(xù)我們一般會(huì)壓測(cè)來動(dòng)態(tài)的調(diào)整來滿足我們的目標(biāo)。那么我們?cè)鯓涌梢栽O(shè)計(jì)一個(gè)可以動(dòng)態(tài)調(diào)整的線程池呢?

一般我們可以通過 Apollo 或 Nacos 等統(tǒng)一配置來動(dòng)態(tài)修改線程池的參數(shù),但是線程池的阻塞隊(duì)列長(zhǎng)度是不允許修改的,當(dāng)然我們可以自己自定義一個(gè)隊(duì)列來實(shí)現(xiàn)這樣的功能。接下來我們講述的這種設(shè)計(jì),是不用通過自定義阻塞隊(duì)列的方式去實(shí)現(xiàn)的。

ThreadPoolExecutor pool = new ThreadPoolExecutor(poolSize, poolSize,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());

我們直接定義了一個(gè)無界的線程池,核心線程數(shù)和最大線程數(shù)相等,而且用的是默認(rèn)的丟棄策略,那么就有疑問了,這樣的線程池我們?cè)谑褂玫臅r(shí)候,會(huì)有內(nèi)存溢出和消息的丟失風(fēng)險(xiǎn),別著急,我們繼續(xù)往下看。

Notifier notifier = getNotifier();
   if (!notifier.isBusy()) {
        notifier.execute(msgContent);
    } 

  public boolean isBusy() {
      return notifyPool.getQueue().size() >= config.getMaxHandlerSize() * 2;
    }

在每次添加任務(wù)的時(shí)候會(huì)判斷線程池隊(duì)列中的任務(wù)是否達(dá)到設(shè)定的最大值,如果達(dá)到就不會(huì)繼續(xù)添加了,當(dāng)前線程池處于繁忙狀態(tài)了,后續(xù)可以利用 MQ 落庫,之后通過重試任務(wù)進(jìn)行發(fā)送了,也保證了永遠(yuǎn)不會(huì)觸發(fā)線程池的拒絕策略。

2.2 重試消息發(fā)送

圖片圖片

部分消息因?yàn)橄到y(tǒng)達(dá)到瓶頸處理不過來或某些消息發(fā)送失敗需要重試,這些消息都可以通過任務(wù)重試來進(jìn)行處理,當(dāng)然利用這種方式也可以實(shí)現(xiàn)延遲消息的發(fā)送。

實(shí)現(xiàn)這種重試的消息機(jī)制可以利用分布式定時(shí)任務(wù)調(diào)度框架,一般為了提高重試效率,會(huì)采用分片廣播這種方式,自己做好消息重復(fù)發(fā)送的控制,我們也可以利用調(diào)度線程池來實(shí)現(xiàn)。

public void init() {
        ScheduledExecutorService scheduledService = new ScheduledThreadPoolExecutor(taskRepository.size());
        for (Map.Entry<String, TaskHandler> entry : taskRepository.entrySet()) {
            final String taskName = entry.getKey();
            final TaskHandler handler = entry.getValue();
            scheduledService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    try {
                        // 是否繁忙判斷
                        if (handler.isBusy()) {
                            return;
                        }
                        handleTask(taskName, handler);
                    } catch (Throwable e) {
                        logger.error(taskName + " task hanlder fail!", e);
                    }
                }
            }, 30, 5, TimeUnit.SECONDS);
        }
    }

每次進(jìn)行任務(wù)撈取進(jìn)行調(diào)度時(shí),會(huì)首先判斷下當(dāng)前 handler 是否繁忙,其實(shí)就是重試不同類型任務(wù)的線程池資源是否充足,如果不充足的話,即使撈取出來,也一直是排隊(duì)等待。

public void handTask(String taskName, TaskHandler handler) {
        Lock lock = LockFactory.getLock(taskName);
        List<ScheduleTaskEntity> taskList = null;
        try {
            if (lock.tryLock()) {
                taskList = getTaskList(taskName, handler);
            }
        } finally {
            lock.unlock();
        }
        if (taskList == null) return;
        handler.handleData(taskList);
    }

為了防止不同的節(jié)點(diǎn)處理相同的任務(wù)進(jìn)行了加鎖控制,每次撈取的任務(wù)量是根據(jù)不同任務(wù) handler 設(shè)置的量來確定的,撈取完成后發(fā)送至 MQ,然后采用線程池進(jìn)行發(fā)送處理。

2.2.1 ES與MySQL數(shù)據(jù)同步

由于發(fā)送消息的數(shù)據(jù)量,后臺(tái)在進(jìn)行數(shù)據(jù)查詢時(shí)主要是通過ES進(jìn)行查詢處理的,這就涉及到數(shù)據(jù)庫數(shù)據(jù)與ES數(shù)據(jù)一致性的問題。當(dāng)然也可以采用分庫分表或?qū)挶淼燃夹g(shù)進(jìn)行處理,分庫分表對(duì)一些非分片鍵的查詢可能不太友好。

圖片圖片

ES 更新完成后修改數(shù)據(jù)庫狀態(tài)為更新完成狀態(tài),若此時(shí)通知記錄表還有更新,就會(huì)將同步狀態(tài)初始化,若修改數(shù)據(jù)庫為init先于同步完成后的更新就會(huì)出現(xiàn)數(shù)據(jù)不一致的問題,所以每次同步時(shí)攜帶上數(shù)據(jù)庫中的update_time,大于等于db中的update_time才會(huì)更新完成(其實(shí)update_time就是一個(gè)版本號(hào))。

圖片圖片

ES按月滾動(dòng)建立索引,每月新建立的索引,標(biāo)簽都是hot,新增的數(shù)據(jù)都會(huì)放入hot節(jié)點(diǎn)上進(jìn)行存儲(chǔ),到了第二月,通過定時(shí)任務(wù)將上月索引的tag修改為cold,ES集群就會(huì)自動(dòng)將數(shù)據(jù)遷移到標(biāo)簽為cold節(jié)點(diǎn)上(cold節(jié)點(diǎn)的性能一般配置都比較低,對(duì)性能要求并不高)。

3 穩(wěn)定性的保障

上述一系列的設(shè)計(jì)是圍繞高性能進(jìn)行考慮的,當(dāng)然在穩(wěn)定性方面我們也不能忽略,下述幾方面也是我們?cè)诜€(wěn)定性方面的考慮。

3.1 流量突增

面對(duì)流量突增時(shí)做了兩層降級(jí)。當(dāng)流量緩慢增大時(shí),線程池繁忙后,利用MQ做了一次流量削峰、異步落庫,后續(xù)定時(shí)任務(wù)處理發(fā)送,發(fā)送的延時(shí)時(shí)間是0s;當(dāng)流量陡增,用sentinel進(jìn)行判斷,不經(jīng)任何判斷直接MQ削峰落庫,后續(xù)消費(fèi)是延遲消費(fèi)的,待資源空閑才進(jìn)行撈取處理。

3.2 問題服務(wù)的資源隔離

首先我們想想為啥要做問題服務(wù)的隔離呢,不做會(huì)有什么后果呢?設(shè)想一下如果不隔離,問題服務(wù)與正常服務(wù)采用同一線程池資源進(jìn)行處理,當(dāng)問題服務(wù)請(qǐng)求請(qǐng)求耗時(shí)時(shí)間較長(zhǎng),線程釋放慢,會(huì)導(dǎo)致大量正常服務(wù)的消息不能及時(shí)進(jìn)行處理,這樣就會(huì)導(dǎo)致問題服務(wù)影響到正常服務(wù)的消息處理,所以才需要做問題服務(wù)與正常服務(wù)的資源艙壁隔離。

3.3 第三方服務(wù)的保護(hù)

正常的第三方服務(wù)一般都會(huì)做限流降級(jí)設(shè)置,防止服務(wù)被擊垮。如果一些開發(fā)水平欠缺的服務(wù)沒有做,就需要我們進(jìn)行考慮了,一方面不能因?yàn)槲覀兊恼?qǐng)求量較大,影響到別人服務(wù),另一方面,我們的服務(wù)不能因?yàn)榈谌椒?wù)而引發(fā)問題,所以通常我們需要考慮進(jìn)行熔斷處置。

3.4 中間件的容錯(cuò)

在我們使用各種中間件時(shí),也應(yīng)該考慮的中間件的問題。比如公司MQ需要進(jìn)行擴(kuò)容升級(jí),會(huì)使MQ宕機(jī)數(shù)秒,針對(duì)這種問題的容錯(cuò),在進(jìn)行開發(fā)時(shí)也應(yīng)盡可能的考慮設(shè)計(jì)到。

3.5 完善的監(jiān)控體系

我們也應(yīng)該建立完善的監(jiān)控系統(tǒng),來保障服務(wù)的穩(wěn)定運(yùn)行,能在問題擴(kuò)散之前及時(shí)發(fā)現(xiàn)處理,能在問題發(fā)生后進(jìn)行快速的處理,能在后期優(yōu)化處理時(shí)提供輔助依據(jù)。

3.6 服務(wù)的雙活部署、彈性擴(kuò)縮容

在運(yùn)維層面,也應(yīng)該考慮服務(wù)不同機(jī)房的部署,以保證服務(wù)的可用性,為了應(yīng)對(duì)流量的變化同時(shí)也基于成本的考慮,也可以基于服務(wù)的綜合指標(biāo)進(jìn)行彈性擴(kuò)縮容。

4 總結(jié)

任何一個(gè)系統(tǒng)的設(shè)計(jì),我們都應(yīng)該從服務(wù)架構(gòu)、系統(tǒng)功能、穩(wěn)定性保障等方面去進(jìn)行考慮。如何具備良好的擴(kuò)展性與容錯(cuò)性,輕松應(yīng)對(duì)各種復(fù)雜多變的業(yè)務(wù)場(chǎng)景也是我們面臨的設(shè)計(jì)挑戰(zhàn)。當(dāng)然技術(shù)方案的設(shè)計(jì)從無萬全之策,亦不存在一勞永逸的‘銀彈’,所以需要結(jié)合具體的業(yè)務(wù)場(chǎng)景進(jìn)行自己的思考與設(shè)計(jì)。

關(guān)于作者趙培龍 采貨俠JAVA開發(fā)工程師

責(zé)任編輯:武曉燕 來源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2024-10-15 16:31:30

2020-01-17 11:00:23

流量系統(tǒng)架構(gòu)

2020-07-16 08:06:53

網(wǎng)關(guān)高性能計(jì)

2021-06-30 14:23:30

AMD

2016-05-03 16:00:30

Web系統(tǒng)容錯(cuò)性建設(shè)

2021-02-02 08:32:46

日志系統(tǒng) 高性能

2022-05-12 14:34:14

京東數(shù)據(jù)

2022-08-15 08:01:35

微服務(wù)框架RPC

2025-01-06 00:00:10

2025-08-26 04:00:00

2014-03-19 14:34:06

JQuery高性能

2025-06-12 02:22:00

Netflix前端系統(tǒng)

2023-05-08 18:33:55

ES數(shù)據(jù)搜索

2018-01-12 14:37:34

Java代碼實(shí)踐

2009-06-03 14:24:12

ibmdwWebSphere

2019-05-21 09:40:47

Elasticsear高性能 API

2024-09-02 18:10:20

2011-08-10 09:27:06

IBM超級(jí)計(jì)算機(jī)藍(lán)水

2024-09-25 16:10:05

2020-08-17 08:18:51

Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲电影第1页| 国产永久免费高清在线观看视频| 里番在线播放| 久久久久久久高潮| 亚洲国产成人精品视频| 国产精品视频免费在线观看| av无码一区二区三区| a级片免费观看| 欧美午夜精彩| 欧美日韩国产一区二区三区| 99精品国产一区二区| 你懂得在线观看| avav成人| 国产肉丝袜一区二区| 91极品女神在线| 欧美肉大捧一进一出免费视频| 最近中文字幕免费mv2018在线| 日韩成人精品在线| 亚洲欧洲视频在线| 日本精品www| 亚洲欧美日本在线观看| 亚洲区国产区| 精品欧美一区二区在线观看| 成年人视频大全| www.热久久| 激情综合网址| 亚洲国产精品视频在线观看| 少妇人妻在线视频| 日韩欧美在线番号| 老司机午夜精品视频| 国产一区二区黑人欧美xxxx| 成人性做爰aaa片免费看不忠| 国产主播福利在线| 成人免费不卡视频| 78m国产成人精品视频| 永久免费看黄网站| 8x国产一区二区三区精品推荐| 亚洲一区二区三区四区在线免费观看| 国产精品一区二区三区在线| 日韩三级视频在线播放| 亚洲视频分类| 欧美视频中文一区二区三区在线观看 | 国产精品国色综合久久| 中文字幕无码乱码人妻日韩精品| 国产欧美一区二区精品久久久| 91成人看片片| 宅男噜噜99国产精品观看免费| 国产深喉视频一区二区| 亚洲国产99| 九九热这里只有精品6| 亚洲激情 欧美| 91久久精品无嫩草影院| 亚洲综合激情小说| 蜜桃在线一区二区三区精品| 中文字幕手机在线视频| 99久久精品网| 精品国产自在久精品国产| 欧日韩免费视频| 外国精品视频在线观看 | 久久久在线视频| 免费看黄色aaaaaa 片| 电影一区电影二区| 91久久奴性调教| 成年在线观看视频| 九色在线播放| 国产夜色精品一区二区av| 免费中文日韩| 风间由美一区| 国产一区二区三区四区五区美女 | 日韩av黄色| 亚洲精品videosex极品| 免费成人在线观看av| 午夜视频在线播放| 久久久精品一品道一区| 91九色对白| 日韩精品一区二区亚洲av| 91精品国产成人观看| 亚洲精品一区二区三区不| 北条麻妃亚洲一区| 欧美成人精品一区二区男人小说| 一区二区三区四区五区视频在线观看 | 欧美丝袜在线观看| www视频在线观看| 中文字幕一区二区三区四区不卡 | 国产精品久久久久久久天堂| 无码人妻丰满熟妇区bbbbxxxx| 国产精品毛片一区二区在线看| 久久亚洲欧美日韩精品专区| 欧美 日韩 成人| 999久久精品| 亚洲国产另类 国产精品国产免费| 特大黑人巨人吊xxxx| 成人亚洲一区| 欧美激情伊人电影| 永久久久久久久| 欧州一区二区| 亚洲性夜色噜噜噜7777| 三级影片在线观看| 国产日韩亚洲| 久久久天堂国产精品女人| 无码人妻av免费一区二区三区 | √新版天堂资源在线资源| 成人av在线影院| 91精品综合久久久久久五月天| 天天干在线播放| 亚洲激情在线| 国产欧美日韩高清| 日本三级一区二区三区| 美女久久一区| 波多野结衣久草一区| 你懂的视频在线播放| 99视频精品在线| 精品乱码一区二区三区| 午夜视频www| 亚洲天堂a在线| 亚洲黄色网址在线观看| 九色porny在线| 亚洲黄色片在线观看| 日本精品一区二区三区四区| 在这里有精品| 久久精品在线视频| 国产黄色小视频网站| 亚欧美无遮挡hd高清在线视频| 91av免费观看91av精品在线| 国产成人精品一区二三区四区五区| 久久久www成人免费毛片麻豆| 18禁裸男晨勃露j毛免费观看 | 亚洲少妇中出一区| 激情内射人妻1区2区3区| 麻豆成人入口| 亚洲女同性videos| 一级特黄曰皮片视频| 日韩综合精品| 欧美精品免费在线观看| 久久久久亚洲av成人片| 国产精品女主播一区二区三区| 亚洲va欧美va国产综合剧情| 丰满少妇高潮在线观看| 99久久夜色精品国产网站| 久久天天东北熟女毛茸茸| 国产亚洲人成a在线v网站 | 国产精品一区二区久久精品| 日本大臀精品| 狠狠久久亚洲欧美专区| 给我免费观看片在线电影的| 一区二区亚洲| 99在线观看视频| 亚洲按摩av| 欧美日韩国产页| 91视频啊啊啊| 国产一区二区三区的电影 | a天堂视频在线观看| 伊人久久亚洲热| 国产精品久久久久久久小唯西川| 香蕉久久aⅴ一区二区三区| 欧美一区二区三级| 亚洲蜜桃精久久久久久久久久久久| 欧美久久视频| 日本韩国在线不卡| 国产成a人亚洲精v品无码| 亚洲男女一区二区三区| 蜜臀av无码一区二区三区| 成人av动漫| 欧美一级电影在线| 国产婷婷在线视频| 伊人色综合久久天天人手人婷| 老女人性生活视频| 成人免费在线播放| 国产精品无av码在线观看| 毛片在线播放a| 日韩欧美中文免费| 91视频免费入口| 影音先锋亚洲精品| 日本在线视频一区| av福利导福航大全在线| 在线免费视频一区二区| 亚洲精品视频网址| 国产一区二区不卡在线| 日本黄色片一级片| 亚洲一区有码| 伊人精品在线观看| 美女又爽又黄免费视频| 久久久精品tv| 国产欧美激情视频| 亚洲全部视频| 亚洲激情一区二区| 成人美女大片| 亚洲国产欧美久久| 国产成人无码专区| 亚洲精品国产精品乱码不99| 在线免费观看污视频| 免费人成在线不卡| 欧洲亚洲一区二区三区四区五区| 国产白浆在线免费观看| 亚洲偷熟乱区亚洲香蕉av| 国产精品伊人久久| 中文字幕欧美一区| 久久久久久蜜桃一区二区| 国产欧美日韩在线观看视频| 亚洲在线免费观看| 欧美男人天堂| 亚洲精品久久久久久久久久久久久| 日本久久综合网| 亚洲一区二区在线免费观看视频| 乐播av一区二区三区| 久久不射中文字幕| 人妻无码一区二区三区四区| 欧美影院三区| 精品久久sese| 日韩在线精品强乱中文字幕| 久久久精品国产亚洲| 天天av综合网| 91精品欧美综合在线观看最新| 一区二区三区在线播放视频| 91婷婷韩国欧美一区二区| 97国产精东麻豆人妻电影| 欧美午夜18电影| 57pao国产成人免费| 成人福利片网站| 日韩一级免费观看| 久久久久久福利| 日本一区二区三区在线不卡| 亚洲最大成人在线观看| 日韩在线综合| 欧美福利精品| 日韩经典一区| 77777亚洲午夜久久多人| 亚洲婷婷噜噜| 久久人人爽亚洲精品天堂| 国产精品99999| 日韩精品极品在线观看| av一级在线观看| 亚洲va在线va天堂| 成人性生交大免费看| 免费精品视频在线| 成人在线免费播放视频| 国产精品videosex性欧美| 欧美乱偷一区二区三区在线| 久久国产精品色av免费看| 国产v亚洲v天堂无码| xxxxxx欧美| 38少妇精品导航| 爱啪啪综合导航| 久久久久免费视频| 羞羞的视频在线观看| 久久亚洲精品网站| 黄色免费在线观看| zzijzzij亚洲日本成熟少妇| 成人高潮片免费视频| 91麻豆精品国产91久久久资源速度| 在线免费av网| 亚洲风情在线资源站| 免费一级全黄少妇性色生活片| 久久久午夜精品理论片中文字幕| 久久久久国产精品无码免费看| 99九九99九九九视频精品| 精品免费国产一区二区| 美女久久网站| 欧美性猛交久久久乱大交小说| 视频一区欧美日韩| 亚洲成人福利在线| 国产伦精品一区二区三区免费迷 | 亚洲人精选亚洲人成在线| 深夜福利视频一区| 亚洲性生活视频在线观看| 在线看的av网站| 美女精品久久久| 成人免费一区二区三区牛牛| 亚洲欧美激情另类校园| 国产精品一级伦理| 久久精品视频在线观看| 乱插在线www| 日本欧美中文字幕| 波多野结衣在线观看| 91av在线影院| 欧美91在线|欧美| 99爱精品视频| 丝袜连裤袜欧美激情日韩| 97夜夜澡人人双人人人喊| 2020最新国产精品| 青青草国产精品| 小小影院久久| 成人观看免费完整观看| 韩国欧美一区二区| 91网址在线播放| 国产精品亚洲欧美| 欧美wwwwwww| 福利视频网站一区二区三区| www.com污| 成人性生交大片免费看中文网站| 中日韩精品一区二区三区| 成a人片国产精品| 人与嘼交av免费| 亚洲精品精品亚洲| 精品国产乱子伦| 日韩一级片网站| 国产九色在线| 国内伊人久久久久久网站视频 | 国产三级国产精品国产国在线观看| 亚洲电影第三页| 一道本无吗一区| 日韩精品欧美国产精品忘忧草| 久草中文在线观看| 国产成人精品电影| 日韩精品极品| 成人a在线视频| 久久影视精品| 精品久久久三级| 久久久9色精品国产一区二区三区| 久久综合九色综合88i| 国产精品亚洲产品| 日日夜夜精品视频免费观看| 国产亚洲一本大道中文在线| 久久久久久欧美精品se一二三四| 欧美日韩一区精品| 国产精品久久久久久在线| 亚洲精品电影网在线观看| 国产日产一区二区| 国产精品久久久久久久久久尿| abab456成人免费网址| 国产伦精品一区二区三区免费视频| 97精品在线| 美女在线免费视频| 日韩高清不卡在线| 欧美熟妇一区二区| 亚洲va韩国va欧美va精品 | 精品视频在线播放| 日本h片在线| 99精彩视频| 亚洲欧美综合国产精品一区| 青青草视频在线视频| 国内精品国产成人| 午夜三级在线观看| 亚洲福利一区二区| www国产一区| 欧美另类在线观看| 久久av网站| 免费精品视频一区| 亚洲成人资源| 2一3sex性hd| 欧美日韩激情小视频| 少妇高潮一区二区三区99小说| 国产午夜一区二区| 免费福利视频一区二区三区| 欧美亚州在线观看| 日本成人在线视频网站| 曰本三级日本三级日本三级| 亚洲男人的天堂在线aⅴ视频| 99精品视频免费看| 欧美成人精品影院| 永久免费精品视频| 妞干网在线观看视频| 99久久伊人精品| 国内自拍视频在线播放| 国产一区二区三区在线视频| 国产极品久久久久久久久波多结野| 欧美在线播放一区| 免费成人在线视频观看| 看免费黄色录像| 精品国产免费人成在线观看| jizzjizz中国精品麻豆| 精品亚洲第一| 蜜臀久久久久久久| 综合五月激情网| 亚洲国产精品高清久久久| 制服丝袜专区在线| 亚洲专区中文字幕| 欧美涩涩网站| 人体私拍套图hdxxxx| 色综合婷婷久久| 懂色av一区二区三区四区| 91av在线影院| 日本不卡高清| 人妻av一区二区三区| 中文字幕一区二区三区精华液 | 亚洲中文一区二区| 精品国产拍在线观看| 中文字幕av一区二区三区四区| a√天堂在线观看| 国产精品三级视频| 久久亚洲精品石原莉奈| 日韩中文字幕国产精品| 亚洲天堂av资源在线观看| 欧美韩国日本在线| 国产精品久久久久桃色tv| 亚洲精品成av人片天堂无码| 久久亚洲精品视频| 日韩超碰人人爽人人做人人添| 三级在线免费看| 亚洲一区二区在线免费观看视频| 国产福利小视频在线观看| 5g国产欧美日韩视频| 久久aⅴ国产紧身牛仔裤| 国产精品白丝喷水在线观看| 亚洲精品一区二区三区不| 国产欧美88| 性生活免费观看视频| 91丨porny丨蝌蚪视频| 国产精品日韩无码| 日本精品免费观看|