通俗易懂 即時(shí)通訊初學(xué)者入門 WhatsApp技術(shù)架構(gòu)

本文譯自Codin Gurukul經(jīng)OpenIM技術(shù)人員整理修訂后發(fā)布锋边。

寫在前面

Open-IM是由前微信技術(shù)專家打造的開源的即時(shí)通訊組件。Open-IM包括IM服務(wù)端和客戶端SDK肢簿,實(shí)現(xiàn)了高性能、輕量級(jí)蜻拨、易擴(kuò)展等重要特性池充。開發(fā)者通過集成Open-IM組件,并私有化部署服務(wù)端缎讼,可以將即時(shí)通訊收夸、實(shí)時(shí)網(wǎng)絡(luò)能力快速集成到自身應(yīng)用中,并確保業(yè)務(wù)數(shù)據(jù)的安全性和私密性血崭。

了解更多原創(chuàng)文章:

【OpenIM原創(chuàng)】開源OpenIM:輕量卧惜、高效、實(shí)時(shí)夹纫、可靠咽瓷、低成本的消息模型

【OpenIM原創(chuàng)】C/C++調(diào)用golang函數(shù),golang回調(diào)C/C++函數(shù)

【OpenIM原創(chuàng)】簡(jiǎn)單輕松入門 一文講解WebRTC實(shí)現(xiàn)1對(duì)1音視頻通信原理

【OpenIM擴(kuò)展】OpenIM服務(wù)發(fā)現(xiàn)和負(fù)載均衡golang插件:gRPC接入etcdv3

【開源OpenIM】高性能舰讹、可伸縮茅姜、易擴(kuò)展的即時(shí)通訊架構(gòu)

實(shí)時(shí)消息現(xiàn)在是我們?nèi)粘I钪斜夭豢缮俚囊徊糠帧5窃孪唬阌袥]有想過“WhatsApp”或其他實(shí)時(shí)消息應(yīng)用程序是如何工作的钻洒?

在本文中奋姿,我們將探討whatsapp或任何通用實(shí)時(shí)消息應(yīng)用程序背后的高級(jí)工程和系統(tǒng)架構(gòu)。

在深入研究之前素标,讓我們先了解“通訊是如何工作的称诗?

當(dāng)兩個(gè)客戶機(jī)(A和B)想要相互通信或發(fā)送消息時(shí),他們首先知道對(duì)方的地址(可能是IP头遭、MAC或任何自定義的唯一標(biāo)識(shí))粪狼,然后通過網(wǎng)絡(luò)彼此交換消息,在這種情況下是INTERNET任岸。這個(gè)就是所謂的p2p通信了再榄。

但是,如果網(wǎng)絡(luò)非常龐大享潜,客戶數(shù)量達(dá)到數(shù)百萬或數(shù)十億困鸥,該怎么辦?

在一個(gè)非常大的網(wǎng)絡(luò)中剑按,很難知道每個(gè)客戶機(jī)的地址疾就,在這種情況下,為了使這個(gè)系統(tǒng)更加健壯和高可用性艺蝴,我們需要在客戶機(jī)之間安裝一個(gè)名為“服務(wù)器”的組件猬腰。此服務(wù)器的任務(wù)是協(xié)調(diào)連接到它的所有客戶端,中轉(zhuǎn)雙方之間的消息猜敢。

服務(wù)器引入后姑荷。所有客戶端都與服務(wù)器連接,而不是彼此連接缩擂,這樣成了中心化的通訊架構(gòu)

在這種情況下鼠冕,當(dāng)一個(gè)客戶機(jī)(a)想要向其他客戶機(jī)(D)發(fā)送消息時(shí),它首先將消息發(fā)送到服務(wù)器胯盯,服務(wù)器知道其他客戶機(jī)(D)的地址懈费,然后將消息轉(zhuǎn)發(fā)給其他客戶機(jī)(D),反之亦然博脑。

這是通信體系結(jié)構(gòu)的概述憎乙。讓我們?cè)O(shè)計(jì)一個(gè)實(shí)時(shí)消息傳遞系統(tǒng)的實(shí)際系統(tǒng)設(shè)計(jì)。

但在設(shè)計(jì)任何產(chǎn)品之前叉趣,了解以下要求非常重要:

用戶群:了解應(yīng)用程序的使用規(guī)模非常重要泞边。

所需功能

那么,讓我們列出whatsapp中需要包含的一些功能:

1). 發(fā)消息

2). 多媒體支持

3). Last Seen

4). 消息加密

5). 音頻/視頻通話

根據(jù)應(yīng)用程序需求設(shè)計(jì)系統(tǒng)

根據(jù)應(yīng)用程序需求設(shè)計(jì)系統(tǒng)

根據(jù)用戶群君账,我們需要多臺(tái)服務(wù)器來處理如此多的流量繁堡,因此我們放置了多臺(tái)服務(wù)器沈善,而不是一臺(tái)服務(wù)器乡数,這就是集群的概念

