精品熟女后入一区二区三区,色偷偷中文字幕一区二区,本庄优花人妻一区二区三区,青青青爽不卡一区二区,大黑鸡巴操逼内射委内瑞拉妓女,内射歐美日老阿姨老,julia在线观看中文字幕,欧美卡一卡二卡三卡四,青青草99国产视频

跟著源碼學(xué)IM(十一):一套基于Netty的分布式高可用IM詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)(有源碼)

  • 發(fā)表于: 2023-06-08 15:09:03 來源:博客園

本文由will分享,個(gè)人博客zhangyaoo.github.io,原題“基于Netty的IM系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)”,有修訂和重新排版。

1、引言

本文將要分享的是如何從零實(shí)現(xiàn)一套基于Netty框架的分布式高可用IM系統(tǒng),它將支持長連接網(wǎng)關(guān)管理、單聊、群聊、聊天記錄查詢、離線消息存儲(chǔ)、消息推送、心跳、分布式唯一ID、紅包、消息同步等功能,并且還支持集群部署。

本文中針對(duì)這套架構(gòu)和系統(tǒng)設(shè)計(jì),同時(shí)還會(huì)提供完整的源碼,比較適合有一定Java開發(fā)能力和Netty知識(shí)的IM初學(xué)者。


(相關(guān)資料圖)

*友情提示:如果你對(duì)IM即時(shí)通訊的基礎(chǔ)技術(shù)理論了解的太少,建議可以先讀:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM》。

技術(shù)交流:

- 移動(dòng)端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動(dòng)端IM》

- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK(備用地址點(diǎn)此)

(本文已同步發(fā)布于:http://www.52im.net/thread-4257-1-1.html)

2、配套源碼

本文配套源碼的開源托管地址是:

  • 1)主地址:https://github.com/zhangyaoo/fastim
  • 2)備地址:https://github.com/52im/fastim2023

如果你訪問Github太慢,可直接從以下附件打包下載:

fastim-master(52im.net).zip(1.12 MB, 下載次數(shù):5, 售價(jià):1金幣)

完整源碼的目錄結(jié)構(gòu),如下圖:

3、知識(shí)準(zhǔn)備

關(guān)于 Netty 是什么,這里簡單介紹下:

Netty 是一個(gè) Java 開源框架。Netty 提供異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò)服務(wù)器和客戶端程序。

也就是說,Netty 是一個(gè)基于 NIO 的客戶、服務(wù)器端編程框架,使用Netty 可以確保你快速和簡單的開發(fā)出一個(gè)網(wǎng)絡(luò)應(yīng)用,例如實(shí)現(xiàn)了某種協(xié)議的客戶,服務(wù)端應(yīng)用。

Netty 相當(dāng)簡化和流線化了網(wǎng)絡(luò)應(yīng)用的編程開發(fā)過程,例如,TCP 和 UDP 的 Socket 服務(wù)開發(fā)。

有關(guān)Netty的入門文章:

1)新手入門:目前為止最透徹的的Netty高性能原理和框架架構(gòu)解析

2)寫給初學(xué)者:Java高性能NIO框架Netty的學(xué)習(xí)方法和進(jìn)階策略

3)史上最通俗Netty框架入門長文:基本介紹、環(huán)境搭建、動(dòng)手實(shí)戰(zhàn)

如果你連Java NIO都不知道,下面的文章建議優(yōu)先讀:

  • 1)少啰嗦!一分鐘帶你讀懂Java的NIO和經(jīng)典IO的區(qū)別
  • 2)史上最強(qiáng)Java NIO入門:擔(dān)心從入門到放棄的,請(qǐng)讀這篇!
  • 3)Java的BIO和NIO很難懂?用代碼實(shí)踐給你看,再不懂我轉(zhuǎn)行!

Netty源碼和API 在線查閱地址:

  • 1)Netty-4.1.x 完整源碼(在線閱讀版)
  • 2)Netty-4.1.x API文檔(在線版)

4、整體架構(gòu)設(shè)計(jì)概覽

本次的IM系統(tǒng)設(shè)計(jì)主要基于可擴(kuò)展性高可用原則,把網(wǎng)關(guān)層、邏輯層、數(shù)據(jù)層進(jìn)行了分離,并且還要支持分布式部署。

以下是整體系統(tǒng)的架構(gòu)設(shè)計(jì)概覽圖:

下面將針對(duì)整體架構(gòu)來逐一分享設(shè)計(jì)的主要思路等。

5、整體架構(gòu)設(shè)計(jì)之客戶端設(shè)計(jì)

5.1客戶端設(shè)計(jì)

客戶端的設(shè)計(jì)主要從以下幾點(diǎn)出發(fā):

  • 1)client每個(gè)設(shè)備會(huì)在本地存每一個(gè)會(huì)話,保留有最新一條消息的順序 ID;
  • 2)為了避免client宕機(jī),也就是退出應(yīng)用,保存在內(nèi)存的消息ID丟失,會(huì)存到本地的文件中;
  • 3)client需要在本地維護(hù)一個(gè)等待ack隊(duì)列,并配合timer超時(shí)機(jī)制,來記錄哪些消息沒有收到ack:N,以定時(shí)重發(fā);
  • 4)客戶端本地生成一個(gè)遞增序列號(hào)發(fā)送給服務(wù)器,用作保證發(fā)送順序性。該序列號(hào)還用作ack隊(duì)列收消息時(shí)候的移除。

5.2客戶端序列號(hào)設(shè)計(jì)

1)方案一:

設(shè)計(jì)思路:

  • 1)數(shù)據(jù)傳輸中的大小盡量小用int,不用bigint,節(jié)省傳輸大??;
  • 2)只保證遞增即可,在用戶重新登錄或者重連后可以進(jìn)行日期重置,只保證單次;
  • 3)客戶端發(fā)號(hào)器不需要像類似服務(wù)器端發(fā)號(hào)器那樣集群部署,不需要考慮集群同步問題。

注:上述生成器可以用18年[(2^29-1)/3600/24/365]左右,一秒內(nèi)最多產(chǎn)生4個(gè)消息。

優(yōu)點(diǎn):可以在斷線重連和重裝APP的情況下,18年之內(nèi)是有序的。

缺點(diǎn):每秒只能發(fā)4個(gè)消息,限制太大,對(duì)于群發(fā)場(chǎng)景不合適。

改進(jìn):使用long進(jìn)行傳輸,年限擴(kuò)展很久并且有序。

2)方案二:

設(shè)計(jì)思路:

  • 1)每次重新建立鏈接后進(jìn)行重置,將sequence_id(int表示)從0開始進(jìn)行嚴(yán)格遞增;
  • 2)客戶端發(fā)送消息會(huì)帶上唯一的遞增sequence_id,同一條消息重復(fù)投遞的sequence_id是一樣的;
  • 3)后端存儲(chǔ)每個(gè)用戶的sequence_id,當(dāng)sequence_id歸0,用戶的epoch年代加1存儲(chǔ)入庫,單聊場(chǎng)景下轉(zhuǎn)發(fā)給接收者時(shí)候,接收者按照sequence_id和epoch來進(jìn)行排序。

優(yōu)點(diǎn):可以在斷線重連和重裝APP的情況下,接收者可以按照發(fā)送者發(fā)送時(shí)序來顯示,并且對(duì)發(fā)送消息的速率沒限制。

6、整體架構(gòu)設(shè)計(jì)之LSB設(shè)計(jì)

6.1思路

IM接入層的高可用、負(fù)載均衡、擴(kuò)展性全部在這里面做??蛻舳送ㄟ^LSB,來獲取gate IP地址,通過IP直連。

這樣做的目的是:

  • 1)靈活的負(fù)載均衡策略 可根據(jù)最少連接數(shù)來分配IP;
  • 2)做灰度策略來分配IP;
  • 3)AppId業(yè)務(wù)隔離策略 不同業(yè)務(wù)連接不同的gate,防止相互影響;
  • 4)單聊和群聊的im接入層通道分開。

6.2優(yōu)化

上述設(shè)計(jì)存在一個(gè)問題:就是當(dāng)某個(gè)實(shí)例重啟后,該實(shí)例的連接斷開后,客戶端會(huì)發(fā)起重連,重連就大概率轉(zhuǎn)移其他實(shí)例上,導(dǎo)致最近啟動(dòng)的實(shí)例連接數(shù)較少,最早啟動(dòng)的實(shí)例連接數(shù)較多。

解決方法:

  • 1)客戶端會(huì)發(fā)起重連,跟服務(wù)器申請(qǐng)重連的新的服務(wù)器IP,系統(tǒng)提供合適的算法來平攤gate層的壓力,防止雪崩效應(yīng);
  • 2)gate層定時(shí)上報(bào)本機(jī)的元數(shù)據(jù)信息以及連接數(shù)信息,提供給LSB中心,LSB根據(jù)最少連接數(shù)負(fù)載均衡實(shí)現(xiàn),來計(jì)算一個(gè)節(jié)點(diǎn)供連接。

7、整體架構(gòu)設(shè)計(jì)之GATE層網(wǎng)關(guān)設(shè)計(jì)

GATE層網(wǎng)關(guān)設(shè)計(jì)主要遵從以下幾點(diǎn):

  • 1)任何一個(gè)gate網(wǎng)關(guān)斷掉,用戶端檢測(cè)到以后重新連接LSB服務(wù)獲取另一個(gè)gate網(wǎng)關(guān)IP,拿到IP重新進(jìn)行長連接通信(對(duì)整體服務(wù)可靠性基本沒有影響);
  • 2)gate可以無狀態(tài)的橫向部署,來擴(kuò)展接入層的接入能力;
  • 3)根據(jù)協(xié)議分類將入口請(qǐng)求打到不同的網(wǎng)關(guān)上去,HTTP網(wǎng)關(guān)接收HTTP請(qǐng)求,TCP網(wǎng)關(guān)接收tcp長連接請(qǐng)求;
  • 4)長連接網(wǎng)關(guān),提供各種監(jiān)控功能,比如網(wǎng)關(guān)執(zhí)行線程數(shù)、隊(duì)列任務(wù)數(shù)、ByteBuf使用堆內(nèi)存數(shù)、堆外內(nèi)存數(shù)、消息上行和下行的數(shù)量以及時(shí)間。

8、整體架構(gòu)設(shè)計(jì)之LOGIC和路由SDK設(shè)計(jì)

logic按照分布式微服務(wù)的拆分思想進(jìn)行拆分,拆分為多個(gè)模塊,集群部署。

主要包括:

  • 1)消息服務(wù);
  • 2)紅包服務(wù);
  • 3)其他服務(wù)。

消息logic服務(wù)集成路由客戶端的SDK,SDK職責(zé)主要是:

  • 1)負(fù)責(zé)和網(wǎng)關(guān)底層通信交互;
  • 2)負(fù)責(zé)網(wǎng)關(guān)服務(wù)尋址;
  • 3)負(fù)責(zé)存儲(chǔ)uid和gate層機(jī)器ID關(guān)系(有狀態(tài):多級(jí)緩存避免和中間件多次交互。無狀態(tài):在業(yè)務(wù)初期可以不用存);
  • 4)配合網(wǎng)關(guān)負(fù)責(zé)路由信息一致性保證。

針對(duì)上述第4)點(diǎn):

  • 1)如果路由狀態(tài)和channel通道不一致,比如有路由狀態(tài),沒有channel通道(已關(guān)閉)那么,就會(huì)走離線消息流出,并且清除路由信息;
  • 2)動(dòng)態(tài)重啟gate,會(huì)及時(shí)清理路由信息。

SDK和網(wǎng)關(guān)底層通信設(shè)計(jì):

如上圖所示:網(wǎng)關(guān)層到服務(wù)層,只需要單向傳輸發(fā)請(qǐng)求,網(wǎng)關(guān)層不需要關(guān)心調(diào)用的結(jié)果。而客戶端想要的ack或者notify請(qǐng)求是由SDK發(fā)送數(shù)據(jù)到網(wǎng)關(guān)層,SDK也不需要關(guān)心調(diào)用的結(jié)果,最后網(wǎng)關(guān)層只轉(zhuǎn)發(fā)數(shù)據(jù),不做額外的邏輯處理。

SDK和所有的網(wǎng)關(guān)進(jìn)行長連接,當(dāng)發(fā)送信息給客戶端時(shí),根據(jù)路由尋址信息,即可通過長連接推送信息。

9、通信協(xié)議設(shè)計(jì)

9.1目標(biāo)

通信協(xié)議設(shè)計(jì)的主要目標(biāo)是:

  • 1)高性能:協(xié)議設(shè)計(jì)緊湊,保證數(shù)據(jù)包小,并且序列化性能好;
  • 2)可擴(kuò)展:針對(duì)后續(xù)業(yè)務(wù)發(fā)展,可以自由的自定義協(xié)議,無需較大改動(dòng)協(xié)議結(jié)構(gòu)。

9.2設(shè)計(jì)

IM協(xié)議采用二進(jìn)制定長包頭和變長包體來實(shí)現(xiàn)客戶端和服務(wù)端的通信,并且采用谷歌protobuf序列化協(xié)議。

設(shè)計(jì)如下:

各個(gè)字段解釋如下:

  • 1)headData:頭部標(biāo)識(shí),協(xié)議頭標(biāo)識(shí),用作粘包半包處理。4個(gè)字節(jié);
  • 2)version:客戶端版本。4個(gè)字節(jié);
  • 3)cmd:業(yè)務(wù)命令,比如心跳、推送、單聊、群聊。1個(gè)字節(jié);
  • 4)msgType:消息通知類型 request response notify。1個(gè)字節(jié);
  • 5)logId:調(diào)試性日志,追溯一個(gè)請(qǐng)求的全路徑。4個(gè)字節(jié);
  • 6)sequenceId:序列號(hào),可以用作異步處理。4個(gè)字節(jié);
  • 7)dataLength:數(shù)據(jù)體的長度。4個(gè)字節(jié);
  • 8)data:數(shù)據(jù)。

PS:如果你對(duì)Protobuf不了解,建議詳讀以下系列文章:

