大神級(jí)項(xiàng)目!300分鐘擼一個(gè)基于高并發(fā)Netty的NIO框架
大家工作生活中可能經(jīng)常使用微信、釘釘、微博這樣的軟件,作為技術(shù)開發(fā)的你有沒有想過它們后端的技術(shù)架構(gòu)是如何做的?

IM核心功能
一般來說,釘釘和微信后端主要就是一個(gè)IM的即時(shí)通訊軟件,再加上很多周邊功能,我們先來看下IM這塊的核心功能包含哪些模塊:
0)用戶:系統(tǒng)的使用者。
1)消息:是指用戶之間的溝通內(nèi)容(通常在IM系統(tǒng)中,消息會(huì)有以下幾類:文本消息、表情消息、圖片消息、視頻消息、文件消息等等)。
2)會(huì)話:通常指兩個(gè)用戶之間因聊天而建立起的關(guān)聯(lián)。
3)群:通常指多個(gè)用戶之間因聊天而建立起的關(guān)聯(lián)。
4)終端:指用戶使用IM系統(tǒng)的機(jī)器(通常有Android端、iOS端、Web端等等)。
5)未讀數(shù):指用戶還沒讀的消息數(shù)量。
6)用戶狀態(tài):指用戶當(dāng)前是在線、離線還是掛起等狀態(tài)。
7)關(guān)系鏈:是指用戶與用戶之間的關(guān)系,通常有單向的好友關(guān)系、雙向的好友關(guān)系、關(guān)注關(guān)系等等(這里需要注意與會(huì)話的區(qū)別:用戶只有在發(fā)起聊天時(shí)才產(chǎn)生會(huì)話,但關(guān)系并不需要聊天才能建立。對(duì)于關(guān)系鏈的存儲(chǔ),可以使用圖數(shù)據(jù)庫(Neo4j等等),可以很自然地表達(dá)現(xiàn)實(shí)世界中的關(guān)系,易于建模)。
8)單聊:一對(duì)一聊天。
9)群聊:多人聊天。
10)客服:在電商領(lǐng)域,通常需要對(duì)用戶提供售前咨詢、售后咨詢等服務(wù)(這時(shí),就需要引入客服來處理用戶的咨詢)。
11)消息分流:在電商領(lǐng)域,一個(gè)店鋪通常會(huì)有多個(gè)客服,此時(shí)決定用戶的咨詢由哪個(gè)客服來處理就是消息分流(通常消息分流會(huì)根據(jù)一系列規(guī)則來確定消息會(huì)分流給哪個(gè)客服,例如客服是否在線(客服不在線的話需要重新分流給另一個(gè)客服)、該消息是售前咨詢還是售后咨詢、當(dāng)前客服的繁忙程度等等)。
12)信箱:本文的信箱我們指一個(gè)Timeline、一個(gè)收發(fā)消息的隊(duì)列。
讀擴(kuò)散 vs 寫擴(kuò)散
IM系統(tǒng)里經(jīng)常會(huì)涉及到讀擴(kuò)散和寫擴(kuò)散這兩個(gè)技術(shù)概念,我們來看看。
讀擴(kuò)散
讀擴(kuò)散也稱為“拉模式”,這應(yīng)該是最符合我們認(rèn)知直覺的一種技術(shù)實(shí)現(xiàn)方式。
原理如下圖:

