1. 程式人生 > >如何打造一個高效能、高併發的訊息推送系統

如何打造一個高效能、高併發的訊息推送系統

前言

女友常常勉勵我:“要有共享、開放、開源的現代網際網路思維,自己的經驗要多總結,發到部落格論壇上什麼的。”之前也有腦洞開啟,想分享一些個人在工作之中、工作之外的所思所得,可始終不能持久。這次想把本次參與開發的專案記錄、分享出來,希望能持之以恆。


part 1 即時通訊與訊息推送

  我想對於這個年代的人來說,對即時通訊已經完全不陌生了吧,qq、微信、陌陌等等,它的特點在於訊息的即時性,很多時候,我們的業務場景都需要一個im工具來實現系統之間使用者的即時交流,或者將到達服務端的訊息推送給使用者終端(ios、android、web等客戶端)。傳統的im一般都基於tcp協議,在服務端通過socket建立一個長連結,這個連線你可以攔截每次建立連線時的session,通過session來標示不同使用者,這樣就可以用websocket來做中轉站,將資訊發給指定使用者。這樣的設計可以簡單實現服務端和客戶端的全雙工通訊,使用者數量在幾千甚至上萬的時候,一臺4/8g記憶體的伺服器來做訊息的轉發代理,應該是可以勝任的。但是隨著使用者量的增多,達到幾百萬、上千萬、上億級別時,這種通訊模式只是一種玩具,而且這種建立長連線的方式,太過耗用伺服器資源,且每次傳送一條訊息出去,都無法避免去遍歷迴圈當前線上的使用者session記錄,找到匹配就發出,這樣太過耗時。

訊息推送指伺服器主動往指定使用者傳送訊息,客戶端一般都有個監聽器來監聽訊息的狀態,這種技術現在廣泛運用於手機應用。如果你不想自己去設計開發一套推送的機制、甚至是通訊協議,有現成的可以用甚至效能很好的推送服務,那麼我推薦使用極光推送來實現需求。

其實粗略來講,即時通訊只是訊息推送只是一種實現,比如你可以用鐳射推送等第三方產品,很輕易的就可以實現點對點、甚至點對多的訊息收發。但是在使用者需求很個性化,比如我要對使用者的聊天內容進行監控,涉及到敏感的關鍵字不讓訊息推送出去、或者我要對開通會員的使用者給予“尊貴的身份”:相比於免費使用者,可以在雲端儲存時效更久的聊天記錄或者可以新增的好友數、群數更多或者無上限(更多創意請參見某著名社交軟體的各種磚會員的設計模式 ),這時候對定製化的要求就非常高,畢竟資料是寶貴的。這時候我們就需要自行開發不能依賴第三方服務。

本文(或者說本系列)部落格將會還原真實使用者需求場景,從最基本的功能實現到一步步的系統優化、效能提升。你將在以下的看到websocket,socketJs,rabbitmq,spring全家桶,zeromq,netty,reids,mycat等主流框架、網際網路中介軟體技術的實現。