1.《強(qiáng)列建議將Protobuf作為你的即時(shí)通訊應(yīng)用數(shù)據(jù)傳輸格式》

2.《IM通訊協(xié)議專題學(xué)習(xí)(一):Protobuf從入門到精通,一篇就夠!》

3.《IM通訊協(xié)議專題學(xué)習(xí)(二):快速理解Protobuf的背景、原理、使用、優(yōu)缺點(diǎn)》

4.《IM通訊協(xié)議專題學(xué)習(xí)(三):由淺入深,從根上理解Protobuf的編解碼原理》

5.《IM通訊協(xié)議專題學(xué)習(xí)(四):從Base64到Protobuf,詳解Protobuf的數(shù)據(jù)編碼原理》

6.《IM通訊協(xié)議專題學(xué)習(xí)(五):Protobuf到底比JSON快幾倍?全方位實(shí)測(cè)!》

7.《IM通訊協(xié)議專題學(xué)習(xí)(六):手把手教你如何在Android上從零使用Protobuf》

8.《IM通訊協(xié)議專題學(xué)習(xí)(七):手把手教你如何在NodeJS中從零使用Protobuf》

9.《IM通訊協(xié)議專題學(xué)習(xí)(八):金蝶隨手記團(tuán)隊(duì)的Protobuf應(yīng)用實(shí)踐(原理篇)》

10.《IM通訊協(xié)議專題學(xué)習(xí)(九):手把手教你如何在iOS上從零使用Protobuf》

9.3實(shí)踐

針對(duì)數(shù)據(jù)data,網(wǎng)關(guān)gate層不做反序列化,反序列化步驟在service做,避免重復(fù)序列化和反序列化導(dǎo)致的性能損失。

網(wǎng)關(guān)層不做業(yè)務(wù)邏輯處理,只做消息轉(zhuǎn)發(fā)和推送,減少網(wǎng)關(guān)層的復(fù)雜度。

10、安全設(shè)計(jì)

為防止消息傳輸過程中不被截獲、篡改、偽造,采用TLS傳輸層加密協(xié)議(可參考《微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解》)。

私有化協(xié)議天然具備一定的防竊取和防篡改的能力,相對(duì)于使用JSON、XML、HTML等明文傳輸系統(tǒng),被第三方截獲后在內(nèi)容破解上相對(duì)成本更高,因此安全性上會(huì)更好一些。

消息存儲(chǔ)安全性:將針對(duì)賬號(hào)密碼的存儲(chǔ)安全可以通過“高強(qiáng)度單向散列算法”和“加鹽”機(jī)制來提升加密密碼可逆性;IM消息采用“端到端加密”方式來提供更加安全的消息傳輸保護(hù)。

安全層協(xié)議設(shè)計(jì):基于動(dòng)態(tài)密鑰,借鑒類似SSL,不需要用證書來管理(可參考《探討組合加密算法在IM中的應(yīng)用》)。

11、消息投遞設(shè)計(jì)

11.1概述

一個(gè)正常的消息流轉(zhuǎn)需要如下圖所示的流程:

如上圖所示:

  • 1)客戶端A發(fā)送請(qǐng)求包R;
  • 2)server將消息存儲(chǔ)到DB;
  • 3)存儲(chǔ)成功后返回確認(rèn)ack;
  • 4)server push消息給客戶端B;
  • 5)客戶端B收到消息后返回確認(rèn)ack;
  • 6)server收到ack后更新消息的狀態(tài)或者刪除消息。

需要考慮的是:一個(gè)健壯的IM系統(tǒng)需要考慮各種異常情況,比如丟消息,重復(fù)消息,消息時(shí)序問題。

11.2消息可靠性如何保證(不丟消息)

我的設(shè)計(jì)和實(shí)現(xiàn)思路是這樣的:

  • 1)應(yīng)用層ACK;
  • 2)客戶端需要超時(shí)與重傳;
  • 3)服務(wù)端需要超時(shí)與重傳,具體做法就是增加ack隊(duì)列和定時(shí)器Timer;
  • 4)業(yè)務(wù)側(cè)兜底保證,客戶端拉消息通過一個(gè)本地的舊的序列號(hào)來拉取服務(wù)器的最新消息;
  • 5)為了保證消息必達(dá),在線客戶端還增加一個(gè)定時(shí)器,定時(shí)向服務(wù)端拉取消息,避免服務(wù)端向客戶端發(fā)送拉取通知的包丟失導(dǎo)致客戶端未及時(shí)拉取數(shù)據(jù)。

相關(guān)資料可參考:

1.《從客戶端的角度來談?wù)勔苿?dòng)端IM的消息可靠性和送達(dá)機(jī)制》

2.《IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(一):保證在線實(shí)時(shí)消息的可靠投遞》

3.《IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(二):保證離線消息的可靠投遞》

4.《IM開發(fā)干貨分享:如何優(yōu)雅的實(shí)現(xiàn)大量離線消息的可靠投遞》

5.《理解IM消息“可靠性”和“一致性”問題,以及解決方案探討》

6.《融云技術(shù)分享:全面揭秘億級(jí)IM消息的可靠投遞機(jī)制》

11.3消息重復(fù)性如何保證(不重復(fù))

超時(shí)與重傳機(jī)制將導(dǎo)致接收的client收到重復(fù)的消息,具體做法就是一份消息使用同一個(gè)消息ID進(jìn)行去重處理。

相關(guān)資料可參考:

1.《IM群聊消息如此復(fù)雜,如何保證不丟不重?》

2.《完全自已開發(fā)的IM該如何設(shè)計(jì)“失敗重試”機(jī)制?》

11.4消息順序性如何保證(不亂序)

消息亂序影響的因素:

  • 1)時(shí)鐘不一致,分布式環(huán)境下每個(gè)機(jī)器的時(shí)間可能是不一致的;
  • 2)多發(fā)送方和多接收方,這種情況下,無法保先發(fā)的消息被先收到;
  • 3)網(wǎng)絡(luò)傳輸和多線程,網(wǎng)絡(luò)傳輸不穩(wěn)定的話可能導(dǎo)致包在數(shù)據(jù)傳輸過程中有的慢有的快。多線程也可能是會(huì)導(dǎo)致時(shí)序不一致影響的因素。

以上:如果保持絕對(duì)的實(shí)現(xiàn),那么只能是一個(gè)發(fā)送方,一個(gè)接收方,一個(gè)線程阻塞式通訊來實(shí)現(xiàn)。那么性能會(huì)降低。

1)如何保證時(shí)序:

單聊:通過發(fā)送方的絕對(duì)時(shí)序seq,來作為接收方的展現(xiàn)時(shí)序seq。

實(shí)現(xiàn)方式:可以通過時(shí)間戳或者本地序列號(hào)方式來實(shí)現(xiàn)

缺點(diǎn):本地時(shí)間戳不準(zhǔn)確或者本地序列號(hào)在意外情況下可能會(huì)清0,都會(huì)導(dǎo)致發(fā)送方的絕對(duì)時(shí)序不準(zhǔn)確

群聊:因?yàn)榘l(fā)送方多點(diǎn)發(fā)送時(shí)序不一致,所以通過服務(wù)器的單點(diǎn)做序列化,也就是通過ID遞增發(fā)號(hào)器服務(wù)來生成seq,接收方通過seq來進(jìn)行展現(xiàn)時(shí)序。

實(shí)現(xiàn)方式:通過服務(wù)端統(tǒng)一生成唯一趨勢(shì)遞增消息ID來實(shí)現(xiàn)或者通過redis的遞增incr來實(shí)現(xiàn)。

缺點(diǎn):redis的遞增incr來實(shí)現(xiàn),redis取號(hào)都是從主取的,會(huì)有性能瓶頸。ID遞增發(fā)號(hào)器服務(wù)是集群部署,可能不同發(fā)號(hào)服務(wù)上的集群時(shí)間戳不同,可能會(huì)導(dǎo)致后到的消息seq還小。

群聊時(shí)序的優(yōu)化:按照上面的群聊處理,業(yè)務(wù)上按照道理只需要保證單個(gè)群的時(shí)序,不需要保證所有群的絕對(duì)時(shí)序,所以解決思路就是同一個(gè)群的消息落到同一個(gè)發(fā)號(hào)service上面,消息seq通過service本地生成即可。

2)客戶端如何保證順序:

為什么要保證順序?因?yàn)橄⒓词拱凑枕樞虻竭_(dá)服務(wù)器端,也會(huì)可能出現(xiàn):不同消息到達(dá)接收端后,可能會(huì)出現(xiàn)“先產(chǎn)生的消息后到”“后產(chǎn)生的消息先到”等問題。所以客戶端需要進(jìn)行兜底的流量整形機(jī)制

如何保證順序?可以在接收方收到消息后進(jìn)行判定,如果當(dāng)前消息序號(hào)大于前一條消息的序號(hào)就將當(dāng)前消息追加在會(huì)話里。否則繼續(xù)往前查找倒數(shù)第二條、第三條等消息,一直查找到恰好小于當(dāng)前推送消息的那條消息,然后插入在其后展示。

相關(guān)資料可參考:

《零基礎(chǔ)IM開發(fā)入門(四):什么是IM系統(tǒng)的消息時(shí)序一致性?》

《一套億級(jí)用戶的IM架構(gòu)技術(shù)干貨(下篇):可靠性、有序性、弱網(wǎng)優(yōu)化等》

《如何保證IM實(shí)時(shí)消息的“時(shí)序性”與“一致性”?》

《一個(gè)低成本確保IM消息時(shí)序的方法探討》

12、消息通知設(shè)計(jì)

12.1概述

整體消息推送和拉取的時(shí)序圖如下:

12.2消息拉取方式的選擇

本系統(tǒng)是通過推拉結(jié)合來進(jìn)行服務(wù)器端消息的推送和客戶端的拉取。我們知道單pull和單push有以下缺點(diǎn)。

對(duì)于單pull:

  • 1)pull要考慮到消息的實(shí)時(shí)性,不知道消息何時(shí)送達(dá);
  • 2)pull要考慮到哪些好友和群收到了消息,要循環(huán)每個(gè)群和好友拿到消息列表,讀擴(kuò)散。

對(duì)于單push:

  • 1)push實(shí)時(shí)性高,只要將消息推送給接收者就ok,但是會(huì)集中消耗服務(wù)器資源;
  • 2)并且再群聊非常多、聊天頻率非常高的情況下,會(huì)增加客戶端和服務(wù)端的網(wǎng)絡(luò)交互次數(shù)。

對(duì)于推拉結(jié)合:

  • 1)推拉結(jié)合的方式能夠分?jǐn)偡?wù)端的壓力,能保證時(shí)效性,又能保證性能;
  • 2)具體做法就是有新消息時(shí)候,推送哪個(gè)好友或者哪個(gè)群有新消息,以及新消息的數(shù)量或者最新消息ID,客戶端按需根據(jù)自身數(shù)據(jù)進(jìn)行拉取。

12.3推拉隔離設(shè)計(jì)

為什么做隔離?

如果客戶端一邊正在拉取數(shù)據(jù),一邊有新的增量消息push過來。

如何做隔離?

本地設(shè)置一個(gè)全局的狀態(tài),當(dāng)客戶端拉取完離線消息后設(shè)置狀態(tài)為1(表示離線消息拉取完畢)。當(dāng)客戶端收到拉取實(shí)時(shí)消息,會(huì)啟用一個(gè)輪詢監(jiān)聽這個(gè)狀態(tài),狀態(tài)為1后,再去向服務(wù)器拉取消息。

如果是push消息過來(不是主動(dòng)拉?。敲磿?huì)先將消息存儲(chǔ)到本地的消息隊(duì)列中,等待客戶端上一次拉取數(shù)據(jù)完畢,然后將數(shù)據(jù)進(jìn)行合并即可。

相關(guān)資料可參考:

《阿里IM技術(shù)分享(六):閑魚億級(jí)IM消息系統(tǒng)的離線推送到達(dá)率優(yōu)化》

《阿里IM技術(shù)分享(七):閑魚IM的在線、離線聊天數(shù)據(jù)同步機(jī)制優(yōu)化實(shí)踐》

13、消息ID生成設(shè)計(jì)

以下是我設(shè)計(jì)的場(chǎng)景:

  • 1)單機(jī)高峰并發(fā)量小于1W,預(yù)計(jì)未來5年單機(jī)高峰并發(fā)量小于10W;
  • 2)有2個(gè)機(jī)房,預(yù)計(jì)未來5年機(jī)房數(shù)量小于4個(gè) 每個(gè)機(jī)房機(jī)器數(shù)小于150臺(tái);
  • 3)目前只有單聊和群聊兩個(gè)業(yè)務(wù)線,后續(xù)可以擴(kuò)展為系統(tǒng)消息、聊天室、客服等業(yè)務(wù)線,最多8個(gè)業(yè)務(wù)線。

根據(jù)以上業(yè)務(wù)情況,來設(shè)計(jì)分布式ID:

優(yōu)點(diǎn):

  • 1)不同機(jī)房不同機(jī)器不同業(yè)務(wù)線內(nèi)生成的ID互不相同;
  • 2)每個(gè)機(jī)器的每毫秒內(nèi)生成的ID不同;
  • 3)預(yù)留兩位留作擴(kuò)展位。

缺點(diǎn):當(dāng)并發(fā)度不高的時(shí)候,時(shí)間跨毫秒的消息,區(qū)分不出來消息的先后順序。因?yàn)闀r(shí)間跨毫秒的消息生成的ID后面的最后一位都是0,后續(xù)如果按照消息ID維度進(jìn)行分庫分表,會(huì)導(dǎo)致數(shù)據(jù)傾斜。

兩種解決方案:

  • 1)方案一:去掉snowflake最后8位,然后對(duì)剩余的位進(jìn)行取模;
  • 2)方案二:不同毫秒的計(jì)數(shù),每次不是歸0,而是歸為隨機(jī)數(shù),相比方案一,比較簡單實(shí)用。

相關(guān)資料可參考:

《微信的海量IM聊天消息序列號(hào)生成實(shí)踐(算法原理篇)》

