融云首席架構(gòu)師李淼:直播互動(dòng)系統(tǒng)的設(shè)計(jì)與實(shí)踐
原創(chuàng)【51CTO.com原創(chuàng)稿件】社交垂直化的今天,APP利用垂直社交關(guān)系鏈來提升用戶黏性是通往成功的重要手段,選擇直播互動(dòng)是打通陌生人社交關(guān)系鏈的最佳方式。基于直播業(yè)務(wù)場景的實(shí)時(shí)特性,直播互動(dòng)目前主要通過聊天室產(chǎn)品實(shí)現(xiàn)。看似聊天室只是一個(gè)功能,但消息處理是最大的難點(diǎn)。在直播過程中,出現(xiàn)閃退、卡頓等問題,會(huì)非常影響用戶體驗(yàn)。 當(dāng)用戶量達(dá)到一定規(guī)模,高并發(fā)之下,IM功能的穩(wěn)定性將會(huì)面對(duì)前所未有的考驗(yàn)。基于此,記者在51CTO主辦的WOT2017全球架構(gòu)與運(yùn)維技術(shù)峰會(huì)上,對(duì)融云首席架構(gòu)師李淼進(jìn)行了專訪,話題主要圍繞直播互動(dòng)系統(tǒng)的設(shè)計(jì)與實(shí)踐展開。
直播互動(dòng)系統(tǒng)的一些特性
李淼·融云首席架構(gòu)師兼聯(lián)合創(chuàng)始人
融云于14年成立之時(shí),只提供聊天室這樣的服務(wù),國內(nèi)直播平臺(tái)還未大批興起。15年,源于大量客戶對(duì)直播互動(dòng)的需求,融云預(yù)見直播平臺(tái)未來會(huì)有很好的前景,開始與客戶積極交流來挖掘需求,最終將聊天室轉(zhuǎn)變?yōu)橹辈セ?dòng)平臺(tái)。經(jīng)歷了16年一個(gè)完整的直播元年,直播互動(dòng)系統(tǒng)也正式步入了成熟期。
當(dāng)問及直播互動(dòng)系統(tǒng)的特性,李淼表示:
其一,直播互動(dòng)平臺(tái)的用戶量實(shí)際上是沒有上限的,因?yàn)椴豢赡苋ハ拗埔粋€(gè)主播加入觀眾的成員數(shù)量。
其二,通過把消息進(jìn)行分級(jí)控制的方式來保證禮物、紅包等消息傳輸?shù)目煽啃浴?/p>
其三,瞬時(shí)消息吞吐量大,融云某個(gè)聊天室曾經(jīng)一秒鐘產(chǎn)生過近千萬的消息。
其四,就是針對(duì)伸縮及穩(wěn)定性方面的高要求。
消息平臺(tái)的邏輯設(shè)計(jì)及這樣做的原因
消息是直播互動(dòng)系統(tǒng)最重要的元素,消息的處理做的好不好會(huì)直接影響用戶的體驗(yàn)。融云的消息平臺(tái)邏輯設(shè)計(jì)是怎樣的呢?
如上圖,李淼用一張時(shí)序圖針對(duì)這個(gè)問題進(jìn)行了解答。A客戶端是發(fā)消息方、服務(wù)端是融云整個(gè)后端平臺(tái),B客戶端是接收消息方。首先,客戶端向服務(wù)端發(fā)送消息,服務(wù)端接收消息先進(jìn)行消息驗(yàn)證,消息驗(yàn)證里面包含了高危詞、敏感詞的過濾,反垃圾系統(tǒng)對(duì)消息進(jìn)行反垃圾的過濾,以及權(quán)限驗(yàn)證,當(dāng)消息通過之后,對(duì)消息優(yōu)先進(jìn)行存儲(chǔ),之后會(huì)給A客戶端返回應(yīng)答,告知消息已經(jīng)發(fā)送成功。這時(shí)服務(wù)端會(huì)遍歷成員分發(fā)通知。值得注意的是,現(xiàn)在還沒有向客戶端發(fā)送消息實(shí)體,當(dāng)接收客戶端接收消息通知時(shí),會(huì)從自己本地存儲(chǔ)里面拿到當(dāng)前直播間里面最新的消息版本號(hào),同時(shí)向服務(wù)器發(fā)起同步請(qǐng)求,服務(wù)器獲取客戶提交的版本號(hào)之后,會(huì)以這個(gè)版本號(hào)為起點(diǎn)到最新版本號(hào)把所有消息全部拿回來返回給客戶端,客戶端收到這個(gè)消息進(jìn)行消息展示以及存儲(chǔ)這個(gè)最新版本號(hào)。整個(gè)通信流程,版本號(hào)獲取方式,跟常用版本控制軟件比較類似。
之所以把流程變得這么復(fù)雜,在發(fā)送完通知之后再同步消息,主要原因如下:
- 通知的推送無需服務(wù)質(zhì)量保證
- 服務(wù)器端存儲(chǔ)的消息順序與到達(dá)的客戶端順序一致
- 當(dāng)消息密集時(shí)可以將多條消息進(jìn)行合并
- 可以控制下發(fā)的消息條數(shù)
- 以存儲(chǔ)分級(jí)實(shí)現(xiàn)消息分級(jí)
消息平臺(tái)在服務(wù)端實(shí)現(xiàn)細(xì)節(jié)及最佳應(yīng)用實(shí)踐
當(dāng)問及直播消息系統(tǒng)于服務(wù)端的實(shí)現(xiàn)細(xì)節(jié),李淼主要從數(shù)據(jù)預(yù)處理、消息分級(jí)、消息存儲(chǔ)和消息分發(fā)隊(duì)列四方面進(jìn)行了介紹,但在實(shí)際服務(wù)開發(fā)過程中,優(yōu)化還有很多。
數(shù)據(jù)預(yù)處理。當(dāng)服務(wù)端接收消息之后優(yōu)先對(duì)數(shù)據(jù)進(jìn)行序列化以及存儲(chǔ),序列化消息和要下發(fā)的客戶端數(shù)據(jù)要保持一致,通過這種預(yù)處理的方式,CPU的使用率在當(dāng)前基礎(chǔ)上降低了30%。
消息分級(jí)存儲(chǔ)。根據(jù)消息類型按照中、高、低序列進(jìn)行分級(jí)存儲(chǔ)。
Skiplist轉(zhuǎn)化為環(huán)形隊(duì)列存儲(chǔ)。每條消息有唯一且遞增版本號(hào),消息按照版本號(hào)順序存儲(chǔ)。這樣的數(shù)據(jù)在內(nèi)存存儲(chǔ)情況下,跳表是一種非常合適的數(shù)據(jù)結(jié)構(gòu)。但是,跳表時(shí)間復(fù)雜度和空間復(fù)雜度比較大,同時(shí)往跳表中插入數(shù)據(jù)時(shí)使用的鎖范圍非常大,會(huì)對(duì)服務(wù)器產(chǎn)生一些額外的開銷。之后,由跳表演進(jìn)成一種類似環(huán)形隊(duì)列的數(shù)據(jù)結(jié)構(gòu),對(duì)服務(wù)器性能開銷提升很多。
Map與隊(duì)列構(gòu)建復(fù)合數(shù)據(jù)結(jié)構(gòu),降低無意義消費(fèi)。服務(wù)端下發(fā)通知,對(duì)于通知來講在這一時(shí)刻無論有多少條消息,每個(gè)用戶只有一條通知,通過Map與隊(duì)列構(gòu)建這樣的復(fù)合結(jié)構(gòu)進(jìn)行存儲(chǔ)。隊(duì)列里面存儲(chǔ)是數(shù)據(jù)的指針,Map存儲(chǔ)用于下發(fā)的通知實(shí)體,Map使用的key為用戶標(biāo)識(shí),這樣可以降低無意義的消費(fèi)。
融云最新版線上直播互動(dòng)平臺(tái)的整體架構(gòu)
直播互動(dòng)平臺(tái)的2.1架構(gòu)
談到直播平臺(tái)的架構(gòu),李淼表示,如上圖,融云目前正在使用的架構(gòu)分為連接層、業(yè)務(wù)層和存儲(chǔ)層等。連接層和業(yè)務(wù)層構(gòu)建成整個(gè)大的集群,然后進(jìn)行服務(wù)。連接層主要是負(fù)責(zé)客戶端與服務(wù)器保持長連接,同時(shí)將客戶端的協(xié)議與內(nèi)部服務(wù)的協(xié)議進(jìn)行相互轉(zhuǎn)化。
業(yè)務(wù)層負(fù)責(zé)IM相關(guān)業(yè)務(wù)處理,業(yè)務(wù)層采用的是微服務(wù)架構(gòu),線上服務(wù)有40多個(gè)類型,但對(duì)于直播互動(dòng)平臺(tái)包含如下三項(xiàng)服務(wù):
第一:上行控制服務(wù),主要目的是用于處理接收的上行客戶端的消息,進(jìn)行敏感詞和高危詞的過濾。這個(gè)服務(wù)的負(fù)載方式采用的是隨機(jī)分配的負(fù)載方式。
第二,直播服務(wù),負(fù)責(zé)維護(hù)直播間成員關(guān)系和負(fù)責(zé)接收上行控制服務(wù)給它的消息,上行控制服務(wù)會(huì)先期進(jìn)行消息拋棄,拋棄到直播服務(wù)可以接收的范圍之內(nèi),將消息下發(fā)到直播服務(wù),直播服務(wù)再廣播到直播消息服務(wù)。
第三:直播消息服務(wù),負(fù)責(zé)給用戶進(jìn)行分發(fā)通知,是以用戶ID進(jìn)行一致的哈希方式進(jìn)行負(fù)載。每個(gè)服務(wù)節(jié)點(diǎn)包含部分用戶關(guān)系。整個(gè)直播消息服務(wù)構(gòu)建了一個(gè)整體成員關(guān)系,他等同于直播消息服務(wù)上的一個(gè)節(jié)點(diǎn)。這層除分發(fā)通知外,還負(fù)責(zé)客戶端同步拉取獲取的消息。
寫在最后:
針對(duì)關(guān)于融云在直播互動(dòng)核心競爭力的問題,李淼老師,這樣回答:“ 我們?nèi)谠铺峁┑氖侵辈セ?dòng)平臺(tái),是一個(gè)基礎(chǔ)PAAS服務(wù),本身并不會(huì)去做直接面對(duì)用戶的直播APP。融云最大的特點(diǎn)就是認(rèn)準(zhǔn)一件事死磕,不停優(yōu)化服務(wù)提升能力,之后再反哺給客戶。我們經(jīng)常與客戶進(jìn)行溝通,收集他們對(duì)直播互動(dòng)這塊的需求。需求拿來之后,產(chǎn)品人員會(huì)對(duì)這些需求進(jìn)行抽象提煉,將他們變成平臺(tái)能力,再提供給更多的客戶。通過這種方式,我們擁有了豐富功能以滿足客戶的業(yè)務(wù)需要,同樣對(duì)新客戶也給他們提供了更多的產(chǎn)品可能性。性能上也得益于現(xiàn)在整個(gè)后端研發(fā)平臺(tái)的人才梯隊(duì)的建設(shè),融云目前有很多高端人才負(fù)責(zé)這一塊的工作,同時(shí)我們擁有大量各種業(yè)務(wù)模式的客戶,也遇到過各類場景下產(chǎn)生的突發(fā)事件,通過這些問題解決和能力提升,所以在性能完全可以滿足客戶的需要”。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】