但問題是椭蹄,客戶端將連接到哪個(gè)服務(wù)器,因?yàn)橛卸鄠€(gè)服務(wù)器净赴,并且客戶端不能隨機(jī)連接到任何服務(wù)器绳矩。為了克服這個(gè)問題,我們?cè)诳蛻舳撕头?wù)器之間引入了負(fù)載均衡玖翅。

在實(shí)現(xiàn)了多個(gè)服務(wù)器和負(fù)載平衡器之后翼馆,我們的系統(tǒng)架構(gòu)能夠處理大量用戶。現(xiàn)在金度,當(dāng)客戶機(jī)想要連接到服務(wù)器時(shí)应媚,連接請(qǐng)求首先命中負(fù)載平衡器,然后負(fù)載平衡器根據(jù)各個(gè)服務(wù)器上的負(fù)載等各種參數(shù)將連接重定向到服務(wù)器猜极。

但我們的應(yīng)用程序也需要一些存儲(chǔ)機(jī)制來保存一些任意狀態(tài)或數(shù)據(jù)中姜,為了滿足這一要求,我們還添加了可供所有服務(wù)器訪問的數(shù)據(jù)庫跟伏。

但是丢胚,使用什么樣的連接呢?

通常受扳,這種系統(tǒng)使用雙工連接或雙向連接携龟。由于消息也可以從服務(wù)器生成,因此需要雙向通信

在繼續(xù)之前勘高,讓我們先了解不同的連接場(chǎng)景以及應(yīng)用程序的工作方式峡蟋。

當(dāng)發(fā)送方連接到服務(wù)器而不是接收方時(shí)。

在這種情況下华望,當(dāng)接收方未連接到服務(wù)器時(shí)层亿,消息存儲(chǔ)在數(shù)據(jù)庫中,當(dāng)接收方連接到服務(wù)器時(shí)立美,消息從數(shù)據(jù)庫中提取并轉(zhuǎn)發(fā)給接收方匿又,這個(gè)就是離線消息的作用。

2.當(dāng)發(fā)送方未連接到服務(wù)器時(shí)建蹄。

在這種情況下碌更,當(dāng)發(fā)送方未連接到服務(wù)器時(shí),發(fā)送方發(fā)送的消息將保存在設(shè)備本地存儲(chǔ)中(可能是SQLite或基于平臺(tái)的任何其他內(nèi)容)洞慎。當(dāng)發(fā)送者聯(lián)機(jī)或連接到服務(wù)時(shí)痛单,消息將從本地存儲(chǔ)中提取并發(fā)送到服務(wù)器。這個(gè)就是本地存儲(chǔ)的作用劲腿。

3.當(dāng)兩個(gè)客戶端都連接到服務(wù)器時(shí):

在這種情況下旭绒,當(dāng)兩個(gè)客戶端都連接到服務(wù)器時(shí),發(fā)送方發(fā)送消息,服務(wù)器將該消息轉(zhuǎn)發(fā)給接收方挥吵,而不將消息存儲(chǔ)到數(shù)據(jù)庫或設(shè)備本地存儲(chǔ)器重父。

需要知道的一件事是,連接總是由客戶機(jī)啟動(dòng)的忽匈,因?yàn)榉?wù)器不知道客戶機(jī)的地址房午,但客戶機(jī)知道服務(wù)器的地址。

發(fā)送丹允、交付和查看三個(gè)狀態(tài)

發(fā)送:當(dāng)我們發(fā)送一條消息郭厌,而該消息被Whatsapp服務(wù)器接收時(shí)。

已傳遞:當(dāng)消息從Whatsapp服務(wù)器傳遞到接收方時(shí)雕蔽。

已查看:當(dāng)信息被接收者看到/打開時(shí)折柠。

為了合并所有這些狀態(tài)更改,每條消息都有一個(gè)唯一的ID批狐,用于標(biāo)識(shí)每條消息以及來自各種事件(已發(fā)送/已交付/已查看)的確認(rèn)液走。

當(dāng)客戶端連接到服務(wù)器時(shí),Whatsapp服務(wù)器內(nèi)部會(huì)發(fā)生什么贾陷?

當(dāng)客戶端連接到WhatsApp服務(wù)器時(shí)缘眶,將針對(duì)該客戶端創(chuàng)建一個(gè)進(jìn)程(或線程)。此流程負(fù)責(zé)處理與該客戶機(jī)相關(guān)的所有操作髓废。

每個(gè)進(jìn)程都有一個(gè)隊(duì)列(以淺綠色突出顯示)巷懈,作為該進(jìn)程的緩沖區(qū)。創(chuàng)建流程后慌洪,將在數(shù)據(jù)庫中創(chuàng)建一個(gè)表顶燕,以維護(hù)PID(流程ID)和關(guān)聯(lián)客戶機(jī)的記錄。