《微信的海量IM聊天消息序列號(hào)生成實(shí)踐(容災(zāi)方案篇)》

《解密融云IM產(chǎn)品的聊天消息ID生成策略》

《深度解密美團(tuán)的分布式ID生成算法》

《開源分布式ID生成器UidGenerator的技術(shù)實(shí)現(xiàn)》

《深度解密滴滴的高性能ID生成器(Tinyid)》

14、消息未讀數(shù)設(shè)計(jì)

14.1基本

實(shí)現(xiàn)思路大致如下:

  • 1)每發(fā)一個(gè)消息,消息接收者的會(huì)話未讀數(shù)+1,并且接收者所有未讀數(shù)+1;
  • 2)消息接收者返回消息接收確認(rèn)ack后,消息未讀數(shù)會(huì)-1;
  • 3)消息接收者的未讀數(shù)+1,服務(wù)端就會(huì)推算有多少條未讀數(shù)的通知。

分布式鎖保證總未讀數(shù)和會(huì)話未讀數(shù)一致:

  • 1)原因:當(dāng)總未讀數(shù)增加,這個(gè)時(shí)候客戶端來了請(qǐng)求將未知數(shù)置0,然后再增加會(huì)話未讀數(shù),那么會(huì)導(dǎo)致不一致;
  • 2)保證:為了保證總未讀數(shù)和會(huì)話未讀數(shù)原子性,需要用分布式鎖來保證。

14.2群聊消息未讀數(shù)的難點(diǎn)和優(yōu)化思路

對(duì)于群聊來說,消息未讀數(shù)的技術(shù)難點(diǎn)主要是:一個(gè)群聊每秒幾百的并發(fā)聊天,比如消息未讀數(shù),相當(dāng)于每秒W級(jí)別的寫入redis,即便redis做了集群數(shù)據(jù)分片+主從,但是寫入還是單節(jié)點(diǎn),會(huì)有寫入瓶頸。

我的優(yōu)化思路是:按群ID分組或者用戶ID分組,批量寫入,寫入的兩種方式:定時(shí)flush和滿多少消息進(jìn)行flush。

15、網(wǎng)關(guān)設(shè)計(jì)

15.1概述

本套IM系統(tǒng)在設(shè)計(jì)時(shí),將網(wǎng)關(guān)分為了接入層網(wǎng)關(guān)和應(yīng)用層網(wǎng)關(guān)兩種。

  • 接入層網(wǎng)關(guān)和應(yīng)用層網(wǎng)關(guān)區(qū)別主要是:
  • 1)接入層網(wǎng)關(guān)需要有接收通知包或者下行接收數(shù)據(jù)的端口,并且需要另外開啟線程池。應(yīng)用層網(wǎng)關(guān)不需要開端口,并且不需要開啟線程池;
  • 2)接入層網(wǎng)關(guān)需要保持長連接,接入層網(wǎng)關(guān)需要本地緩存channel映射關(guān)系。應(yīng)用層網(wǎng)關(guān)無狀態(tài)不需要保存。

15.2接入層網(wǎng)關(guān)設(shè)計(jì)

我的設(shè)計(jì)目標(biāo)是:

  • 1)網(wǎng)關(guān)的線程池實(shí)現(xiàn)1+8+4+1,減少線程切換;
  • 2)集中實(shí)現(xiàn)長連接管理和推送能力;
  • 3)與業(yè)務(wù)服務(wù)器解耦,集群部署縮容擴(kuò)容以及重啟升級(jí)不相互影響;
  • 4)長連接的監(jiān)控與報(bào)警能力;
  • 5)客戶端重連指令一鍵實(shí)現(xiàn)。

主要技術(shù)要點(diǎn):

  • 1)支持自定義協(xié)議以及序列化;
  • 2)支持websocket協(xié)議;
  • 3)通道連接自定義?;钜约靶奶鴻z測(cè);
  • 4)本地緩存channel;
  • 5)責(zé)任鏈;
  • 6)服務(wù)調(diào)用完全異步;
  • 7)泛化調(diào)用;
  • 8)轉(zhuǎn)發(fā)通知包或者Push包;
  • 9)容錯(cuò)網(wǎng)關(guān)down機(jī)處理。

設(shè)計(jì)方案(一個(gè)Notify包的數(shù)據(jù)經(jīng)網(wǎng)關(guān)的線程模型圖):

15.3應(yīng)用層API網(wǎng)關(guān)設(shè)計(jì)

我的設(shè)計(jì)目標(biāo)是:

  • 1)基于版本的自動(dòng)發(fā)現(xiàn)以及灰度/擴(kuò)容 ,不需要關(guān)注IP;
  • 2)網(wǎng)關(guān)的線程池實(shí)現(xiàn)1+8+1,減少線程切換;
  • 3)支持協(xié)議轉(zhuǎn)換實(shí)現(xiàn)多個(gè)協(xié)議轉(zhuǎn)換,基于SPI來實(shí)現(xiàn);
  • 4)與業(yè)務(wù)服務(wù)器解耦,集群部署縮容擴(kuò)容以及重啟升級(jí)不相互影響;
  • 5)接口錯(cuò)誤信息統(tǒng)計(jì)和RT時(shí)間的監(jiān)控和報(bào)警能力;
  • 6)UI界面實(shí)現(xiàn)路由算法,服務(wù)接口版本管理,灰度策略管理以及接口和服務(wù)信息展示能力;
  • 7)基于OpenAPI提供接口級(jí)別的自動(dòng)生成文檔的功能。

主要技術(shù)要點(diǎn):

  • 1)Http2.0;
  • 2)channel連接池復(fù)用;
  • 3)Netty http 服務(wù)端編解碼;
  • 4)責(zé)任鏈;
  • 5)服務(wù)調(diào)用完全異步;
  • 6)全鏈路超時(shí)機(jī)制;
  • 7)泛化調(diào)用。

設(shè)計(jì)方案(一個(gè)請(qǐng)求包的數(shù)據(jù)經(jīng)網(wǎng)關(guān)的架構(gòu)圖):

16、高并發(fā)設(shè)計(jì)

16.1架構(gòu)優(yōu)化

主要從以下幾個(gè)方面入手:

  • 1)水平擴(kuò)展:各個(gè)模塊無狀態(tài)部署;
  • 2)線程模型:每個(gè)服務(wù)底層線程模型遵從Netty主從reactor模型;
  • 3)多層緩存:Gate層二級(jí)緩存,Redis一級(jí)緩存;
  • 4)長連接:客戶端長連接保持,避免頻繁創(chuàng)建連接消耗。

16.2萬人群聊優(yōu)化

技術(shù)難點(diǎn)主要是:消息扇出大,比如每秒群聊有50條消息,群聊2000人,那么光一個(gè)群對(duì)系統(tǒng)并發(fā)就有10W的消息扇出。

優(yōu)化思路:

  • 1)批量ACK:每條群消息都ACK,會(huì)給服務(wù)器造成巨大的沖擊,為了減少ACK請(qǐng)求量,參考TCP的Delay ACK機(jī)制,在接收方層面進(jìn)行批量ACK;
  • 2)群消息和成員批量加載以及懶加載:在真正進(jìn)入一個(gè)群時(shí)才實(shí)時(shí)拉取群友的數(shù)據(jù);
  • 3)群離線消息過多:群消息分頁拉取,第二次拉取請(qǐng)求作為第一次拉取請(qǐng)求的ack;
  • 4)對(duì)于消息未讀數(shù)場(chǎng)景,每個(gè)用戶維護(hù)一個(gè)全局的未讀數(shù)和每個(gè)會(huì)話的未讀數(shù),當(dāng)群聊非常大時(shí),未讀資源變更的QPS非常大。這個(gè)時(shí)候應(yīng)用層對(duì)未讀數(shù)進(jìn)行緩存,批量寫+定時(shí)寫來保證未讀計(jì)數(shù)的寫入性能;
  • 5)路由信息存入redis會(huì)有寫入和讀取的性能瓶頸,每條消息在發(fā)出的時(shí)候會(huì)查路由信息來發(fā)送對(duì)應(yīng)的gate接入層,比如有10個(gè)群,每個(gè)群1W,那么1s100條消息,那么1000W的查詢會(huì)打滿redis,即使redis做了集群。優(yōu)化的思路就是將集中的路由信息分散到msg層 JVM本地內(nèi)存中,然后做Route可用,避免單點(diǎn)故障;
  • 6)存儲(chǔ)的優(yōu)化:擴(kuò)散寫寫入并發(fā)量巨大,另一方面也存在存儲(chǔ)浪費(fèi),一般優(yōu)化成擴(kuò)散讀的方式存儲(chǔ);
  • 7)消息路由到相同接入層機(jī)器進(jìn)行合并請(qǐng)求減少網(wǎng)絡(luò)包傳輸。

相關(guān)資料:

1.《網(wǎng)易云信技術(shù)分享:IM中的萬人群聊技術(shù)方案實(shí)踐總結(jié)》

2.《企業(yè)微信的IM架構(gòu)設(shè)計(jì)揭秘:消息模型、萬人群、已讀回執(zhí)、消息撤回等》

3.《融云IM技術(shù)分享:萬人群聊消息投遞方案的思考和實(shí)踐》

16.3代碼優(yōu)化

具體的代碼優(yōu)化思路就是:本地會(huì)話信息由一個(gè)hashmap保持,導(dǎo)致鎖機(jī)制嚴(yán)重,按照用戶標(biāo)識(shí)進(jìn)行hash,講會(huì)話信息存在多個(gè)map中,減少鎖競(jìng)爭(zhēng)。同時(shí)利用雙buffer機(jī)制,避免未讀計(jì)數(shù)寫入阻塞。

16.4推拉結(jié)合優(yōu)化合并

背景:消息下發(fā)到群聊服務(wù)后,需要發(fā)送拉取通知給接收者,具體邏輯是群聊服務(wù)同步消息到路由層,路由層發(fā)送消息給接收者,接收者再來拉取消息。

問題:如果消息連續(xù)發(fā)送或者對(duì)同一個(gè)接收者連續(xù)發(fā)送消息頻率過高,會(huì)有許多的通知消息發(fā)送給路由層,消息量過大,可能會(huì)導(dǎo)致logic線程堆積,請(qǐng)求路由層阻塞。

解決:發(fā)送者發(fā)送消息到邏輯層持久化后,將通知消息先存放一個(gè)隊(duì)列中,相同的接收者接收消息通知消息后,更新相應(yīng)的最新消息通知時(shí)間,然后輪訓(xùn)線程會(huì)輪訓(xùn)隊(duì)列,將多個(gè)消息會(huì)合并為一個(gè)通知拉取發(fā)送至路由層,降低了客戶端與服務(wù)端的網(wǎng)絡(luò)消耗和服務(wù)器內(nèi)部網(wǎng)絡(luò)消耗。

好處:保證同一時(shí)刻,下發(fā)線程一輪只會(huì)向同一用戶發(fā)送一個(gè)通知拉取,一輪的時(shí)間可以自行控制。

17、高可用設(shè)計(jì)

17.1心跳設(shè)計(jì)

主要是:

  • 1)服務(wù)端檢測(cè)到某個(gè)客戶端遲遲沒有心跳過來可以主動(dòng)關(guān)閉通道,讓它下線,并且清除在線信息和路由信息;
  • 2)客戶端檢測(cè)到某個(gè)服務(wù)端遲遲沒有響應(yīng)心跳也能重連獲取一個(gè)新的連接。

智能心跳策略:比如正在發(fā)包的時(shí)候,不需要發(fā)送心跳。等待發(fā)包完畢后在開啟心跳。并且自適應(yīng)心跳策略調(diào)整。

相關(guān)資料:

《為何基于TCP協(xié)議的移動(dòng)端IM仍然需要心跳保活機(jī)制?》

《一文讀懂即時(shí)通訊應(yīng)用中的網(wǎng)絡(luò)心跳包機(jī)制:作用、原理、實(shí)現(xiàn)思路等》

《微信團(tuán)隊(duì)原創(chuàng)分享:Android版微信后臺(tái)保活實(shí)戰(zhàn)分享(進(jìn)程?;钇?》

《微信團(tuán)隊(duì)原創(chuàng)分享:Android版微信后臺(tái)?;顚?shí)戰(zhàn)分享(網(wǎng)絡(luò)保活篇)》

《融云技術(shù)分享:融云安卓端IM產(chǎn)品的網(wǎng)絡(luò)鏈路?;罴夹g(shù)實(shí)踐》

《移動(dòng)端IM實(shí)踐:實(shí)現(xiàn)Android版微信的智能心跳機(jī)制》

《萬字長文:手把手教你實(shí)現(xiàn)一套高效的IM長連接自適應(yīng)心跳保活機(jī)制》

17.2系統(tǒng)穩(wěn)定性設(shè)計(jì)

背景:高峰期系統(tǒng)壓力大,偶發(fā)的網(wǎng)絡(luò)波動(dòng)或者機(jī)器過載,都有可能導(dǎo)致大量的系統(tǒng)失敗。加上IM系統(tǒng)要求實(shí)時(shí)性,不能用異步處理實(shí)時(shí)發(fā)過來的消息。所以有了柔性保護(hù)機(jī)制防止雪崩。

柔性保護(hù)機(jī)制開啟判斷指標(biāo),當(dāng)每個(gè)指標(biāo)不在平均范圍內(nèi)的時(shí)候就開啟。

這些判斷指標(biāo)主要是:

  • 1)每條消息的ack時(shí)間 RT時(shí)間
  • 2)同時(shí)在線人數(shù)以及同時(shí)發(fā)消息的人數(shù)
  • 3)每臺(tái)機(jī)器的負(fù)載CPU和內(nèi)存和網(wǎng)絡(luò)IO和磁盤IO以及GC參數(shù)

當(dāng)開啟了柔性保護(hù)機(jī)制,那么會(huì)返回失敗,用戶端體驗(yàn)不友好,如何優(yōu)化?

