轉載: IM系統架構設計之淺見

出處:http://yaocoder.blog.51cto.com/2668309/1412029html

 

背 景:除去大名鼎鼎的QQ這款即時聊天工具,還有許多細分行業的IM,好比淘寶阿里旺旺、網易泡泡、YY語音......。恰巧公司產品也要開發一款基於我 們本身行業的類IM系統,頗有幸我擔當了這個產品的架構師,核心代碼編寫、實現者。下面我近年來從技術上我對IM系統(即時消息的傳輸,不包括語音,視 頻,文件的傳輸)的理解和設計分享出來,淺薄之見,望你們別見笑,歡迎給出批評意見。web


一.網絡傳輸協議的選擇

目前我知曉的全部IM系統傳輸即時消息無外乎使用UDP、TCP、基於TCP的http這幾種協議中的一種或幾種。好比QQ主要採用UDP協議,MSN主要採用TCP協議,並且他們也都支持HTTP協議的代理模式。更多資料,請參加這篇文章《一些經常使用軟件的網絡端口協議分類介紹》數據庫

咱們該如何選擇呢?緩存

  • UDP協議實時性更好,可是如何處理安全可靠的傳輸而且處理不一樣客戶端之間的消息交互是個難題,實現起來過於複雜;安全

  • HTTP協議屬於擴展支持,咱們在產品的初始階段能夠不用支持;服務器

  • 那就非TCP協議莫屬了,要考慮的一樣也有不少,特別是若是有海量用戶的需求。如何保證單機服務器高併發量,如何作到靈活,擴展的架構。微信

Tips: QQ 爲何採用 UDP 協議,而不採用 TCP 協議實現?網絡

二.應該選擇什麼格式的數據協議

二進制格式?文本格式?這個話題轉到個人這篇文章《網絡傳輸數據格式的選擇》,從咱們當前的需求和產品週期上我以爲選擇JSON形式的數據協議是最好的。session

三.架構設計

首先咱們來提煉一下一個IM系統的主要需求,包括帳號,關係鏈,在線狀態顯示,消息交互......。架構

架構考量

  • 因爲採用可靠傳輸協議TCP,考慮到負載問題(短鏈接實現帳號、關係鏈相關業務,長鏈接實現上線、信息推送);

  • 後臺架構的靈活性、可擴展性,支持分佈式部署——把網絡層、業務邏輯層、數據層分離,網絡層和業務層支持負載均衡策略、數據層支持分佈式存儲;

  • 客戶端SDK的易用性:把網絡層、數據層分離、業務邏輯層分離;

後臺架構簡化圖

wKioL1N0omSjHAjSAAEvRG5khS0247.jpg

架構示意圖

wKiom1N0oqXiOq3DAAIdkDkPfvs585.jpg

架構細化圖

wKiom1N0osXzCzagAAO7q3GDlNM199.jpg

說明

  • 從< 架構細化圖>中能夠看出對於上線服務因爲創建的是TCP長鏈接,對於單臺服務器每每因爲硬件資源、系統資源、網絡資源的限制沒法作到海量用戶的同時 在線,因此設計爲根據服務器負載支持多服務器上線,同時因爲多服務器上線形成了對整個系統交互(不一樣的客戶端的交互,協做部門應用服務和客戶的交互)的分 割,引入消息轉發服務器做爲粘合點。另外對於多服務器上線形成的統一帳戶信息(在線狀態,消息)數據的分割,引入統一的數據層(內存存儲 層:session、狀態信息存儲、消息隊列存儲;數據庫:帳號信息存儲)作到業務和數據的分離,也就作到了支持分佈式部署。參見個人這篇文章《構建高性能服務的考量》

  • 對於部分業務服務:作到網絡層、業務層、數據層的徹底分離。首先對於TCP短鏈接來講不會如長鏈接那般消耗資源,即便後期遇到海量的併發訪問請求依然能夠從容的經過負載均衡策略和數據分佈式部署策略進行解決。參見個人這篇文章《服務端架構中的「網關服務器」》

服務端平臺及技術選型

  • 系統開發平臺: CentOS——Linux發行版的一種,穩定可靠、可定製優化、支持豐富;

  • 網絡支撐層: libevent——減少開發成本,加強穩定性;

  • 緩存存儲層: Redis——支持豐富的存儲結構,支持分佈式存儲;

  • 數據庫: MySQL——最適合互聯網的數據庫,免受權、高效穩定、可控性高;

  • 開發語言: C/C++;

部分熱點問題考量

  • 系統性能考量:

    • 編碼角度:採用高效的網絡模型,線程模型,I/O處理模型,合理的數據庫設計和操做語句的優化;

    • 垂直擴展:經過提升單服務器的硬件資源或者網絡資源來提升性能;

    • 水平擴展:經過合理的架構設計和運維方面的負載均衡策略將負載分擔,有效提升性能;後期甚至能夠考慮加入數據緩存層,突破IO瓶頸;

  • 系統的高可用性:(防止單點故障)

    • 在架構設計時作到業務處理和數據的分離,從而依賴分佈式的部署使得在單點故障時能保證系統可用。

    • 對於關鍵獨立節點能夠採用雙機熱備技術進行切換。

    • 數據庫數據的安全性能夠經過磁盤陣列的冗餘配置和主備數據庫來解決。

  • Tips: 若是要支持web IM,請閱讀《Web推送技術研究》

主要學習資料: 請自行google。

    • 《1.4億在線背後的故事》;

    • 《BasicDB的架構演變》;

    • 《微信之道-至簡》;

相關文章
相關標籤/搜索