如上圖所示:每一個(gè)內(nèi)容發(fā)布者都有一個(gè)自己的發(fā)件箱(“我發(fā)布的內(nèi)容”),每當(dāng)我們發(fā)出一個(gè)新帖子,都存入自己的發(fā)件箱中。當(dāng)我們的粉絲來閱讀時(shí),系統(tǒng)首先需要拿到粉絲關(guān)注的所有人,然后遍歷所有發(fā)布者的發(fā)件箱,取出他們所發(fā)布的帖子,然后依據(jù)發(fā)布時(shí)間排序,展示給閱讀者。
這種設(shè)計(jì):閱讀者讀一次消息流,后臺(tái)會(huì)擴(kuò)散為N次讀操作(N等于關(guān)注的人數(shù))以及一次聚合操作,因此稱為讀擴(kuò)散。每次讀消息流相當(dāng)于去關(guān)注者的收件箱主動(dòng)拉取帖子,因此也得名——拉模式。
這種模式:
1)好處是:底層存儲(chǔ)簡單,沒有空間浪費(fèi)。
2)壞處是:每次讀操作會(huì)非常重,操作非常多。
設(shè)想一下:如果我關(guān)注的人數(shù)非常多,遍歷一遍我所關(guān)注的所有人,并且再聚合一下,這個(gè)系統(tǒng)開銷會(huì)非常大,時(shí)延上可能達(dá)到無法忍受的地步。
因此:讀擴(kuò)散主要適用系統(tǒng)中閱讀者關(guān)注的人沒那么多,并且刷消息流并不頻繁的場(chǎng)景。
拉模式還有一個(gè)比較大的缺點(diǎn):就是分頁不方便,我們刷微博或朋友圈,肯定是隨著大拇指在屏幕不斷劃動(dòng),內(nèi)容一頁一頁的從后臺(tái)拉取。如果不做其他優(yōu)化,只采用實(shí)時(shí)聚合的方式,下滑到比較靠后的頁碼時(shí)會(huì)非常麻煩。
寫擴(kuò)散
據(jù)統(tǒng)計(jì):大多數(shù)消息流產(chǎn)品的讀寫比大概在100:1,也就是說大部分情況都是刷消息流看別人發(fā)的朋友圈和微博,只有很少情況是自己親自發(fā)一條朋友圈或微博給別人看。
因此:讀擴(kuò)散那種很重的讀邏輯并不適合大多數(shù)場(chǎng)景。
我們寧愿讓發(fā)帖的過程復(fù)雜一些,也不愿影響用戶讀消息流的體驗(yàn),因此稍微改造一下前面方案就有了寫擴(kuò)散。寫擴(kuò)散也稱為“推模式”,這種模式會(huì)對(duì)拉模式的一些缺點(diǎn)做改進(jìn)。
原理如下圖:

如上圖所示:系統(tǒng)中每個(gè)用戶除了有發(fā)件箱,也會(huì)有自己的收件箱。當(dāng)發(fā)布者發(fā)表一篇帖子的時(shí)候,除了往自己發(fā)件箱記錄一下之外,還會(huì)遍歷發(fā)布者的所有粉絲,往這些粉絲的收件箱也投放一份相同內(nèi)容。這樣閱讀者來讀消息流時(shí),直接從自己的收件箱讀取即可。
這種設(shè)計(jì):每次發(fā)表帖子,都會(huì)擴(kuò)散為M次寫操作(M等于自己的粉絲數(shù)),因此成為寫擴(kuò)散。每篇帖子都會(huì)主動(dòng)推送到所有粉絲的收件箱,因此也得名推模式。
這種模式可想而知:發(fā)一篇帖子,背后會(huì)涉及到很多次的寫操作。通常為了發(fā)帖人的用戶體驗(yàn),當(dāng)發(fā)布的帖子寫到自己發(fā)件箱時(shí),就可以返回發(fā)布成功。后臺(tái)另外起一個(gè)異步任務(wù),不慌不忙地往粉絲收件箱投遞帖子即可。
寫擴(kuò)散的好處在于通過數(shù)據(jù)冗余(一篇帖子會(huì)被存儲(chǔ)M份副本),提升了閱讀者的用戶體驗(yàn)。通常適當(dāng)?shù)臄?shù)據(jù)冗余不是什么問題,但是到了微博明星這里,完全行不通。比如目前微博粉絲量Top2的謝娜與何炅,兩個(gè)人微博粉絲過億。