以下是我的優(yōu)化思路:

  • 1)當(dāng)開啟了柔性保護(hù)機(jī)制,邏輯層hold住多余的請(qǐng)求,返回前端成功,不顯示發(fā)送失敗,后端異步重試,直至成功;
  • 2)為了避免重試加劇系統(tǒng)過載,指數(shù)時(shí)間延遲重試。

17.3異常場(chǎng)景設(shè)計(jì)

gate層重啟升級(jí)或者意外down機(jī)有以下問題:

  • 1)客戶端和gate意外丟失長連接,導(dǎo)致 客戶端在發(fā)送消息的時(shí)候?qū)е孪⒊瑫r(shí)等待以及客戶端重試等無意義操作;
  • 2)發(fā)送給客戶端的消息,從Msg消息層轉(zhuǎn)發(fā)給gate的消息丟失,導(dǎo)致消息超時(shí)等待以及重試。

解決方案如下:

  • 1)重啟升級(jí)時(shí)候,向客戶端發(fā)送重新連接指令,讓客戶端重新請(qǐng)求LSB獲取IP直連;
  • 2)當(dāng)gate層down機(jī)異常停止時(shí)候,增加hook鉤子,向客戶端發(fā)送重新連接指令;
  • 3)額外增加hook,向Msg消息層發(fā)送請(qǐng)求清空路由消息和在線狀態(tài),并且清除redis的路由信息。

17.4Redis宕機(jī)高可用設(shè)計(jì)

Redis的作用背景:

  • 1)當(dāng)用戶鏈接上網(wǎng)關(guān)后,網(wǎng)關(guān)會(huì)將用戶的userId和機(jī)器信息存入redis,用作這個(gè)user接收消息時(shí)候,消息的路由;
  • 2)消息服務(wù)在發(fā)消息給user時(shí)候,會(huì)查詢Redis的路由信息,用來發(fā)送消息給哪個(gè)一個(gè)網(wǎng)關(guān)。

如果Redis宕機(jī),會(huì)造成下面結(jié)果:

  • 1)消息中轉(zhuǎn)不過去,所有的用戶可以發(fā)送消息,但是都接收不了消息;
  • 2)如果有在線機(jī)制,那么系統(tǒng)都認(rèn)為是離線狀態(tài),會(huì)走手機(jī)消息通道推送。

Redis宕機(jī)兜底處理策略:

  • 1)消息服務(wù)定時(shí)任務(wù)同步路由信息到本地緩存,如果redis掛了,從本地緩存拿消息;
  • 2)網(wǎng)關(guān)服務(wù)在收到用戶側(cè)的上線和下線后,會(huì)同步廣播本地的路由信息給各個(gè)消息服務(wù),消息服務(wù)接收后更新本地環(huán)境數(shù)據(jù);
  • 3)網(wǎng)絡(luò)交互次數(shù)多,以及消息服務(wù)多,可以用批量或者定時(shí)的方式同步廣播路由消息給各個(gè)消息服務(wù)。

18、核心表結(jié)構(gòu)設(shè)計(jì)

核心設(shè)計(jì)要點(diǎn):

  • 1)群消息只存儲(chǔ)一份,用戶不需要為每個(gè)消息單獨(dú)存一份。用戶也無需去刪除群消息;
  • 2)對(duì)于在線的用戶,收到群消息后,修改這個(gè)last_ack_msg_id;
  • 3)對(duì)于離線用戶,用戶上線后,對(duì)比最新的消息ID和last_ack_msg_id,來進(jìn)行拉取(參考Kafka的消費(fèi)者模型);
  • 4)對(duì)應(yīng)單聊,需要記錄消息的送達(dá)狀態(tài),以便在異常情況下來做重試處理。

群用戶消息表 t_group_user_msg:

群消息表 t_group_msg:

參考資料:

1.《一套海量在線用戶的移動(dòng)端IM架構(gòu)設(shè)計(jì)實(shí)踐分享(含詳細(xì)圖文)》

2.《基于Netty,從零開發(fā)一個(gè)IM服務(wù)端》

19、紅包設(shè)計(jì)

搶紅包的大致核心邏輯如下:

  • 1)銀行快捷支付,保證賬戶余額和發(fā)送紅包邏輯的一致性;
  • 2)發(fā)送紅包后,首先計(jì)算好紅包的個(gè)數(shù),個(gè)數(shù)確定好后,確定好每個(gè)紅包的金額,存入存儲(chǔ)層【這里可以是redis的List或者是隊(duì)列】方便后續(xù)每個(gè)人來?。?/li>
  • 3)生成一個(gè)24小時(shí)的延遲任務(wù),檢測(cè)紅包是否還有錢方便退回;
  • 4)每個(gè)紅包的金額需要保證每個(gè)紅包的的搶金額概率是一致的,算法需要考量;
  • 5)存入數(shù)據(jù)庫表中后,服務(wù)器通過長連接,給群里notify紅包消息,供群成員搶紅包;
  • 6)群成員并發(fā)搶紅包,在第二步中會(huì)將每個(gè)紅包的金額放入一個(gè)隊(duì)列或者其他存儲(chǔ)中,群成員實(shí)際是來競(jìng)爭(zhēng)去隊(duì)列中的紅包金額。兜底機(jī)制:如果redis掛了,可以重新生成紅包信息到數(shù)據(jù)庫中;
  • 7)取成功后,需要保證紅包剩余金額、新插入的紅包流水?dāng)?shù)據(jù)、隊(duì)列中的紅包數(shù)據(jù)以及群成員的余額賬戶金額一致性;
  • 8)這里還需要保證一個(gè)用戶只能領(lǐng)取一次,并且保持冪等。

相關(guān)資料:

《社交軟件紅包技術(shù)解密(一):全面解密QQ紅包技術(shù)方案——架構(gòu)、技術(shù)實(shí)現(xiàn)等》

《社交軟件紅包技術(shù)解密(二):解密微信搖一搖紅包從0到1的技術(shù)演進(jìn)》

《社交軟件紅包技術(shù)解密(三):微信搖一搖紅包雨背后的技術(shù)細(xì)節(jié)》

《社交軟件紅包技術(shù)解密(四):微信紅包系統(tǒng)是如何應(yīng)對(duì)高并發(fā)的》

《社交軟件紅包技術(shù)解密(五):微信紅包系統(tǒng)是如何實(shí)現(xiàn)高可用性的》

《社交軟件紅包技術(shù)解密(六):微信紅包系統(tǒng)的存儲(chǔ)層架構(gòu)演進(jìn)實(shí)踐》

《社交軟件紅包技術(shù)解密(七):支付寶紅包的海量高并發(fā)技術(shù)實(shí)踐》

《社交軟件紅包技術(shù)解密(八):全面解密微博紅包技術(shù)方案》

《社交軟件紅包技術(shù)解密(九):談?wù)勈諵紅包的功能邏輯、容災(zāi)、運(yùn)維、架構(gòu)等》

《社交軟件紅包技術(shù)解密(十):手Q客戶端針對(duì)2020年春節(jié)紅包的技術(shù)實(shí)踐》

《社交軟件紅包技術(shù)解密(十一):解密微信紅包隨機(jī)算法(含代碼實(shí)現(xiàn))》

《社交軟件紅包技術(shù)解密(十二):解密抖音春節(jié)紅包背后的技術(shù)設(shè)計(jì)與實(shí)踐》

20、核心業(yè)務(wù)流程梳理

20.1單聊流程

假設(shè)是用戶A發(fā)消息給用戶B ,以下是完整的業(yè)務(wù)流程。

1)A打包數(shù)據(jù)發(fā)送給服務(wù)端,服務(wù)端接收消息后,根據(jù)接收消息的sequence_id來進(jìn)行客戶端發(fā)送消息的去重,并且生成遞增的消息ID,將發(fā)送的信息和ID打包一塊入庫,入庫成功后返回ACK,ACK包帶上服務(wù)端生成的消息ID。

2)服務(wù)端檢測(cè)接收用戶B是否在線,在線直接推送給用戶B。

3)如果沒有本地消息ID則存入,并且返回接入層ACK信息;如果有則拿本地sequence_id和推送過來的sequence_id大小對(duì)比,并且去重,進(jìn)行展現(xiàn)時(shí)序進(jìn)行排序展示,并且記錄最新一條消息ID。最后返回接入層ack。

4)服務(wù)端接收ACK后,將消息標(biāo)為已送達(dá)。

5)如果用戶B不在線,首先將消息存入庫中,然后直接通過手機(jī)通知來告知客戶新消息到來。

6)用戶B上線后,拿本地最新的消息ID,去服務(wù)端拉取所有好友發(fā)送給B的消息,考慮到一次拉取所有消息數(shù)據(jù)量大,通過channel通道來進(jìn)行分頁拉取,將上一次拉取消息的最大的ID,作為請(qǐng)求參數(shù),來請(qǐng)求最新一頁的比ID大的數(shù)據(jù)。

20.2群聊流程

假設(shè)是用戶A發(fā)消息給群G,以下是完整的業(yè)務(wù)流程。

1)登錄,TCP連接,token校驗(yàn),名詞檢查,sequence_id去重,生成遞增的消息ID,群消息入庫成功返回發(fā)送方ACK。

2)查詢?nèi)篏所有的成員,然后去redis中央存儲(chǔ)中找在線狀態(tài)。離線和在線成員分不同的方式處理。

3)在線成員:并行發(fā)送拉取通知,等待在線成員過來拉取,發(fā)送拉取通知包如丟失會(huì)有兜底機(jī)制。

4)在線成員過來拉取,會(huì)帶上這個(gè)群標(biāo)識(shí)和上一次拉取群的最小消息ID,服務(wù)端會(huì)找比這個(gè)消息ID大的所有的數(shù)據(jù)返回給客戶端,等待客戶端ACK。一段時(shí)間沒ack繼續(xù)推送。如果重試幾次后沒有回ack,那么關(guān)閉連接和清除ack等待隊(duì)列消息。

5)客戶端會(huì)更新本地的最新的消息ID,然后進(jìn)行ack回包。服務(wù)端收到ack后會(huì)更新群成員的最新的消息ID。

6)離線成員:發(fā)送手機(jī)通知欄通知。離線成員上線后,拿本地最新的消息ID,去服務(wù)端拉取群G發(fā)送給A的消息,通過channel通道來進(jìn)行分頁拉取,每一次請(qǐng)求,會(huì)將上一次拉取消息的最大的ID,作為請(qǐng)求參數(shù)來拉取消息,這里相當(dāng)于第二次拉取請(qǐng)求包是作為第一次拉取的ack包。

7)分頁的情況下,客戶端在收到上一頁請(qǐng)求的的數(shù)據(jù)后更新本地的最新的消息ID后,再請(qǐng)求下一頁并且?guī)舷D。上一頁請(qǐng)求的的數(shù)據(jù)可以當(dāng)作為ack來返回服務(wù)端,避免網(wǎng)絡(luò)多次交互。服務(wù)端收到ack后會(huì)更新群成員的最新的消息ID。

21、設(shè)計(jì)IM系統(tǒng)時(shí)的常見疑問

21.1相比傳統(tǒng)HTTP請(qǐng)求的業(yè)務(wù)系統(tǒng),IM業(yè)務(wù)系統(tǒng)的有哪些不一樣的設(shè)計(jì)難點(diǎn)?

主要是在線狀態(tài)維護(hù)。

相比于HTTP請(qǐng)求的業(yè)務(wù)系統(tǒng),接入層有狀態(tài),必須維持心跳和會(huì)話狀態(tài),加大了系統(tǒng)設(shè)計(jì)復(fù)雜度。

請(qǐng)求通信模型不一樣。相比于HTTP請(qǐng)求一個(gè)request等待一個(gè)response通信模型,IM系統(tǒng)則是一個(gè)數(shù)據(jù)包在全雙工長連接通道雙傳輸,客戶端和服務(wù)端消息交互的信令數(shù)據(jù)包設(shè)計(jì)復(fù)雜。

21.2對(duì)于單聊和群聊的實(shí)時(shí)性消息,是否需要MQ來作為通信的中間件來代替rpc?

MQ作為解耦可以有以下好處:

  • 1)易擴(kuò)展:gate層到logic層無需路由,logic層多個(gè)有新的業(yè)務(wù)時(shí)候,只需要監(jiān)聽新的topic即可;
  • 2)解耦:gate層到logic層解耦,不會(huì)有依賴關(guān)系;
  • 3)節(jié)省端口資源:gate層無需再開啟新的端口接收logic的請(qǐng)求,而且直接監(jiān)聽MQ消息即可。

但是缺點(diǎn)也有:

  • 1)網(wǎng)絡(luò)通信多一次網(wǎng)絡(luò)通信,增加RT的時(shí)間,消息實(shí)時(shí)性對(duì)于IM即使通信的場(chǎng)景是非常注重的一個(gè)點(diǎn);
  • 2)MQ的穩(wěn)定性,不管任何系統(tǒng)只要引入中間件都會(huì)有穩(wěn)定性問題,需要考慮MQ不可用或者丟失數(shù)據(jù)的情況;
  • 3)需要考慮到運(yùn)維的成本;
  • 4)當(dāng)用消息中間代替路由層的時(shí)候,gate層需要廣播消費(fèi)消息,這個(gè)時(shí)候gate層會(huì)接收大部分的無效消息,因?yàn)檫@個(gè)消息的接收者channel不在本機(jī)維護(hù)的session中。

綜上:是否考慮使用MQ需要架構(gòu)師去考量,比如考慮業(yè)務(wù)是否允許、或者系統(tǒng)的流量、或者高可用設(shè)計(jì)等等影響因素。本項(xiàng)目基于使用成本、耦合成本和運(yùn)維成本考慮,采用Netty作為底層自定義通信方案來實(shí)現(xiàn),也能同樣實(shí)現(xiàn)層級(jí)調(diào)用。

參考資料:《阿里IM技術(shù)分享(九):深度揭密RocketMQ在釘釘IM系統(tǒng)中的應(yīng)用實(shí)踐》。

21.3為什么接入層用LSB返回的IP來做接入呢?

