<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 494, comments - 13, trackbacks - 0, articles - 1

    本文由融云技術(shù)團(tuán)隊(duì)原創(chuàng)分享,原題“聊天室海量消息分發(fā)之消息丟棄策略”,內(nèi)容有修訂。

    1、引言

    隨著直播類應(yīng)用的普及,尤其直播帶貨概念的風(fēng)靡,大用戶量的直播間場(chǎng)景已然常態(tài)化。

    大用戶量直播間中的實(shí)時(shí)互動(dòng)是非常頻繁的,具體體現(xiàn)在技術(shù)上就是各種用戶聊天、彈幕、禮物、點(diǎn)贊、禁言、系統(tǒng)通知等實(shí)時(shí)消息(就像下圖這樣)。

    ▲ 某電商APP的賣貨直播間

    如此大量的實(shí)時(shí)消息,在分發(fā)時(shí)如何處理才能不至于把服務(wù)端搞垮,而到了客戶端時(shí)也不至于讓APP出現(xiàn)瘋狂刷屏和卡頓(不至于影響用戶體驗(yàn)),這顯然需要特殊的技術(shù)手段和實(shí)現(xiàn)策略才能應(yīng)對(duì)。

    其實(shí),直播間中的實(shí)時(shí)消息分發(fā),在技術(shù)上是跟傳統(tǒng)的在線聊天室這種概念是一樣的,只是傳統(tǒng)互聯(lián)網(wǎng)時(shí)代,聊天室同時(shí)在線的用戶量不會(huì)這么大而已,雖然量級(jí)不同,但技術(shù)模型是完全可以套用的。

    本文將基于直播技術(shù)實(shí)踐的背景,分享了單直播間百萬(wàn)用戶在線量的實(shí)時(shí)消息分發(fā)的技術(shù)經(jīng)驗(yàn)總結(jié),希望帶給你啟發(fā)。

    學(xué)習(xí)交流:

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

    - 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK 

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

    2、系列文章

    本文是系列文章中的第6篇:

    3、技術(shù)挑戰(zhàn)

    我們以一個(gè)百萬(wàn)人觀看的直播間為例進(jìn)行分析,看看需要面臨哪些技術(shù)挑戰(zhàn)。

    1)在直播中會(huì)有一波一波的消息高峰,比如直播中的“刷屏”消息,即大量用戶在同一時(shí)段發(fā)送的海量實(shí)時(shí)消息,一般情況下此類“刷屏”消息的消息內(nèi)容基本相同。如果將所有消息全部展示在客戶端,則客戶端很可能出現(xiàn)卡頓、消息延遲等問(wèn)題,嚴(yán)重影響用戶體驗(yàn)。

    2)海量消息的情況下,如果服務(wù)端每條消息都長(zhǎng)期存儲(chǔ)將導(dǎo)致服務(wù)緩存使用量激增,使得內(nèi)存、存儲(chǔ)成為性能瓶頸。

    3)在另外一些場(chǎng)景下,比如直播間的房間管理員進(jìn)行操作后的通知消息或者系統(tǒng)通知,一般情況下這類消息是較為重要的,如何優(yōu)先保障它的到達(dá)率。

    基于這些挑戰(zhàn),我們的服務(wù)需要做一個(gè)基于業(yè)務(wù)場(chǎng)景的優(yōu)化來(lái)應(yīng)對(duì)。

    4、架構(gòu)模型

    我們的架構(gòu)模型圖如下:

     

    如上圖所示,下面將針對(duì)主要服務(wù)進(jìn)行簡(jiǎn)要說(shuō)明。

    1)直播間服務(wù):

    主要作用是:緩存直播間的基本信息。包括用戶列表、禁言/封禁關(guān)系、白名單用戶等。

    2)消息服務(wù):

    主要作用是:緩存本節(jié)點(diǎn)需要處理的用戶關(guān)系信息、消息隊(duì)列信息等。

    具體說(shuō)是以下兩個(gè)主要事情。

    直播間用戶關(guān)系同步:

    • a)成員主動(dòng)加入退出時(shí):直播間服務(wù)同步至==> 消息服務(wù);
    • b)分發(fā)消息發(fā)現(xiàn)用戶已離線時(shí):消息服務(wù)同步至==> 直播間服務(wù)。

    發(fā)送消息:   

    • a)直播間服務(wù)經(jīng)過(guò)必要校驗(yàn)通過(guò)后將消息廣播至消息服務(wù);
    • b)直播間服務(wù)不緩存消息內(nèi)容。

    3)Zk(就是 Zookeeper 啦):

    主要作用就是:將各服務(wù)實(shí)例均注冊(cè)到 Zk,數(shù)據(jù)用于服務(wù)間流轉(zhuǎn)時(shí)的落點(diǎn)計(jì)算。

    具體就是:

    • a)直播間服務(wù):按照直播間 ID 落點(diǎn);
    • b)消息服務(wù):按照用戶 ID 落點(diǎn)。

    4)Redis:

    主要作為二級(jí)緩存,以及服務(wù)更新(重啟)時(shí)內(nèi)存數(shù)據(jù)的備份。

    5、消息分發(fā)總體方案

    直播間服務(wù)的消息分發(fā)完整邏輯主要包括:消息分發(fā)流程和消息拉取流程。

    5.1 消息分發(fā)流程

    如上圖所示,我們的消息分發(fā)流程主要是以下幾步:

    • 1)用戶 A 在直播間中發(fā)送一條消息,首先由直播間服務(wù)處理;
    • 2)直播間服務(wù)將消息同步到各消息服務(wù)節(jié)點(diǎn);
    • 3)消息服務(wù)向本節(jié)點(diǎn)緩存的所有成員下發(fā)通知拉取;
    • 4)如上圖中的“消息服務(wù)-1”,將向用戶 B 下發(fā)通知。

    另外,因?yàn)橄⒘窟^(guò)大,我們?cè)谠诜职l(fā)的過(guò)程中,是具有通知合并機(jī)制的,通知合并機(jī)制主要提現(xiàn)在上述步驟 3 中。

    上述步驟3的通知合并機(jī)制原理如下:

    • a)將所有成員加入到待通知隊(duì)列中(如已存在則更新通知消息時(shí)間);
    • b)下發(fā)線程,輪訓(xùn)獲取待通知隊(duì)列;
    • c)向隊(duì)列中用戶下發(fā)通知拉取。

    通過(guò)通知合并機(jī)制,我們可以可保障下發(fā)線程一輪只會(huì)向同一用戶發(fā)送一個(gè)通知拉取,即多個(gè)消息會(huì)合并為一個(gè)通知拉取,從面有效提升了服務(wù)端性能且降低了客戶端與服務(wù)端的網(wǎng)絡(luò)消耗。

    PS:以上通知合并機(jī)制,在大消息量的情況下,非常適合使用Actor分布式算法來(lái)實(shí)現(xiàn),有興趣的同學(xué)可以進(jìn)一步學(xué)習(xí)《分布式高并發(fā)下Actor模型如此優(yōu)秀》、《分布式計(jì)算技術(shù)之Actor計(jì)算模式》。

    5.2 消息拉取流程

     

    如上圖所示,我們的消息拉取流程主要是以下幾步:

    • 1)用戶 B 收到通知后將向服務(wù)端發(fā)送拉取消息請(qǐng)求;
    • 2)該請(qǐng)求將由“消息服務(wù)-1”節(jié)點(diǎn)處理;
    • 3)“消息服務(wù)-1”將根據(jù)客戶端傳遞的最后一條消息時(shí)間戳,從消息隊(duì)列中返回消息列表(原理詳見下圖 ▼);
    • 4)用戶 B 獲取到新的消息。

    上述步驟 3 中拉取消息的具體邏輯如下圖所示:

    6、消息分發(fā)的丟棄策略

    對(duì)于直播間中的用戶來(lái)說(shuō),很多消息其實(shí)并沒(méi)有太多實(shí)際意義,比如大量重復(fù)的刷屏消息和動(dòng)態(tài)通知等等,為了提升用戶體驗(yàn),這類消息是可以有策略地進(jìn)行丟棄的(這是跟IM中的實(shí)時(shí)聊天消息最大的不同,IM中是不允許丟消息的)。

    PS:直播間中消息分發(fā)的丟棄策略,跟上節(jié)中的通知合并機(jī)制一起,使得直接間海量消息的穩(wěn)定、流暢分發(fā)得以成為可能。

    我們的丟棄策略主要由以下3部分組成:

    • 1)上行限速控制(丟棄)策略;
    • 2)下行限速控制(丟棄)策略;
    • 3)重要消息防丟棄策略。

    如下圖所示:

    我們來(lái)逐個(gè)解釋一下。

    1)上行限速控制(丟棄)策略:

    針對(duì)上行的限速控制,我們默認(rèn)是 200 條/秒,根據(jù)業(yè)務(wù)需要可調(diào)整。達(dá)到限速后發(fā)送的消息將在直播間服務(wù)丟棄,不再向各消息服務(wù)節(jié)點(diǎn)同步。

    2)下行限速控制(丟棄)策略:

    針對(duì)下行的限速控制,即對(duì)消息環(huán)形隊(duì)列(見“5.2 消息拉取流程”中的拉取消息詳細(xì)邏輯圖)長(zhǎng)度的控制,達(dá)到最大值后最“老”的消息將被淘汰丟棄。

    每次下發(fā)通知拉取后服務(wù)端將該用戶標(biāo)記為“拉取中”,用戶實(shí)際拉取消息后移除該標(biāo)記。

    拉取中標(biāo)記的作用:例如產(chǎn)生新消息時(shí)用戶具有拉取中標(biāo)記,如果距設(shè)置標(biāo)記時(shí)間在 2 秒內(nèi)則不會(huì)下發(fā)通知(降低客戶端壓力,丟棄通知未丟棄消息),超過(guò) 2 秒則繼續(xù)下發(fā)通知(連續(xù)多次通知未拉取則觸發(fā)用戶踢出策略,不在此贅述)。

    因此消息是否被丟棄取決于客戶端拉取速度(受客戶端性能、網(wǎng)絡(luò)影響),客戶端及時(shí)拉取消息則沒(méi)有被丟棄的消息。

    3)重要消息防丟棄策略:

    如前文所述:在直播間場(chǎng)景下對(duì)某些消息應(yīng)具有較高優(yōu)先級(jí),不應(yīng)丟棄。

    例如:直播間的房間管理員進(jìn)行操作后的通知消息或者系統(tǒng)通知。

    針對(duì)此場(chǎng)景:我們?cè)O(shè)置了消息白名單、消息優(yōu)先級(jí)的概念,保障不丟棄。如本節(jié)開始的圖所示,消息環(huán)形隊(duì)列可以為多個(gè),與普通直播間消息分開則保障了重要消息不丟棄。

    通過(guò)上述“1)上行限速控制(丟棄)策略”和“下行限速控制(丟棄)策略”保障了:

    • 1)客戶端不會(huì)因?yàn)楹A肯⒊霈F(xiàn)卡頓、延遲等問(wèn)題;
    • 2)避免出現(xiàn)消息刷屏,肉眼無(wú)法查看的情況;
    • 3)同時(shí)降低了服務(wù)端存儲(chǔ)壓力,不會(huì)因?yàn)楹A肯⒊霈F(xiàn)內(nèi)存瓶頸從而影響服務(wù)。

    7、寫在最后

    隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,直播間的實(shí)時(shí)消息業(yè)務(wù)模型和壓力也在不停地?cái)U(kuò)展變化,后續(xù)可能還會(huì)遇到更多的挑戰(zhàn),我們的服務(wù)會(huì)與時(shí)俱進(jìn)、跟進(jìn)更優(yōu)的方案策略進(jìn)行應(yīng)對(duì)。

    附錄:多人群聊天技術(shù)文章

    [1]《IM單聊和群聊中的在線狀態(tài)同步應(yīng)該用“推”還是“拉”?

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

    [3]《移動(dòng)端IM中大規(guī)模群消息的推送如何保證效率、實(shí)時(shí)性?

    [4]《現(xiàn)代IM系統(tǒng)中聊天消息的同步和存儲(chǔ)方案探討

    [5]《關(guān)于IM即時(shí)通訊群聊消息的亂序問(wèn)題討論

    [6]《IM群聊消息的已讀回執(zhí)功能該怎么實(shí)現(xiàn)?

    [7]《IM群聊消息究竟是存1份(即擴(kuò)散讀)還是存多份(即擴(kuò)散寫)?

    [8]《一套高可用、易伸縮、高并發(fā)的IM群聊、單聊架構(gòu)方案設(shè)計(jì)實(shí)踐

    [9]《IM群聊機(jī)制,除了循環(huán)去發(fā)消息還有什么方式?如何優(yōu)化?

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

    [11]《阿里釘釘技術(shù)分享:企業(yè)級(jí)IM王者——釘釘在后端架構(gòu)上的過(guò)人之處

    [12]《IM群聊消息的已讀未讀功能在存儲(chǔ)空間方面的實(shí)現(xiàn)思路探討

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

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

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



    作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時(shí)通訊開發(fā)交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時(shí)是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級(jí)移動(dòng)端即時(shí)通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處(也可前往 我的52im.net 找到我)。


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 狠狠色伊人亚洲综合网站色| 男女做羞羞的事视频免费观看无遮挡| 亚洲综合精品成人| 亚洲国产精品一区二区第一页| 国产男女猛烈无遮档免费视频网站| 日本免费xxxx| 久久永久免费人妻精品| 久久成人永久免费播放| 成人免费视频69| 日本免费久久久久久久网站| 久青草国产免费观看| 亚洲Aⅴ在线无码播放毛片一线天| 亚洲一区二区三区深夜天堂| 亚洲日本一区二区| 久久精品亚洲中文字幕无码网站 | 亚洲综合小说久久另类区 | 国产成人无码区免费内射一片色欲| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲αv在线精品糸列| 亚洲综合精品香蕉久久网| 亚洲人成网站色在线入口| 国产一级大片免费看| 日韩特黄特色大片免费视频| 岛国av无码免费无禁网站| 人与禽交免费网站视频| 日本最新免费网站| 两性刺激生活片免费视频| 91香蕉视频免费| 成年人在线免费看视频| 色妞WWW精品免费视频| 成人免费视频观看无遮挡| 在线免费视频一区| 日本黄色免费观看| 亚洲成a人片在线播放| 久久久久亚洲精品男人的天堂 | 国产免费牲交视频免费播放| 两性色午夜视频免费播放| 亚洲国产精品无码久久| 亚洲变态另类一区二区三区| 成a人片亚洲日本久久| 九九九精品视频免费|