設(shè)想一下:如果單純采用推模式,那每次謝娜何炅發(fā)一條微博,微博后臺(tái)都要地震一次。一篇微博導(dǎo)致后臺(tái)上億次寫操作,這顯然是不可行的。
另外:由于寫擴(kuò)散是異步操作,寫的太慢會(huì)導(dǎo)致帖子發(fā)出去半天,有些粉絲依然沒能看見,這種體驗(yàn)也不太好。
通常寫擴(kuò)散適用于好友量不大的情況,比如微信朋友圈正是寫擴(kuò)散模式。每一名微信用戶的好友上限為5000人,也就是說你發(fā)一條朋友圈最多也就擴(kuò)散到5000次寫操作,如果異步任務(wù)性能好一些,完全沒有問題。
那對(duì)于上面說的超級(jí)大V到底是采用讀擴(kuò)散還是寫擴(kuò)散了,其實(shí)都不是,在業(yè)界還有另一種讀寫混合模式。
億級(jí)架構(gòu)核心點(diǎn)
由于概念比較多,一篇文章是不可能全部描述清楚的,還有像釘釘、微信與微博這種億級(jí)海量用戶的系統(tǒng)架構(gòu)實(shí)現(xiàn)其實(shí)有很多難點(diǎn),隨便給你說幾個(gè),看下你自己是否知道!
1、億級(jí)用戶同時(shí)在線聊天如何保證高并發(fā)聊天消息正常推送
2、公眾號(hào)千萬級(jí)粉絲大V發(fā)文章如何讓粉絲高效收取
3、高并發(fā)聊天系統(tǒng)如何保證發(fā)送的消息不亂序
4、微信釘釘后端海量離線消息如何高效存儲(chǔ)與獲取
5、高并發(fā)聊天系統(tǒng)如何保證發(fā)送的消息不丟失
6、單聊與群聊數(shù)據(jù)收發(fā)機(jī)制用讀擴(kuò)散還是寫擴(kuò)散
7、如何設(shè)計(jì)微博上億粉絲大V消息收發(fā)架構(gòu)
8、微信后端PB級(jí)海量歷史聊天消息數(shù)據(jù)如何存儲(chǔ)
9、應(yīng)該如何架構(gòu)微信春晚搶紅包高并發(fā)系統(tǒng)
10、微信釘釘后端如何保證消息收發(fā)核心鏈路高可用
11、微信釘釘?shù)娜毫臑槭裁匆O(shè)置人數(shù)上限
12、如何架構(gòu)微信后端百萬在線直播互動(dòng)系統(tǒng)
13、如何設(shè)計(jì)微信釘釘后端系統(tǒng)的緩存架構(gòu)抗高并發(fā)
14、微信朋友圈日均千億訪問量背后會(huì)有哪些技術(shù)挑戰(zhàn)
看完懵了么?再繼續(xù)看下圖,給大家寫了一套億級(jí)釘釘微信后端IM架構(gòu)核心(1.0)的圖,感覺怎么樣???

如果你想了解這些架構(gòu)技術(shù),推薦你看下我朋友諸葛老師最近要做的一個(gè)技術(shù)分享《從NIO與Netty入門到微信釘釘后端IM架構(gòu)實(shí)戰(zhàn)》
9月15日晚上20:00開始直播,全程高能
限時(shí)優(yōu)惠前150個(gè)名額
掃碼搶占名額,免費(fèi)領(lǐng)資料
??????
我為大家特別爭取到金九銀十面試漲薪課福利——前150名限時(shí)優(yōu)惠0.02元,附贈(zèng)一份2021最新版大廠面試真題集。
01
02

03

04
1、深入到源碼級(jí)別,帶你徹底理解Netty高并發(fā)高性能的架構(gòu)設(shè)計(jì)思想
2、通過企業(yè)級(jí)實(shí)戰(zhàn)IM項(xiàng)目,幫你掌握類似釘釘微信這種億級(jí)用戶架構(gòu)項(xiàng)目的核心設(shè)計(jì)
3、 在簡歷上增加精通NIO模型與高性能框架Netty的底層原理與項(xiàng)目實(shí)戰(zhàn)一項(xiàng)
4、在金九銀十的面試中,能夠很好的應(yīng)對(duì)關(guān)于NIO與Netty的面試問題
2021最新版大廠面試真題集??

9月15日晚上20:00開始直播,全程高能
限時(shí)優(yōu)惠前150個(gè)名額
掃碼搶占名額,免費(fèi)領(lǐng)資料
??????
一起來搞定NIO模型與Netty架構(gòu)
用實(shí)戰(zhàn)IM項(xiàng)目為自己加分
??戳閱讀原文,可以直接進(jìn)入福利課程