可以有以下好處:

  • 1)靈活的負(fù)載均衡策略 可根據(jù)最少連接數(shù)來分配IP;
  • 2)做灰度策略來分配IP;
  • 3)AppId業(yè)務(wù)隔離策略 不同業(yè)務(wù)連接不同的gate,防止相互影響。

21.4為什么應(yīng)用層心跳對(duì)連接進(jìn)行健康檢查?

因?yàn)門CP Keepalive狀態(tài)無法反應(yīng)應(yīng)用層狀態(tài)問題,如進(jìn)程阻塞、死鎖、TCP緩沖區(qū)滿等情況。

并且要注意心跳的頻率,頻率小則可能及時(shí)感知不到應(yīng)用情況,頻率大可能有一定的性能開銷。

參考資料:《為何基于TCP協(xié)議的移動(dòng)端IM仍然需要心跳?;顧C(jī)制?》、《徹底搞懂TCP協(xié)議層的KeepAlive?;顧C(jī)制》。

21.5MQ的使用場(chǎng)景?

IM消息是非常龐大的,比如說群聊相關(guān)業(yè)務(wù)、推送,對(duì)于一些業(yè)務(wù)上可以忍受的場(chǎng)景,盡量使用MQ來解耦和通信,來降低同步通訊的服務(wù)器壓力。

21.6群消息存一份還是多份,讀擴(kuò)散還是寫擴(kuò)散?

我的設(shè)計(jì)是存1份,讀擴(kuò)散。

存多份的話(也就是寫擴(kuò)散)下同一條消息存儲(chǔ)了很多次,對(duì)磁盤和帶寬造成了很大的浪費(fèi)??梢栽诩軜?gòu)上和業(yè)務(wù)上進(jìn)行優(yōu)化,來實(shí)現(xiàn)讀擴(kuò)散。

當(dāng)然,對(duì)于IM是使用讀擴(kuò)散還是寫擴(kuò)散來實(shí)現(xiàn),這需要根據(jù)IM產(chǎn)品的業(yè)務(wù)定位來決定。比如微信就是寫擴(kuò)散(詳見《企業(yè)微信的IM架構(gòu)設(shè)計(jì)揭秘:消息模型、萬人群、已讀回執(zhí)、消息撤回等》),而釘釘卻是讀擴(kuò)散(詳見《深度解密釘釘即時(shí)消息服務(wù)DTIM的技術(shù)設(shè)計(jì)》)。

21.7消息ID為什么是趨勢(shì)遞增就可以,嚴(yán)格遞增的不行嗎?

嚴(yán)格遞增會(huì)有單點(diǎn)性能瓶頸,比如MySQL auto increments。

redis性能好但是沒有業(yè)務(wù)語義,比如缺少時(shí)間因素,還可能會(huì)有數(shù)據(jù)丟失的風(fēng)險(xiǎn),并且集群環(huán)境下寫入ID也屬于單點(diǎn),屬于集中式生成服務(wù)。

小型IM可以根據(jù)業(yè)務(wù)場(chǎng)景需求直接使用redis的incr命令來實(shí)現(xiàn)IM消息唯一ID。

本項(xiàng)目采用snowflake算法實(shí)現(xiàn)唯一趨勢(shì)遞增ID,即可實(shí)現(xiàn)IM消息中,時(shí)序性,重復(fù)性以及查找功能。

關(guān)于消息ID的生成,可以參考下面的系列文章:

《微信的海量IM聊天消息序列號(hào)生成實(shí)踐(算法原理篇)》

《微信的海量IM聊天消息序列號(hào)生成實(shí)踐(容災(zāi)方案篇)》

《解密融云IM產(chǎn)品的聊天消息ID生成策略》

《深度解密美團(tuán)的分布式ID生成算法》

《開源分布式ID生成器UidGenerator的技術(shù)實(shí)現(xiàn)》

《深度解密滴滴的高性能ID生成器(Tinyid)》

21.8gate層為什么需要開兩個(gè)端口?

gate會(huì)接收客戶端的連接請(qǐng)求(被動(dòng)),需要外網(wǎng)監(jiān)聽端口;entry會(huì)主動(dòng)給logic發(fā)請(qǐng)求(主動(dòng));entry會(huì)接收服務(wù)端給它的通知請(qǐng)求(被動(dòng)),需要內(nèi)網(wǎng)監(jiān)聽端口。一個(gè)端口對(duì)內(nèi),一個(gè)端口對(duì)外。

21.9用戶的路由信息,是維護(hù)在中央存儲(chǔ)的redis中,還是維護(hù)在每個(gè)msg層內(nèi)存中?

維護(hù)在每個(gè)msg層內(nèi)存中有狀態(tài):多級(jí)緩存避免和中間件多次交互,并發(fā)高。

維護(hù)在中央存儲(chǔ)的redis中,msg層無狀態(tài),redis壓力大,每次交互IO網(wǎng)絡(luò)請(qǐng)求大。

業(yè)務(wù)初期為了減少復(fù)雜度,可以維護(hù)在Redis中。

21.10網(wǎng)關(guān)層和服務(wù)層以及msg層和網(wǎng)關(guān)層請(qǐng)求模型具體是怎樣的?

網(wǎng)關(guān)層到服務(wù)層,只需要單向傳輸發(fā)請(qǐng)求,網(wǎng)關(guān)層不需要關(guān)心調(diào)用的結(jié)果。

而客戶端想要的ack或者notify請(qǐng)求是由SDK發(fā)送數(shù)據(jù)到網(wǎng)關(guān)層,SDK也不需要關(guān)心調(diào)用的結(jié)果,最后網(wǎng)關(guān)層只轉(zhuǎn)發(fā)數(shù)據(jù),不做額外的邏輯處理。

SDK和所有的網(wǎng)關(guān)進(jìn)行長連接,當(dāng)發(fā)送信息給客戶端時(shí),根據(jù)路由尋址信息,即可通過長連接推送信息

21.11本地寫數(shù)據(jù)成功,一定代表對(duì)端應(yīng)用側(cè)接收讀取消息了嗎?

本地TCP寫操作成功,但數(shù)據(jù)可能還在本地寫緩沖區(qū)中、網(wǎng)絡(luò)鏈路設(shè)備中、對(duì)端讀緩沖區(qū)中,并不代表對(duì)端應(yīng)用讀取到了數(shù)據(jù)。

如果你還不理解,可以讀讀這篇文章《從客戶端的角度來談?wù)勔苿?dòng)端IM的消息可靠性和送達(dá)機(jī)制》。

21.12為什么用netty做來做http網(wǎng)關(guān), 而不用tomcat?

主要是從以下方面考慮:

  • 1)netty對(duì)象池,內(nèi)存池,高性能線程模型;
  • 2)netty堆外內(nèi)存管理,減少GC壓力,jvm管理的只是一個(gè)很小的DirectByteBuffer對(duì)象引用;
  • 3)tomcat讀取數(shù)據(jù)和寫入數(shù)據(jù)都需要從內(nèi)核態(tài)緩沖copy到用戶態(tài)的JVM中,多1次或者2次的拷貝會(huì)有性能影響。

21.13為什么消息入庫后,對(duì)于在線狀態(tài)的用戶,單聊直接推送,群聊通知客戶端來拉取,而不是直接推送消息給客戶端(推拉結(jié)合)?

在保證消息實(shí)時(shí)性的前提下,對(duì)于單聊,直接推送。

對(duì)于群聊,由于群聊人數(shù)多,推送的話一份群消息會(huì)對(duì)群內(nèi)所有的用戶都產(chǎn)生一份推送的消息,推送量巨大。

解決辦法是按需拉取,當(dāng)群消息有新消息時(shí)候發(fā)送時(shí)候,服務(wù)端主動(dòng)推送新的消息數(shù)量,然后客戶端分頁按需拉取數(shù)據(jù)。

21.14為什么除了單聊、群聊、推送、離線拉取等實(shí)時(shí)性業(yè)務(wù),其他的業(yè)務(wù)都走h(yuǎn)ttp協(xié)議?

IM協(xié)議簡單最好,如果讓其他的業(yè)務(wù)請(qǐng)求混進(jìn)IM協(xié)議中,會(huì)讓其IM變的更復(fù)雜,比如查找離線消息記錄拉取走h(yuǎn)ttp通道避免tcp 通道壓力過大,影響即時(shí)消息下發(fā)效率。

在比如上傳圖片和大文件,可以利用HTTP的斷點(diǎn)上傳和分段上傳特性。

21.15機(jī)集群機(jī)器要考慮到哪些優(yōu)化?

主要有:

  • 1)網(wǎng)絡(luò)寬帶;
  • 2)最大文件句柄;
  • 3)每個(gè)tcp的內(nèi)存占用;
  • 4)Linux系統(tǒng)內(nèi)核tcp參數(shù)優(yōu)化配置;
  • 5)網(wǎng)絡(luò)IO模型;
  • 6)網(wǎng)絡(luò)網(wǎng)絡(luò)協(xié)議解析效率;
  • 7)心跳頻率;
  • 8)會(huì)話數(shù)據(jù)一致性保證;
  • 9)服務(wù)集群動(dòng)態(tài)擴(kuò)容縮容。

22、系列文章

《跟著源碼學(xué)IM(一):手把手教你用Netty實(shí)現(xiàn)心跳機(jī)制、斷線重連機(jī)制》

《跟著源碼學(xué)IM(二):自已開發(fā)IM很難?手把手教你擼一個(gè)Andriod版IM》

《跟著源碼學(xué)IM(三):基于Netty,從零開發(fā)一個(gè)IM服務(wù)端》

《跟著源碼學(xué)IM(四):拿起鍵盤就是干,教你徒手開發(fā)一套分布式IM系統(tǒng)》

《跟著源碼學(xué)IM(五):正確理解IM長連接、心跳及重連機(jī)制,并動(dòng)手實(shí)現(xiàn)》

《跟著源碼學(xué)IM(六):手把手教你用Go快速搭建高性能、可擴(kuò)展的IM系統(tǒng)》

《跟著源碼學(xué)IM(七):手把手教你用WebSocket打造Web端IM聊天》

《跟著源碼學(xué)IM(八):萬字長文,手把手教你用Netty打造IM聊天》

《跟著源碼學(xué)IM(九):基于Netty實(shí)現(xiàn)一套分布式IM系統(tǒng)》

《跟著源碼學(xué)IM(十):基于Netty,搭建高性能IM集群(含技術(shù)思路+源碼)》

《跟著源碼學(xué)IM(十一):一套基于Netty的分布式高可用IM詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)(有源碼)》(* 本文)

《SpringBoot集成開源IM框架MobileIMSDK,實(shí)現(xiàn)即時(shí)通訊IM聊天功能》

23、參考資料

[1]史上最通俗Netty框架入門長文:基本介紹、環(huán)境搭建、動(dòng)手實(shí)戰(zhàn)

[2]強(qiáng)列建議將Protobuf作為你的即時(shí)通訊應(yīng)用數(shù)據(jù)傳輸格式

[3]IM通訊協(xié)議專題學(xué)習(xí)(一):Protobuf從入門到精通,一篇就夠!

[4]微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解

[5]探討組合加密算法在IM中的應(yīng)用

[6]從客戶端的角度來談?wù)勔苿?dòng)端IM的消息可靠性和送達(dá)機(jī)制

[7]IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(一):保證在線實(shí)時(shí)消息的可靠投遞

[8]理解IM消息“可靠性”和“一致性”問題,以及解決方案探討

[9]融云技術(shù)分享:全面揭秘億級(jí)IM消息的可靠投遞機(jī)制

[10]IM群聊消息如此復(fù)雜,如何保證不丟不重?

[11]零基礎(chǔ)IM開發(fā)入門(四):什么是IM系統(tǒng)的消息時(shí)序一致性?

[12]一套億級(jí)用戶的IM架構(gòu)技術(shù)干貨(下篇):可靠性、有序性、弱網(wǎng)優(yōu)化等

[13]如何保證IM實(shí)時(shí)消息的“時(shí)序性”與“一致性”?

[14]阿里IM技術(shù)分享(六):閑魚億級(jí)IM消息系統(tǒng)的離線推送到達(dá)率優(yōu)化

[15]微信的海量IM聊天消息序列號(hào)生成實(shí)踐(算法原理篇)

[16]社交軟件紅包技術(shù)解密(一):全面解密QQ紅包技術(shù)方案——架構(gòu)、技術(shù)實(shí)現(xiàn)等

[17]網(wǎng)易云信技術(shù)分享:IM中的萬人群聊技術(shù)方案實(shí)踐總結(jié)

[18]企業(yè)微信的IM架構(gòu)設(shè)計(jì)揭秘:消息模型、萬人群、已讀回執(zhí)、消息撤回等

[19]融云IM技術(shù)分享:萬人群聊消息投遞方案的思考和實(shí)踐

[20]為何基于TCP協(xié)議的移動(dòng)端IM仍然需要心跳?;顧C(jī)制?

[21]一文讀懂即時(shí)通訊應(yīng)用中的網(wǎng)絡(luò)心跳包機(jī)制:作用、原理、實(shí)現(xiàn)思路等

