本文在編寫時參考了博客做者「鹿呦呦」和在線課程「即時消息技術剖析與實戰」的相關資料,一併表示感謝。php
IM系統看似簡單(沒錯,不少土老闆認爲開發個qq和微信也就是幾萬塊錢的事... ),實責是衆多技術的應用合體,包括網絡編程、移動開發、後端開發、高併發、高可用、高安全等技術範疇,再加上多端使用不一樣的編程語言,想要湊齊一個典型的IM產品技術棧那也不是個容易事。html
而對於IM開發入門者來講,想要在衆多的IM技術術語和概念中找到學習的方向和須要的資料,那也是件很讓人抓狂的事。若是看到不應看的技術深水區文章,直接從入門到放棄——被活活嚇退,那也是至關悲劇的。算法
本系列文章將盡可能從理論概念入手,通俗易懂的梳理IM中的基礎技術概念和熱門技術點,但願能幫你理清看似一團亂麻的IM知識體系,助你找到清晰的IM技術學習方向,來日工資翻倍、迎娶白富美也未必不可能!數據庫
友情提示:本系列文章側重於理論概念的講述,篇幅有限,點到即止,如需系統、深刻、具體地學習IM技術的方方面面,請今後文入手:《新手入門一篇就夠:從零開發移動端IM》(史詩級文章,適合從入門到放棄)。編程
學習交流:後端
- 即時通信/推送技術開發交流5羣: 215477170[推薦]
- 移動端IM開發入門文章:《 新手入門一篇就夠:從零開發移動端IM》
《 IM開發快速入門(一):什麼是IM系統?》(* 本文)
《IM開發快速入門(二):什麼是IM系統的實時性? (稍後發佈)》
《IM開發快速入門(三):什麼是IM系統的可靠性? (稍後發佈)》
《IM開發快速入門(四):什麼是IM系統的一致性? (稍後發佈)》
《IM開發快速入門(五):什麼是IM系統的安全性? (稍後發佈)》
《IM開發快速入門(六):什麼是IM系統的的心跳機制? (稍後發佈)》
《IM開發快速入門(七):如何理解並實現IM系統消息未讀數? (稍後發佈)》
《IM開發快速入門(八):如何理解並實現IM系統的多端消息漫遊? (稍後發佈)》
本文將帶你快速瞭解一個主流IM系統的應用場景、典型架構、技術特色和功能組成,幫你快速創建對IM系統的主觀認知。緩存
若是你不想從技術的角度理解IM原理,能夠嘗試閱讀此文:《知識科普:IM聊天應用是如何將消息發送給對方的?(非技術篇)》。安全
本文已收入即時通信網的入門綱領性文章《新手入門一篇就夠:從零開發移動端IM》。服務器
本文已同步發佈於「即時通信技術圈」公衆號,歡迎關注:微信
▲ 本文在公衆號上的連接是:https://mp.weixin.qq.com/s/h7L4UGHRl7qI1bi8WyZ5iw,原文連接是:http://www.52im.net/thread-3065-1-1.html
IM其實並不侷限於聊天、社交這類「典型」應用中,實際上它已經普遍運用於咱們身邊形形色色的軟件中。
聊天、直播、在線客服、物聯網等全部須要實時互動、高實時性的場景等等,都須要應用到 IM 技術。
下面這些場景是咱們你們都熟悉的,都用到了IM技術:
一個典型的IM架構相似於下圖這樣:
(本圖引用自《即時消息技術剖析與實戰》學習筆記1——IM系統的架構》一文)
如上圖所示,IM架構中的各分層職責以下:
尤爲對於「接入層」,它的職責最爲關鍵,具體是:
如下文章適合IM架構設計入門,有興趣能夠讀一讀:
IM技術的特色主要就是如下4點:
▶ 1)實時性:
對於IM系統,「實時」二字是精髓,也是這項技術存在關鍵意義所在。它保證的是消息的實時觸達。
舉個例子:若是跟你的好友微信或qq聊天,我發的消息他不能即時收到,或者他發的信息你也不知道何時能收到,這基本上也就無法聊下去了(幹嘛不痛快打個電話呢)。
▶ 2)可靠性:
保證消息的不丟失和不重複,是IM系統的另外一個關鍵技術特色。試想,當你在用qq或微信跟女友聊天,好不容易鼓起勇氣向「她」表白,結果這消息要是丟包了,那確定得卸載應用了,搞很差砸手機都有可能。固然,好話不說二遍,消息重複也一樣惱人。
如下文章對消息的不丟/不重問題進行了深刻探討,有興趣能夠詳讀:
▶ 3)一致性:
對於單聊消息而言,保證同一個設備的時間順序、不一樣設備的漫遊同步,也是至關重要的一環。
IM系統中的消息交互,就到底就是人跟人在「說話」,前言不搭理後言、或者胡言亂語式的消息展示,那不是人瘋了就是程序瘋了,總之就是無法再聊下去了。
如下文章對消息時序問題進行了深刻探討,有興趣能夠詳讀:
▶ 4)安全性:
保證數據傳輸安全、數據存儲安全、消息內容安全,也是IM系統必不可少的特性。尤爲在私聊場景下,若是不能作到安全性,聊天的體驗跟被人偷窺的感受是沒有區別的。
如下文章對IM的安全問題進行了深刻探討,有興趣能夠詳讀:
淺顯的角度講,一個典型的IM功能組成,無非就是如下5樣:
咱們同樣同樣來講說各自的用途。
▶ 1)聯繫人列表:
這個很好理解,使用IM系統的第一步,就是要解決「跟誰聊」的問題。從功能表象上來講,聯繫人列表也就是社交關係列表,無非就是個信息列表界面,有什麼特殊的地方?
聯繫人列表看似簡單,實際上它是一系列IM系統的社交關係確立動做的結果體現。
要想創建聯繫人列表,你可能須要實現如下邏輯:
總的來講,聯繫人列表的創建,是一個IM系統聊天關係確立的表現,不可或缺。
▶ 2)聊天界面:
聊天界面看似很日常,實際它就是IM系統客戶端的核心功能所在,全部主要的IM功能都是經過它展示。
它應該具有的能力有:
以上只是簡單羅列,這看似簡單的聊天界面,能把上面列表的事情作好,工做量也不小吧。
▶ 3)消息發送通道:
下圖是一個典型的IM消息收發通道示意:
如上圖所示,消息發送通道這個比較好懂,最淺顯易懂的理解就是用tcp或udp,創建socket長鏈接,須要發消息的時候,wirte一下就過去了,好簡單!
但,事情每每不是想象的這麼簡單:
這麼一說,事情還挺多(那不廢話嗎。。。)。
▶ 4)消息接收通道:
正如上節中的消息收發通道示意圖所示,消息接收通道也很好理解,對方經過消息發送通道write的消息,我得收到並顯示啊。
要實現一個可靠的消息接收通道,也並不是易事:
▶ 5)消息存儲:
消息存儲這個功能好理解,聊天的消息若是存儲,下次再聊的時候就不知道以前聊過什麼,作不到這一點,這個IM系統的聊天體驗好不起來。
那麼,哪些狀況下須要進行消息存儲呢:
具體要存儲的內容和時機也就上面這幾樣。
但技術落到實處,要作的事情一樣少不了:
這麼多須要考慮的內容,也挺讓人抓狂。
下圖是一個IM系統的典型存儲架構設計,瞭解一下:
(本圖引用自《現代IM系統中聊天消息的同步和存儲方案探討》一文)
存儲是IM系統的基石,如下文章能夠深刻閱讀:
▶ 6)消息未讀數:
消息未讀數?看起來也就是那個全部IM應用都有的未讀小紅點嘛。是的,看起來也好簡單!
然而,消息未讀數功能的實現也同樣不簡單:
是的,看起來就這麼簡簡單單的3件事,但深刻思考一下,還真的簡單不起來。
IM系統的應用場景已經不僅僅是IM聊天應用這一種形態,它已經融入到互聯網應用的方方面面,必竟誰都想自已的應用具有「實時」交互這種能力,由於體驗太好了。
IM系統典型架構無非就是網絡接入層、業務邏輯層、數據存儲層,除開網絡接入層,其它各層其實跟普通的應用系統看起來差異並非太大。
IM系統的技術特色來講,就是實時性、可靠性、一致性、安全性,除了實時性對於多數應用來講並不關心,其它的指標也很好理解。
IM系統的功能組成上,聯繫人列表用於數據模型的創建、聊天界面承載了IM系統的終端展示、消息的收發通道用於實現「實時」這個特性、存儲和未讀數看似不是必須但用戶體驗上確必不可少。
[1] 有關IM架構設計的文章:
《 淺談IM系統的架構設計》
《 簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端》
《 一套海量在線用戶的移動端IM架構設計實踐分享(含詳細圖文)》
《 一套原創分佈式即時通信(IM)系統理論架構方案》
《 從零到卓越:京東客服即時通信系統的技術架構演進歷程》
《 蘑菇街即時通信/IM服務器開發之架構選擇》
《 騰訊QQ1.4億在線用戶的技術挑戰和架構演進之路PPT》
《 微信後臺基於時間序的海量數據冷熱分級架構設計實踐》
《 微信技術總監談架構:微信之道——大道至簡(演講全文)》
《 如何解讀《微信技術總監談架構:微信之道——大道至簡》》
《 快速裂變:見證微信強大後臺架構從0到1的演進歷程(一)》
《 17年的實踐:騰訊海量產品的技術方法論》
《 移動端IM中大規模羣消息的推送如何保證效率、實時性?》
《 現代IM系統中聊天消息的同步和存儲方案探討》
《 WhatsApp技術實踐分享:32人工程團隊創造的技術神話》
《 微信朋友圈千億訪問量背後的技術挑戰和實踐總結》
《 王者榮耀2億用戶量的背後:產品定位、技術架構、網絡方案等》
《 IM系統的MQ消息中間件選型:Kafka仍是RabbitMQ?》
《 騰訊資深架構師乾貨總結:一文讀懂大型分佈式系統設計的方方面面》
《 以微博類應用場景爲例,總結海量社交系統的架構設計步驟》
《 快速理解高性能HTTP服務端的負載均衡技術原理》
《 子彈短信光鮮的背後:網易雲信首席架構師分享億級IM平臺的技術實踐》
《 IM開發基礎知識補課(五):通俗易懂,正確理解並用好MQ消息隊列》
《 微信技術分享:微信的海量IM聊天消息序列號生成實踐(算法原理篇)》
《 微信技術分享:微信的海量IM聊天消息序列號生成實踐(容災方案篇)》
《 新手入門:零基礎理解大型分佈式架構的演進歷史、技術原理、最佳實踐》
《 一套高可用、易伸縮、高併發的IM羣聊、單聊架構方案設計實踐》
《 社交軟件紅包技術解密(一):全面解密QQ紅包技術方案——架構、技術實現等》
《 社交軟件紅包技術解密(二):解密微信搖一搖紅包從0到1的技術演進》
《 社交軟件紅包技術解密(三):微信搖一搖紅包雨背後的技術細節》
《 社交軟件紅包技術解密(四):微信紅包系統是如何應對高併發的》
《 社交軟件紅包技術解密(五):微信紅包系統是如何實現高可用性的》
《 社交軟件紅包技術解密(六):微信紅包系統的存儲層架構演進實踐》
《 社交軟件紅包技術解密(七):支付寶紅包的海量高併發技術實踐》
《 社交軟件紅包技術解密(八):全面解密微博紅包技術方案》
《 社交軟件紅包技術解密(九):談談手Q紅包的功能邏輯、容災、運維、架構等》
《 社交軟件紅包技術解密(十):手Q客戶端針對2020年春節紅包的技術實踐》
《 從游擊隊到正規軍(一):馬蜂窩旅遊網的IM系統架構演進之路》
《 從游擊隊到正規軍(二):馬蜂窩旅遊網的IM客戶端架構演進和實踐總結》
《 IM開發基礎知識補課(六):數據庫用NoSQL仍是SQL?讀這篇就夠了!》
《 瓜子IM智能客服系統的數據架構設計(整理自現場演講,有配套PPT)》
《 阿里釘釘技術分享:企業級IM王者——釘釘在後端架構上的過人之處》
《 從游擊隊到正規軍(三):基於Go的馬蜂窩旅遊網分佈式IM系統技術實踐》
《 微信後臺基於時間序的新一代海量數據存儲架構的設計實踐》
《 IM開發基礎知識補課(九):想開發IM集羣?先搞懂什麼是RPC!》
>> 更多同類文章 ……
[2] IM開發熱門綜合文章:
《 新手入門一篇就夠:從零開發移動端IM》
《 移動端IM開發者必讀(一):通俗易懂,理解移動網絡的「弱」和「慢」》
《 移動端IM開發者必讀(二):史上最全移動弱網絡優化方法總結》
《 從客戶端的角度來談談移動端IM的消息可靠性和送達機制》
《 IM開發基礎知識補課:正確理解前置HTTP SSO單點登陸接口的原理》
《 移動端IM中大規模羣消息的推送如何保證效率、實時性?》
《 移動端IM開發須要面對的技術問題》
《 開發IM是本身設計協議用字節流好仍是字符流好?》
《 請問有人知道語音留言聊天的主流實現方式嗎?》
《 IM消息送達保證機制實現(一):保證在線實時消息的可靠投遞》
《 IM消息送達保證機制實現(二):保證離線消息的可靠投遞》
《 如何保證IM實時消息的「時序性」與「一致性」?》
《 一個低成本確保IM消息時序的方法探討》
《 IM單聊和羣聊中的在線狀態同步應該用「推」仍是「拉」?》
《 IM羣聊消息如此複雜,如何保證不丟不重?》
《 談談移動端 IM 開發中登陸請求的優化》
《 移動端IM登陸時拉取數據如何做到省流量?》
《 淺談移動端IM的多點登陸和消息漫遊原理》
《 徹底自已開發的IM該如何設計「失敗重試」機制?》
《 通俗易懂:基於集羣的移動端IM接入層負載均衡方案分享》
《 微信對網絡影響的技術試驗及分析(論文全文)》
《 即時通信系統的原理、技術和應用(技術論文)》
《 開源IM工程「蘑菇街TeamTalk」的現狀:一場虎頭蛇尾的開源秀》
《 如約而至:微信自用的移動端IM網絡層跨平臺組件庫Mars已正式開源》
《 全面掌握移動端主流圖片格式的特色、性能、調優等》
《 子彈短信光鮮的背後:網易雲信首席架構師分享億級IM平臺的技術實踐》
《 IM開發基礎知識補課(五):通俗易懂,正確理解並用好MQ消息隊列》
《 微信技術分享:微信的海量IM聊天消息序列號生成實踐(算法原理篇)》
《 自已開發IM有那麼難嗎?手把手教你自擼一個Andriod版簡易IM (有源碼)》
《 融雲技術分享:解密融雲IM產品的聊天消息ID生成策略》
《 IM開發基礎知識補課(六):數據庫用NoSQL仍是SQL?讀這篇就夠了!》
《 適合新手:從零開發一個IM服務端(基於Netty,有完整源碼)》
《 拿起鍵盤就是幹:跟我一塊兒徒手開發一套分佈式IM系統》
《 適合新手:手把手教你用Go快速搭建高性能、可擴展的IM系統(有源碼)》
《 IM裏「附近的人」功能實現原理是什麼?如何高效率地實現它?》
《 IM要作手機掃碼登陸?先看看微信的掃碼登陸功能技術原理》
《 IM消息ID技術專題(一):微信的海量IM聊天消息序列號生成實踐(算法原理篇)》
《 IM消息ID技術專題(二):微信的海量IM聊天消息序列號生成實踐(容災方案篇)》
《 IM消息ID技術專題(三):解密融雲IM產品的聊天消息ID生成策略》
《 IM消息ID技術專題(四):深度解密美團的分佈式ID生成算法》
《 IM消息ID技術專題(五):開源分佈式ID生成器UidGenerator的技術實現》
《 IM開發寶典:史上最全,微信各類功能參數和邏輯規則資料彙總》
《 IM開發乾貨分享:我是如何解決大量離線消息致使客戶端卡頓的》
《 IM開發快速入門(一):什麼是IM系統?》
>> 更多同類文章 ……
(本文同步發佈於:http://www.52im.net/thread-3065-1-1.html)