Last Seen是怎么回事冈爹?

這個(gè)特性的實(shí)現(xiàn)非常簡(jiǎn)單和直接涌攻,它只需要維護(hù)一個(gè)帶有客戶機(jī)ID和時(shí)間戳的記錄。

我們?cè)谥悄苁謾C(jī)中打開Whatsapp時(shí)频伤,我們的應(yīng)用程序每5秒向服務(wù)器發(fā)送一個(gè)脈沖恳谎,并且隨著每個(gè)脈沖最后一次出現(xiàn),表中的時(shí)間會(huì)更新憋肖。當(dāng)客戶端斷開連接時(shí)因痛,記錄中存在上次看到的時(shí)間,該時(shí)間由關(guān)閉應(yīng)用程序之前發(fā)送的最后一個(gè)脈沖更新岸更。

媒體共享是如何運(yùn)作的鸵膏?

對(duì)于共享,我們不使用用于發(fā)送文本消息的連接怎炊,因?yàn)樗且粋€(gè)非常輕量級(jí)的連接谭企,無法處理這么多負(fù)載廓译。

相反,WhatsApp使用不同的服務(wù)器(如HTTP)來共享媒體债查。

當(dāng)我們共享一個(gè)媒體時(shí)非区,它會(huì)通過不同的連接上傳到HTTP服務(wù)器,成功上傳后攀操,HTTP服務(wù)器會(huì)返回一個(gè)與該媒體相關(guān)聯(lián)的哈希值或唯一ID院仿,該哈希值會(huì)發(fā)送到WhatsApp服務(wù)器秸抚。在接收方端速和,同樣的事情以相反的方式工作,接收方接收哈希值剥汤,然后從與該哈希值關(guān)聯(lián)的HTTP服務(wù)器下載媒體颠放。

電話服務(wù)也以與媒體服務(wù)相同的方式工作,為此吭敢,我們還使用不同的服務(wù)器碰凶,并使用不同類型的連接(如套接字等)進(jìn)行實(shí)時(shí)通信。

OpenIM github開源地址:

https://github.com/OpenIMSDK/Open-IM-Server

OpenIM官網(wǎng) :https://www.rentsoft.cn

OpenIM官方論壇:https://forum.rentsoft.cn

我們致力于通過開源模式鹿驼,為全球企業(yè)/開發(fā)者提供簡(jiǎn)單欲低、易用、高效的IM服務(wù)和實(shí)時(shí)音視頻通訊能力畜晰,幫助開發(fā)者降低項(xiàng)目的開發(fā)成本砾莱,并讓開發(fā)者掌控業(yè)務(wù)的核心數(shù)據(jù)。

IM作為核心業(yè)務(wù)數(shù)據(jù)凄鼻,安全的重要性毋庸置疑腊瑟,OpenIM開源以及私有化部署讓企業(yè)能更放心使用雀费。

如今IM云服務(wù)商收費(fèi)高企瓣俯,如何讓企業(yè)低成本、安全甘萧、可靠接入IM服務(wù)峭范,是OpenIM的歷史使命财松,也是我們前進(jìn)的方向。

如您有技術(shù)上面的高見請(qǐng)到我們的論壇聯(lián)系溝通纱控,用戶也可與我們的技術(shù)人員談?dòng)懯褂梅矫娴碾y題以及見解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末游岳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子其徙,更是在濱河造成了極大的恐慌胚迫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唾那,死亡現(xiàn)場(chǎng)離奇詭異访锻,居然都是意外死亡褪尝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門期犬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來河哑,“玉大人,你說我怎么就攤上這事龟虎×Ы鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鲤妥,是天一觀的道長(zhǎng)佳吞。 經(jīng)常有香客問我,道長(zhǎng)棉安,這世上最難降的妖魔是什么底扳? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮贡耽,結(jié)果婚禮上衷模,老公的妹妹穿的比我還像新娘。我一直安慰自己蒲赂,他們只是感情好阱冶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滥嘴,像睡著了一般木蹬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氏涩,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天届囚,我揣著相機(jī)與錄音,去河邊找鬼是尖。 笑死意系,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饺汹。 我是一名探鬼主播蛔添,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兜辞!你這毒婦竟也來了迎瞧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤逸吵,失蹤者是張志新(化名)和其女友劉穎凶硅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫皱,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡足绅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捷绑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氢妈。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粹污,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出首量,到底是詐尸還是另有隱情壮吩,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布加缘,位于F島的核電站鸭叙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏生百。R本人自食惡果不足惜递雀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一柄延、第九天 我趴在偏房一處隱蔽的房頂上張望蚀浆。 院中可真熱鬧,春花似錦搜吧、人聲如沸市俊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摆昧。三九已至,卻和暖如春蜒程,著一層夾襖步出監(jiān)牢的瞬間绅你,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工昭躺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忌锯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓领炫,卻偏偏與公主長(zhǎng)得像偶垮,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帝洪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容