[22]微信團(tuán)隊(duì)原創(chuàng)分享:Android版微信后臺(tái)?;顚?shí)戰(zhàn)分享(網(wǎng)絡(luò)?;钇?

[23]融云技術(shù)分享:融云安卓端IM產(chǎn)品的網(wǎng)絡(luò)鏈路保活技術(shù)實(shí)踐

[24]阿里IM技術(shù)分享(九):深度揭密RocketMQ在釘釘IM系統(tǒng)中的應(yīng)用實(shí)踐

[25]徹底搞懂TCP協(xié)議層的KeepAlive?;顧C(jī)制

[26]深度解密釘釘即時(shí)消息服務(wù)DTIM的技術(shù)設(shè)計(jì)

(本文已同步發(fā)布于:http://www.52im.net/thread-4257-1-1.html)

關(guān)鍵詞:
91精品综合国产熟女| 欧美在线观看视频一区五区| 久久精精品久久久噜噜| 大奶子美女免费操逼视频| 99国产精品免费视频观看a| 亚洲精品1234区在线看| 大吊插入素人骚穴内射视频播放| 黑人系列哪个最猛番号| 综合另类小说欧美另类图片| 日日爽夜夜爽夜夜爽精品视频| 国产极品尤物粉嫩泬在线观看| 人妻中文字幕在线视频免费观看| aaa222男人天堂| 精品欧美一亚洲精品午夜| 国产伦精品一区二区黑人| 爱人体-看人体人体摄影| 日日爽夜夜爽夜夜爽精品视频| 一区二区三区在线 日韩| 国产黄色大片在线免费观看| 91免费观看国产精品| 中文字幕第一区久久| 亚洲国产日韩欧美高清片vr| 浪荡人妻共32部分黑人| 亚洲天堂 校园春色| 欧美色一区二区三区在线观看 | 成人免费视频国产免费麻豆下| 激情综合网激情俺她去| 日本视频免费大片| 国产精品亚洲综合视频| 亚洲欧美在线x视频| 亚洲人成亚洲人成在线观看com| 午夜在线看1000集| 国产视频精品在线免费观看| 天天操天天湿天天干| 亚洲中文字幕有码电影| 91精品1080部在线播放| 老熟妇乱子伦中文字幕视频| 操人妻一区二区三区| 51日日夜夜精品视频| lisaann在线观看| 天天摸天天干天天插天天操| 妍强被迫伦姧惨叫123| 销魂少妇一区二区视频| 在线91精品亚洲网站精品成人| 99精品视频在线观看专区| 三上悠亚和黑人665番号| 日韩成人在线电影,| 天天日天天看天天摸| 久久精品国产亚洲a| 99热6在线播放免费| 99精品国产自在现线观看| 国产美女视频在线播放| Av资源站中文字幕| 精产国品一二三产区999| 91九色在线视频网站| 午夜剧场欧美一区二区| 要看tv在线观看欧美日韩| 国产白丝美女在线网站| 妍强被迫伦姧惨叫123| 日韩精品在线播放视频成年人| 日韩毛片基地免费看| 两个人午夜免费看视频| 最新人妻熟女中文字幕| 在线观看小视频国产| 欧美在线播放一二区不卡| 人妻少妇偷人视频一| 国内人人人妻狠狠狠操操| 狠狠操 在线视频 轻轻草 | 91国内精品视频在线| 97超碰在线视频观看| 亚洲精品成人a8198| 欧洲日本亚洲一区二区| 一区二区三区四区免费福利视频| 国产精品黄色自拍视频| 国产又色又爽又黄又免费的小说| 色片免费在线观看喷水| 97超碰在线come| 国内精品久久久久精品爽爽| 国产熟女一区二区三区四| 天天摸天天干天天插天天操| 欧美丝袜熟女日韩亚洲| av网站在线免费浏览| 国产精品福利免费视频不卡| aaa222男人天堂| 最新天堂一区二区三区| 日韩不伦高清一区二区三区| suv精品一区二区6| 亚洲三级伦理在线播放| 女人张开双腿让男人捅视频 | 日韩精品高清免费视频| 午夜福利啪啪视频免费看| 蜜臀 av一区二区| 天天透天天插天天通| 亚洲情品中文字幕人妻久久久边| 超碰超碰超碰超碰超碰超| 午夜福利免费福利视频| 中文字幕 日韩在线播放| 国产av在线一区二区| 漂亮人妻被强制中出| 韩国一区二区三区在线观看| 筱田优在线播放一区二区三区| 天天射天天日天天干天天舔| 美女极品美女福利视频在线| 精产国品一二三产区999| 亚洲一区二区成人综合| 久久精品国产亚洲av视瓶 | xfplay亚洲资源| 午夜在线小视频在线观看| 少妇人妻不满足中文字幕| 亚洲国产日韩a在线欧美2020| 亚洲三级这里只有精品| 日本五十路六十路中出| 97色婷婷久久99国产视频| 成人av影视一区在线观看 | 一级白丝美女久久久久| 鸡巴操进我的小穴欧美国产| 亚洲精品久久久久久久久久蜜桃| 五月激情丁香久久亚洲| 老司机免费福利视频网| 午夜三级影片免费播放| m3u8在线播放91| 日本vvvv操操操| 操白嫩人妻少妇真爽视频| 亚洲欧美另类图片88| 蜜桃精品在线观看一区| 午夜网在线观看视频| 日本av毛片在线播放| 亚洲一区二区三区免费| 999久久久精品精品| 午夜精选视频在线观看| 自拍分享国产亚洲欧美| 国产白丝美女在线网站| 国产女人露脸高潮对白视频| 日韩美女精品一在线观看| 在线观看成人激情av| 精品视频在线观看久久| 亚洲图片一区偷拍自拍| 人人妻人人澡人人爽电台app| 日本五十路六十路中出| 色片网站在线看亚洲精品| 亚洲天堂 校园春色| 男生的天堂亚洲男人| 96人妻一区=区三区| 日日躁夜夜躁狠狠久久av| 亚洲三级这里只有精品| 在线观看高清日韩av| 久操视频精品在线观看| 可以免费看的黄页视频| 综合久久天天搞天天]| 亚洲精品超熟女av| 午夜精品久久99蜜桃| av 在线 麻豆| 亚洲福利导航在线视频| 欧美日韩国产综合不卡| r人人妻人人澡人人爽| 国产一级免费黄色录像片| 蜜臀 av一区二区| 一区二区三区四区免费福利视频| 污污污视频在线观看91| 偷窥老熟女久久久av| 人妻少妇精品视频专区vr| 99精品国产免费久久久久久| 亚洲图片一区偷拍自拍| www国产精品久久久| www国产精品久久久| 女人看了很爽的一级女毛片| 性感美女一区二区美女| 亚洲欧洲自拍他拍av| 二根鸡巴日一个穴视频| 免费在线观看国产成人大片| 国产剧情免费在线观看| 一区二区三区精品在线免费视频| 天天日天天添天天爽| 欧美142p极品服务| 日日夜夜狠狠干干亚洲| 男生日女生逼的视频| ai给视频自动加字幕| 欧美 日韩 中文 字幕| 亚洲视频免费观看不卡| 男人天堂在线免费观看| 黑人精品一区a一二区b| 日本少妇人妻久久中文| 日本少妇人妻久久中文| 中文字幕精品av在线观看| 大秀视频一区二区三区| 要看tv在线观看欧美日韩| 欧美,日本中文高清视频| 日本系列变态另类一区二区三区 | 99国产精品免费视频观看a| 国产午夜福利精品久久不卡| 中文字幕黄色av网址| 四川熟女a一区二区三区| av大片在线观看免费| 欧美亚洲国产校园春色| 免费在线观看国产成人大片| 9l九色自拍蝌蚪9l视频| 亚洲国产图片小说一区二区| 亚洲精品免费一二三区| 天天透天天插天天通| 91久久国产丁香精品中文| 色片免费在线观看喷水| 青草视频在在线成人av| 可以免费看的黄页视频| 26uuu天堂在线青青在线视频| 成人在线视频国产自拍| 色淫骚色色色色色色美女| 亚洲av欧美av在线播放| 中字av在线一区二区中字| 五月天开心激情深爱激情| 青青草手机视频在线观看| 精品人妻欧美一区二区| 成人性生交大免费三人| 欧美一区二区蜜桃视频| Av资源站中文字幕| 天天天天拍天天天天天天| 中文字幕av网址大全| 欧美亚洲综合偷拍另类| 超碰在线观看97视频| av色哟哟国产精品| 童话村热久久精品精| 中文字幕久久久久久人妻| m3u8在线播放91| 大鸡巴操的好爽好舒服啊视频| 涩涩网站在线观看视频| 五月天中文字幕剧情在线| suv精品一区二区6| 91久久香蕉国产熟女| 日本熟妇丰满厨房55| 91国内精品视频在线| 天天色天天干天天操| 中文字幕一区三区二区国产黄色| 亚洲一区二区综合网| 神乃麻美三级在线观看视频| 亚洲精品成人a8198| 在线播放 国产 真实| 欧美1234不卡视频| 欧美在线观看一级一区二区| 国产剧情星空无限传媒| 亚洲一区二区三区邪恶成人| 亚洲天堂都市激情av| 浪荡人妻共32部分黑人| 亚洲免费观看高清在线| 大香蕉伊人免费在线| 1777中文字幕字幕在线播放| 婷婷av一区二区三区7| 97免费人妻超碰97在线| 一区二区三区国产精选在线播放| 国产在线视频国产资源| 污污污污国产免费入口处| 91九色在线视频网站| 人妻夜夜爽av性色大片| 日本日本熟妇中文在线视频| 五月天亚洲精品综合网| 天天干天天日天天超| 欧美在线观看一级一区二区| 日日爽夜夜爽夜夜爽精品视频| 亚洲中文字幕av在线播放| 久久精品国产亚洲a| 日本性少妇xxxx| 亚洲无码精品中的精品| 神乃麻美三级在线观看视频| 欧美午夜不卡一区二区三区| 在线精品亚洲区一区二区| 最新亚洲成人黄色片| 亚洲av午夜精品一老妈| 日本性感黑丝美女一区二区| 精品99久久久久久www| 免费av在线中文字幕| 日本免费啪啪啪啪啪啪啪啪啪啪| 香蕉久久av一区二区三区四区| 亚洲情品中文字幕人妻久久久边| 国产成人一区二区三区久| 亚洲自偷自拍另类18p| 搡四十路e五十路熟女av| 丝袜美腿色诱视频在线观看| 韩国美女主播福利视频| 操女人下阴黄色一级视频| 五月桃花网婷婷伊人久久| 在线观看av久久久| 2020精品国产自在现线官网| 成全视频免费观看在线下载| av影视在线免费观看| 超碰人妻中文字幕在线| 成人免费视频国产免费麻豆下| av男人天堂精品久久| 欧美日韩aaaaa级黄片视频| 亚洲久久久久久久久久久久久久| 免费av在线中文字幕| 欧洲日本亚洲一区二区| 亚洲自偷自拍另类性受不了| 91国内精品视频在线| 人人妻人人妻人人妻人人妻人人人 | 17c在线观看视频国产aa| 青春草在线视频播放免费观看网站 | 中文字幕黄色av网址| av在线操亚洲图片| 狠狠干狠狠操五月天| 久久99精品国产99久久6尤| 99久久精品美女高潮喷水| 手机在线免费视频一区二区三区| 国产欧美日韩经典一区| 少妇人妻中文字幕专区视频| 日韩中文字幕乱码一区| 日本公与妇电影三级| 国产精品精品3d动漫| 99精品老司机免费视频| 久久三级片一区二区毛片| 超级碰碰碰碰碰碰碰碰碰| 日韩av中文字幕乱码| 国产精品啪啪啪免费网站| 在线免费观看欧美激情视频| 9797人人妻人人澡| 成人18禁视频网站在线看| 欧美亚洲国产校园春色| 亚洲国产精品日日夜夜| av网址大全在线播放 | 中文字幕精品av在线观看| 国语对白xxxx乱大交| 天天色天天爱天天舔| 国产粉嫩粉嫩的在线18观看| 精产国品一二三产区999| 国产成人一区二区三区久| 国产盗摄女子私密保健视频| 天天睡天天摸天天添天天日天天射 | 久久精品国产亚洲a| 久久99精品国产99久久6尤| 成人黄色大全在线观看| 免费观看视频一区,二区,三区 | 日韩欧美在线不卡一区二区三区| 久久三级片一区二区毛片| 天天操夜夜爽夜夜操| av色哟哟国产精品| 天天日天天看天天摸| 特黄特猛aaaaaaaaa片| 日本熟妇丰满厨房55| 欧美精品乱码久久久久久| 先锋资源在线观看国产精品 | 青青青青青青青青草青青| 国产乱子伦一区=区三区| 久久躁夜夜躁日日躁狠狠躁| 99热6在线播放免费| 天天干天天日天天超| 涩涩漫画网站在线观看| 亚洲国产精品日日夜夜| 狠狠躁日日躁夜夜躁2| 内射一对幼嫩无毛妹| 欧美熟妇亚洲中文不卡少妇 | 精品视频在线观看久久 | 日韩精品一区二区三区中文精| 欧美在线一区日韩国产| xxxx在线免费观看视频| 欧美精品乱码久久久久久| 免费观看视频一区二区三区| 97超碰在线come| 亚洲欧美区二区三区| 亚洲伊人av 综合福利| 亚洲精品 国产成人| av一av一av中文字幕| 五月激情四射丁香婷婷激情四射| 熟女免费在线观看视频| 国产伦精品一区二区黑人| 中文字幕最新色片av| 伊人青操在线观看视频网站| julia 人妻中文字幕| 正宗欧美在线观看一区二区| 国产日视频在线观看| 日本av都是真做吗| 日本vvvv操操操| 制服丝袜诱惑综合网| 丝袜美腿色诱视频在线观看| 一区二区人妻丝袜粉嫩| 午夜精品久久99蜜桃| 国模视频写真一区二区| 国产精品啪啪啪免费网站| 欧美成人a v在线| 91老熟女连续高潮对白| 精品国产日韩一区三区| 亚洲一区二区成人综合| 91免费观看国产精品| 亚洲日本一区二区嫩草| 乱一区二区三区在线播放| 97国产在线精品观看| 天天色天天情天天透| 欧美成人免费观看黄片| 天天射天天日天天干天天舔| 人妻熟一区二区三区四区不卡| 在线视频你懂的视频| 天天操天天射天天综合网| 精品熟女后入一区二区三区| 欧美黄色免费在线网站| 青青操视频在线免费| 伊人大香线蕉亚洲五月天| 色淫骚色色色色色色美女| 久久久久久久久久久蜜桃| 久久久久国产一毛片高清| 日本片免费a在线观看| 天天插天天爱天天日| 欧洲日本亚洲一区二区| 国产美女主播丝袜高潮白浆| 亚洲欧洲美洲无码在线| 中国福利在线黄色片| 要看tv在线观看欧美日韩| 适合黄黑皮的显白发色| 1777中文字幕字幕在线播放| 夭天曰天天躁东京热天天摸| 教资是不是人人都可以考| 99久久免费国产特黄| 掀开奶罩边吃边摸下娇喘视频| 大奶子美女免费操逼视频| 在线理论国产高清在线| 国产一线女人天堂av| 大奶子美女免费操逼视频| 日本女护士久久精品| 欧美日韩无卡一二三区| 午夜啪啪啪免费视频网站| 亚洲中文有码一区二区| 美国黄色aa特黄色视拼| 91嫩草精品少妇97九九| 中字av在线一区二区中字| 正宗欧美在线观看一区二区| 亚洲欧美另类专区第一页| 国产粉嫩粉嫩的在线18观看| 91精品在线播放hd| 国产超碰人人爽人人做夜色资源| 偷拍自拍视频图片免费| 一级白丝美女久久久久| 一区二区人妻丝袜粉嫩| 中文一区二区三区精品视频| 成年人中文字幕视频网| 超碰超碰超碰超碰超碰超| 女人张开双腿让男人捅视频| 日本av都是真做吗| av乱亚洲一区二区三区| 国产在线观看网站资源| av男人天堂精品久久| 伊人青操在线观看视频网站| 99精品视频在线观看专区| 国产a v一区二区三区香蕉| 精品一区二区三区在线免费播放| 国产黑色丝袜视频在线观看下| 少妇人妻不满足中文字幕| 人妻少妇偷人视频一| 女人扒开逼逼让男人操| 成年女人毛片免费在线播放| av中文字幕在线播放| 未满18禁止入内免费视频| 99精品视频中文字幕| av网站资源在线观看| 成人大片精品在线观看| 成年人中文字幕视频网| 丰满雪白人妻人爽16av精品| 都市激情校园春色av| 亚洲va欧美va人人爽午夜 | 富二代av一区二区| av一区二区二十四小时| 美女诱惑福利在线视频| 日韩成人在线电影,| 精品一区二区三区大全| 亚洲欧美另类图片88| 好男人资源在线视频观看社区| 日韩国产精品高清中文在线| av在线播放网站资源| 日本少妇精品bbwbbw| 在线观看高清日韩av| av网址大全在线播放| 丝袜美腿国产在线观看| 麻豆一区二区大豆行情| 1777中文字幕字幕在线播放| 亚洲图片,自拍偷拍网| 国产一级二级三级亚洲| 国产亚洲精品电影aa在线观看| 亚洲av网站在线免费观看| 91人妻人澡人人爽人人精品| 自拍偷拍亚洲黄色照片| 91九色在线视频网站| 成人免费视频国产免费麻豆下| 青娱乐精品视频在线免费观看| 亚洲av网站在线免费观看| 大黑鸡巴 狂插 欧亚小嫩逼| 日韩精品在线播放视频成年人| 国产剧情swag在线观看| 97视频人人人人人性| 国产成人女人毛毛片视频| 182tv在线福利视频| 嗯嗯嗯啊啊啊不要好爽视频| 91人妻精品一区二区三区在线| 9797人人妻人人澡| 亚洲国产精彩中文乱码av| 新超碰97在线观看| 人妻精品久久久久中文字幕19| 又黑又硬又粗又黄又猛| 性感美女一区二区美女| 成人在线视频国产自拍| 国产高清在线免费视频| 亚洲自偷自拍另类性受不了 | 亚洲av好看xx站| 欧洲日韩视频一区二区三区 | 奇米一区二区三区视频在线观看| 超碰在线观看97视频| 登录国产黄色一区二区三区| 亚洲中文字幕有码电影| 色吊最新在线视频免费观看| 国内人人人妻狠狠狠操操| av精选一区二区久久| 亚洲美女乱1区2区3区| 亚洲精品成人a8198| 亚洲国产精品国自产拍av在线| 可以免费看啪啪啪的网站| 久久精品国产亚洲AV牛牛影视| 亚洲精品成人a8198| 亚洲午夜免费精品久久久| 国产精品久久久久精品蜜月| 黄色性网站免费观看| 大香蕉大香蕉在线播放| 日韩av卡一卡二卡三| 91精品久久久久久婷婷高清| 欧美 亚洲 激情 自拍| 三级黄色亚洲成人av| 女人被男人阳具抽插的呻吟视频| 亚洲欧美动漫卡通 另类| 亚洲无码精品中的精品 | 欧美 激情 另类 自拍| 1717精品视频在线观看| 日韩精品一区二区三区中文精| 日韩国产精品高清中文在线| 日日夜夜夜操天天干| 国产成人a一区二区| 隔壁放荡人妻bd完整版| 精品一区二区三区四区激情| 日韩avapp在线| 欧美精品黑人粗大破除| 欧美在线免费污污视频| 欧美日韩精品久久一区二区三区 | 国产麻豆在线av| 在线观看免费黄片欧美| 在线高清视频你懂得| 成人熟女一区二区三区| 大香蕉大香蕉在线播放| 伊人精品在线大香蕉| 亚洲av永久久久久久久蜜桃 | 免费av区在线观看| 一区二区三区欧美高清| 人妻中文字幕在线视频免费观看| 亚洲美女乱1区2区3区| 美女诱惑福利在线视频| 九九热在线这里只有精品| 欧美成人a v在线| heyzo久久综合色88| 日韩精选高清大片在线观看| 狠狠操 在线视频 轻轻草| 手机在线免费视频一区二区三区| 97人妻人人做人碰人人爽一| 亚洲欧美另类图片88| 欧美成年性精品三级网站| 欧美一级特黄aaaaaa片| 91在线免费观看成人| 欧美亚洲校园春色另类| 国自产拍偷拍福利精品免费观看| 五月婷婷免费在线观看视频| 北条麻妃制服丝袜在线播放| 欧美三级一区二区三区四区五区| 欧美熟妇亚洲中文不卡少妇 | 亚洲国产精品国自产拍a∨| 韩国一区二区三区在线观看| 日韩性爱视频无码三级片| 久久久999精品在线| 国产美女视频在线播放| 国产黄色大片在线免费观看| lisaann在线观看| 成人在线视频国产自拍| 不卡黄色免费在线观看| 天天透天天插天天通| 天堂网作爱视频在线播放| 69 久久99精品久久久| 色综合久久加勒比高清剧情| 欧美亚洲三级色图网站| 我用力操你在线视频| 在线免费观看欧美激情视频| 久久一区二区三区杨幂| 久久视频十八岁亚洲精品久久视频 | 国产大神一区二区三区| 在线看片1024你懂得| 国产剧情星空无限传媒| 亚洲av网站在线免费观看| 我用力操你在线视频| 亚洲国产精品国自产拍av在线| 神乃麻美三级在线观看视频| 国产无遮挡精品视频观看| av国产在线观看网站| 国产精品一品二区三区日韩| 中文字幕最新色片av| 免费熟女精品一区二区三区| 中文字幕精品av在线观看| 人人咪咪一区二区三区 | 夜夜操夜夜操夜夜爽| 男人插女人逼app| 大鸡巴爆操美女骚逼| 瑟瑟的网站在线观看| 人人咪咪一区二区三区 | 欧美激情自拍2020| 中文字幕不卡av在线播放| 欧美视频在线观看18| 超碰在线97人人草| 免费av在线中文字幕| 天天色天天爱天天日| 天天操天天湿天天干| 国产专区视频在线观看免费| 欧美黑人天天干夜夜操| 视频在线观看免费99| 日韩性爱视频无码三级片| 亚洲国产中文字幕在线视频| 手机能看的黄色av| 国产美女高清免费av| 性感丝袜美女诱惑大鸡吧| 青青青青青青青青青青青青青草| 欧美142p极品服务| 91久久精一区二区三区大全| 大香蕉大香蕉在线播放| 天天碰天天摸人人看| 人妻中文字幕在线视频免费观看 | av精选一区二区久久| 亚洲欧美另类专区第一页| 91精品在线播放hd| 亚洲av一区视频在线观看| 熟女免费在线观看视频 | 日韩av一区二区三区久久| 欧美久久久久亚洲综合| 亚洲欧美伦理一区二区| 男女精品久久久久久久久久| 老鸭窝最新网址在线| 中文字幕最新色片av| 91精品人妻中文字幕| 国产c片免费观看| 亚洲综合一区二区人妻| 婷婷视频在线观看一区的| 99精品视频中文字幕| 1777中文字幕字幕在线播放| 中文有码一区二区三区| 久操视频精品在线观看| 黄色中文字幕在线观看| 日韩国产亚洲在线视频| 国产精品视频白浆免费网站| 午夜精选视频在线观看| 日日躁夜夜躁狠狠久久av | 亚洲 欧美在线视频| 91免费观看国产精品| 国产精品黄色自拍视频| 伦人伦xxxx国语对白| 狂野黑人性猛交xxxxxx| 人操美女操美女操美女| 男人天堂新在线电影| 自拍偷拍 中文字幕 日韩| x8x8免费在线观看视频| 免费在线国产观看av| 91精彩刺激对白露脸偷拍| 自拍偷拍 中文字幕 日韩| 亚洲日本欧洲一区二区| 国产伦精品三区精品国偷自产在线| 国产黄a三级三级三级三级三级| 美女吃鸡巴黑料破处自慰| 国产精品黄色自拍视频| 东京热av在线播放| 91人妻精品一区二区三区在线| 亚洲人体艺术二区三区视频| 青青操在线视频精品| 精品视频在线视频精品| 亚洲av网站在线免费观看| 亚洲精品综合视频自拍| 亚洲国产精品成人久久动漫| 亚洲av综合久久久久久| 自拍第一页免费视频| 中文字幕第一区久久| 人妻少妇精品视频专区vr| 成人在线视频国产自拍| 内射一对幼嫩无毛妹| 在线观看国产精品123| 欧美日韩国产综合不卡| 正宗欧美在线观看一区二区| 163黄页网在线观看,| 漂亮的人妻不敢呻吟被中出| 色欲天天天久久久综合| 女人看了很爽的一级女毛片| 国产精品亚洲综合视频| 熟女免费在线观看视频| 可以免费看的黄页视频| 欧美亚洲国产校园春色| 在线视频你懂的视频| 亚洲三级这里只有精品| lisaann在线观看| 亚洲国产成人在线观看网址| 黄色性网站免费观看| 亚洲欧美日韩不卡人妻中文字幕| 日本公与妇电影三级| 日韩欧美亚洲一区第一| 亚洲免费淫网站在线观看| 91久久精一区二区三区大全| 中国熟妇丰满大乳大屁股 | 手机能看的黄色av| 91av国产在线观看| 人妻少妇偷人视频一| 欧美午夜不卡一区二区三区| 欧美黑人抱着强干视频| 亚洲欧美一区二区精华液| 天天日天天色天天搞| 长久久久久一区二区高清| 欧美美女视频在线免费看| 成人大片免费看45分钟| 天天爱天天日天天干天天做| 内射一对幼嫩无毛妹| x8x8免费在线观看视频| 超碰chaopeng 国产| 公一区二区三区高清99| 中文字幕久久久久久人妻| 啪啪男女日韩网站蜜桃| 欧美xxxx视频在线| 在线中文字幕综合一区| 女抽插流出张开淫水视频| 欧美精品第5页在线观看视频| 国产欧美精品va在线观看| 亚洲精品乱码久久观看网| 亚洲视频专区在线播放| 老鸭窝在线视频国产| 高清日本wwwcom| 成人18禁视频网站在线看| av网站在线免费浏览| 亚洲福利导航在线视频| 亚洲视频 中文字幕 人妻| 日本视频免费大片| 日本系列变态另类一区二区三区| 亚洲欧美另类图片88| 看男破处女人逼黄色片观看| 日本黄页网络站免费| 国产视频在线精品视频| 日本五十路六十路中出| 不卡精品国产_亚洲人成在线| 青春草在线视频播放免费观看网站 | 一区二区三区精品在线免费视频| 欧美成人a v在线| 人妻寝取少妇乱中文字幕| 男人插女人逼app| 成人大片免费看45分钟| www久久久久久久99| 亚洲国产日韩欧美在线观看 | 亚洲三级伦理在线播放| 寂寞少妇一区二区三区| 午夜网在线观看视频| 日本熟妇wxw日本人妻| 亚洲永久av午夜福利| 99久久精品国产欧美一区二区 | 亚洲天堂男人的天堂av| 青娱乐精品视频在线免费观看| 亚洲精品一区二区三区新线路| 草逼美女逼话多的视频出水| 国产日韩欧美精品久久久一区二区| 韩国美女主播福利视频| 国产传媒中文字幕在线| 免费在线观看国产成人大片| 国产在线观看一区二区不卡| 可以直接在线观看的一区| 老熟妇乱子伦中文字幕视频| 91在线免费观看成人| 亚洲人成青青操免费观看| 日日天天干夜夜夜操狠狠干| av大片在线观看免费| 亚洲一区 成人在线| 99久久夜色精品国产亚洲软件| av影视在线免费观看| 亚洲欧美另类激情综合区动漫| 中文有码一区二区三区| 午夜三级影片免费播放| 伊人情人综合成人久久网小说| 国产欧美日韩一区91| 欧美 日韩 中文 字幕| 免费直接观看的麻豆黄色| 国产欧美精品va在线观看| 日本av都是真做吗| xfplay亚洲资源| 日韩一区二区视频在线看| 亚洲视频 中文字幕 人妻| 99久久精品免费看蜜桃的推荐词| 婷婷av一区二区三区7| 男人天堂在线免费观看| 青青热久免费精品视频21| 日韩伦理一区二区三区有码| 999热这里只有精品视频| 寂寞少妇一区二区三区| 日本女护士久久精品| 青青草精品视频在线免费观看| 91精品人妻中文字幕| 91久久香蕉国产熟女| 欧美日韩国产综合不卡| 少妇高潮尖叫久久久久| 嗯~啊~好舒服在线观看| 国产又黄又粗又硬又大又猛的视频 | 成人a毛片久久免费播放| 人妻少妇精品视频专区vr| 精品国产日韩一区三区| 97人妻碰碰碰久久久| 国产黄a三级三级三级三级三级| 国产乱人伦av麻豆网| 99久久99久久免费精品蜜臀| 欧美熟妇搡bbbb水蜜桃| suv精品一区二区6| 好男人资源在线视频观看社区| 在线观看免费a亚洲| 成人大片精品在线观看| 91人妻人人做人人爽九色全集| 亚洲三级伦理在线播放| 欧美色一区二区三区在线观看| 97色婷婷久久99国产视频| 未满18禁止入内免费视频| 天天操天天摸天天摸| 神乃麻美三级在线观看视频| 啊啊啊操死我轮操视频免费| 午夜国产福利视频一区二区| 天天日天天添天天爽| 啪啪在线视频免费观看| 性色av成年在线观看| 小少妇被大鸡巴操手机在播放| lisaann在线观看| 精品久久久久aⅴ一区二区| 亚洲国产中文字幕在线视频| 99国国视频在线播放| 黑人系列哪个最猛番号| 中文字幕av一区二区三区高| 久久精品亚洲国产| 精品视频在线视频精品| 男的扒开女的下面狂操视频| 日本vvvv操操操| 男人插女人逼app| av蜜桃网在线观看| 又黑又硬又粗又黄又猛| 一区二区三区极品人妻| 日韩中文字幕免费大片| 亚洲中文字幕有码电影| 老鸭窝在线观看免费观看高清版 | 中国熟妇丰满大乳大屁股| 欧美va久久久噜噜噜久久| 欧美黄色免费在线网站| 大鸡巴操的好爽好舒服啊视频 | 色综合久久加勒比高清剧情| 青青草青青草成人免费公开| 国产综合av免费观看| 日韩欧美在线不卡一区二区三区| 国产av综合av国产精品| 丝袜av在线丝袜av天堂国产 | 超级碰碰碰碰碰碰碰碰碰| 十八禁视频一区二区三区四区| 亚洲精品少妇久久久久久| 国产大神一区二区三区| 天天操天天日天天啪| 日韩一区二区视频在线看| 操人妻一区二区三区| 亚洲av综合久久久久久| 欧美丰满熟妇高潮xxxx| 青青草手机视频在线观看| 国产a v一区二区三区香蕉| 蜜桃一区二区17c| 男人天堂新在线电影| 亚洲综合一区二区人妻| 勾引小哥鸡巴操逼视频下载| 亚洲国产精品成人久久动漫| 熟女人妻人妻のhd| 性色av成年在线观看| 在线观看免费a亚洲| 四川操bb操bb操b| 销魂少妇一区二区视频| 国内精品久久久久久久| 亚洲成av中文字幕| 男人把女人捅爽动漫| 国产无遮挡精品视频观看| 自拍分享国产亚洲欧美| 青青草成人免费电影| 69精品人妻一区二区| 日日躁夜夜躁狠狠久久av| 国产av在线一区二区| 亚洲性趣老熟妇高清| 五月婷婷综合久久久| 91国产精品久久久久麻豆| aaa222男人天堂| 人妻a∨在线中文字幕| av中文字幕高清在线| 天天射天天日天天干天天舔| 一级女人色又黄毛片女人| 亚洲成年人三级电影| 少妇内射的视频一区二区| 91亚洲国产成人久久| 粉嫩av入口一区二区三区| 五月天亚洲精品综合网| www国产亚洲天堂| 人妻天天爽夜夜爽麻豆av| 日韩不伦高清一区二区三区| 亚洲va欧美va人人爽午夜| 在线视频 国产 日韩 欧美| av网址大全在线播放 | 欧美一区,二区三区高清视频| 99久久国产成人免费网站| 在线观看国产精品123| 色噜噜在线综合亚洲欧美| 亚洲精品久久久久久久久久蜜桃| 国产高清免费在线视频| 老师让我插进去69AV| av乱亚洲一区二区三区| 国产精品精品3d动漫| 日韩无码成人电影一区二区| 一区二区三区四区免费福利视频 | 在线人妻视频网站免费| 欧美黑人天天干夜夜操| 在线视频无码理论片| 亚洲伊人av 综合福利| 99热这里只有的精品666 | Av资源站中文字幕| 日本v片 中文字幕| 两个人午夜免费看视频| 深夜亚洲精品免费福利你懂的| 久草免费资源视频在线观看| 丰满人妻被猛烈进入中文字幕四川| 欧美丰满熟妇高潮xxxx| 精品人妻一区三区三区| 成人福利电影免费网址| 日韩成人综艺在线播放| av国产在线观看网站| 2020中文字幕在线播放| 福利视频国产在线在线观看| Av资源站中文字幕| 操女人下阴黄色一级视频| 自拍偷拍 中文字幕 日韩| 熟女人妻人妻のhd| 国产粉嫩粉嫩的在线18观看| 东方av在线免费进入| 欧美一区二区蜜桃视频| 亚洲欧美动漫卡通 另类| 中字av在线一区二区中字| 欧美,日本中文高清视频| 狂野小农民在线高清| 五月激情四射丁香婷婷激情四射| av一区二区二十四小时| 国产精品爽黄69天堂ai蜜乳| 老司机免费福利视频网| 日本 久久久 香蕉| 91久久精品视频91| 人操美女操美女操美女| 女人扒开逼逼让男人操| 青青热久免费精品视频21| 青青青青青青青青草青青| 国产av大全网站天堂| 隔壁老王国产在线观看| 美女草草影院在线观看视频| av在线手机观看一区二区三区| 午夜网在线观看视频| 久久精品亚洲国产| 伊人情人综合成人久久网小说| av一区二区三区蜜臀| 91精品久久久久久婷婷高清 | 起碰97视频在线播放| 国内人人人妻狠狠狠操操| 干 白虎 少妇 嫩 逼 视频| 人人妻人人妻人人妻精品| 欧美一级性生活片人与动物 | 免费观看视频一区,二区,三区| 成人福利电影免费网址| 天堂网作爱视频在线播放| 男女啪啪啪网站入口| 国产精品自拍亚洲春色| 亚洲另类熟女国产精品老| 好的一级毛片免费毛片直播| 在线观看国产影片| 五月婷婷丁香花激情网| 日韩精选高清大片在线观看| 亚洲天堂av插插插| 在线视频 国产 日韩 欧美| 成年女人毛片免费在线播放| 性感丝袜美女诱惑大鸡吧| 精品人人妻人人澡人人爽| 91久久香蕉国产熟女| 亚洲免费观看小视频| 91久久精一区二区三区大全| 成av一区二区三区久久| 亚洲精品1234区在线看| 极品国模sm镣铐调教| 午夜精选视频在线观看| 天天操天天射天天综合网| 人妻天天操avxx| 欧美熟妇搡bbbb水蜜桃| 天天干天天日天天超| 日本很黄很黄的动态视频| 久久久激情视频网站| 中文一区二区三区精品视频| 超碰在线观看97视频| 91国内精品视频在线| 一区二区人妻丝袜粉嫩| 97人妻碰碰碰久久久| 97超碰在线cao| 五月婷婷综合久久久| 丝袜美腿视频诱惑亚洲| 丝袜av在线丝袜av天堂国产| 国产成人a一区二区| 二根鸡巴日一个穴视频| lisaann在线观看| av一区二区三区蜜臀| 夭天曰天天躁东京热天天摸| 女人样男人用大鸡巴操她的逼逼| 亚洲成av中文字幕| 天天睡天天摸天天添天天日天天射| 国产高清在线免费视频| 97人妻碰碰碰久久久| 成人18禁视频网站在线看| 公一区二区三区高清99| 天天操天天射天天综合网| 免费观看视频一区,二区,三区| 亚洲无码精品中的精品 | 欧美亚洲三级色图网站| 日韩无码成人电影一区二区| 国产高清免费在线视频| 在线人妻视频网站免费| 在线观看小视频国产| 欧美日韩国产综合不卡| 啪啪啪免费亚洲精品网站| 9色自拍视频在线观看| 亚洲免费观看高清在线| 伊人青青青在线观看| 69精品人妻一区二区| r人人妻人人澡人人爽| 特黄特色大片观看免费| 欧美日韩国产在线观看了| 欧美,偷拍,另类,综合| 精品无人区高清免费看| 成人在线视频国产自拍| 77777蜜臀精品久久综合| 人妻熟一区二区三区四区不卡| 人妻a∨在线中文字幕| 视频你懂得在线观看| 超级碰碰碰碰碰碰碰碰碰| 男人天堂地址在线播放| 隔壁老王国产在线观看| 久久精品国产亚洲AV牛牛影视| 在线中文字幕综合一区| 人妻熟女一区二区aⅴ佐佐木明希| 一区二区三区国产精选在线播放| 五月天亚洲精品综合网| 精品一区二区三区在线免费播放| 国产剧情swag在线观看| 2020中文字幕在线播放| 大肉大捧一进一出免费视频网址| 男人爽爽女人的视频一区二区三区 | 999久久久无码精品免费看片| 亚洲视频免费观看不卡| 午夜三级影片免费播放| 成人午夜伦理在线观看| 超碰chaopeng 国产| 青青热久免费精品视频21| 特黄特猛aaaaaaaaa片| 人妻a∨在线中文字幕| 人妻熟妇丰满不伦一区二区三区| 99国国视频在线播放| 成年女人毛片免费在线播放| 国模视频写真一区二区| 五月天免费在线观看| 韩国美女主播福利视频| 公一区二区三区高清99| 99麻豆精品国产自产在线观看| 中国福利在线黄色片| 在线高清视频你懂得| 亚洲国产精品国自产拍av在线| 日本女护士久久精品| 天天睡天天摸天天添天天日天天射| 日韩国产精品高清中文在线| 欧美福利专区一区二区三区| 销魂少妇一区二区视频| 99久久夜色精品国产亚洲软件| 精品国产污污免费网站aⅴ17| 二亚洲女同性同志熟女| 天天操天天色天天天| 国产熟女一区二区三区四| 欧美一级黄片视频免费| 国产亚洲精品电影aa在线观看| 亚洲av性色在线观看黄色| 青青青青青青青青草青青| 大肉大捧一进一出免费视频网址| 隔壁老王国产在线观看| 亚洲小说区图片另类春色| 日日躁夜夜躁狠狠久久av| 91 chinese 在线播放| 熟女一区二区三区四区五区视频| 亚洲精品成人a8198| 日韩精选高清大片在线观看| 十八禁视频一区二区三区四区| 99精品热视频在线观看| 亚洲av一区视频在线观看| 91免费观看国产精品| 超碰超碰超碰超碰超碰超| 亚洲国产日韩欧美在线观看 | 欧美日韩精品久久一区二区三区| 亚洲日产av一区二区在线| 亚洲国产日韩欧美在线观看| 欧洲野外激情性视频| 亚洲真人性在线观看| 亚洲小说区图片另类春色| 99精品国产免费久久久久久| 日本五十路六十路中出| 天天干天天日天天超| 操白嫩人妻少妇真爽视频| 欧美激情在线观看一区| 免费av区在线观看| 日本熟妇丰满厨房55| 青青操成人免费在线视频| 欧美黑人抱着强干视频| 国产情侣激情在线对白| 163黄页网在线观看,| 五月天免费在线观看| 亚洲情品中文字幕人妻久久久边| 国产白丝美女在线网站| 欧美1234不卡视频| 性感美女一区二区美女| 污污污视频在线观看91| 91人妻精品一区二区三区在线| 丁香激情五月天综合网| av国产在线观看网站| 二亚洲女同性同志熟女| 亚洲免费国产在线日韩| 一区二区三区四区免费福利视频| 狠狠躁日日躁夜夜躁视频| 青娱乐精品视频在线免费观看| 天天舔天天做天天爱| 丰满的女教师bd视频| 69 久久99精品久久久| 91大屁股人妻porn| 亚洲国产精品日日夜夜| 亚洲国产中文字幕在线视频 | 1777中文字幕字幕在线播放 | 日韩毛片综合在线观看网站| 国产乱子伦一区=区三区| 国产熟女一区二区三区四| 男人插女人逼app| 欧美综合自拍亚洲综合图区逼欠插| 亚洲男人天堂111117av| 日本伦理在线免费视频| 亚洲av男人的天堂久久久| 人妻寝取少妇乱中文字幕| av在线播放网站资源| 手机能看的黄色av| 久精彩视频免费观看| 欧美精品乱码久久久久久| 亚洲天堂都市激情av| 99久久精品美女高潮喷水| 亚洲国产精品成人久久动漫| 综合另类小说欧美另类图片| aaa222男人天堂| 亚洲男人天堂111117av| 美女 激情 欧美 日韩| 成人大片精品在线观看| av一av一av中文字幕| 国产国产午夜全部视频| 成人大片精品在线观看| 少妇美女大极品内射| 日本不卡少妇视频在线观看| 日本av高清免费观看| 午夜福利啪啪视频免费看| 亚洲天堂一二三四在线播放| 91人妻精品动漫一区二区三区| 夭天曰天天躁东京热天天摸| 1717精品视频在线观看| 日韩av中文字幕网址| 天天扣天天日天天摸| 亚洲一区二区综合网| 少妇人妻中文字幕专区视频| 国产熟妇一区二区三区av| 日韩国产精品高清中文在线| 五月天免费在线观看| 国产美女视频在线播放| 99热6在线播放免费| 最新日韩成人毛片在线| 农村女人91熟女熟妇| mm在线视频观看免费观看| 丝袜美腿色诱视频在线观看| 免费av在线中文字幕| Av资源站中文字幕| 黄色 成年人 免费观看| 古典武侠校园春色亚洲| ai给视频自动加字幕| 天天操天天射天天综合网| 久久精品国产9久久综合| 熟女免费在线观看视频| 五月天丁香婷久久爱| 蜜桃aⅴ噜噜一区二区三区网址 | 亚洲综合另类小说色区色噜噜,| 亚洲免费观看高清在线| 国产专区视频在线观看免费| 成人福利视频一区二区| 精品一区二区三区大全| 亚洲精品少妇久久久久久|