<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大神級(jí)項(xiàng)目!300分鐘擼一個(gè)基于高并發(fā)Netty的NIO框架

          共 3107字,需瀏覽 7分鐘

           ·

          2021-09-18 14:19

          大家工作生活中可能經(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



          學(xué)完將收獲

          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)入福利課程

          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色色激情 | 大香蕉中文青草 | 91丨牛牛丨国产人妻 | 人人爽人人奭人人片AV | 欧洲免费观看成品视频 |