27.app后端搭建聊天服務器的經歷


         現在,聊天功能已經成了社交app的標配了。但是,眾多web開發出生的程序員對聊天相關的服務的不了解,帶來了很多開發上的困擾。在這篇文章中,根據下面3個方面,談談聊天服務。

 

1.      聊天服務的技術選型

2.      開發社交app中,實現聊天服務踩過的坑

3.      那些著名app的聊天服務

 

 

1. 聊天服務的技術選型

 

需要開發聊天服務,首先要選擇用到的協議,現在,常用的聊天協議有:

 

(1)      xmpp,一個基於xml的消息協議,被廣泛應用於Gtalk,Facebook,但缺點也很明顯,由於基於xml,會產生大流量。

(2)      mqtt,IBM開發的即時通訊協議,一個簡單的消息協議,需要自己實現加好友,群聊等IM常見的功能

(3)      類ActivitySync,微信實現的協議,省流量,性能高,但由於是私有協議,IM的所有功能都需要自己實現。

 

Xmpp協議作為一個被廣泛使用的消息協議,有大量的網絡資料和成熟開源模塊,例如在android和ios上,就很方便集成xmpp協議。IM作為一個復雜的系統,有方方面面需要考慮,使用成熟的協議,能幫助我們避免很多問題,提高了開發效率。

 

同時,xmpp協議的缺點也很明顯,基於xml,造成了費流量。

 

不信,你瞧:

 

<iq id="rosterset1" type="set">
<query xmlns="jabber:iq:roster">
<item jid="user@jabbercn.org" name="user"/>
</query>
</iq>
<presence from="contact@rooyee.biz" to="user@jabbercn.org" type="subscribe"/>

上面是xmpp協議添加好友的內容,看到了嗎?這么簡單的一個功能,用了多少字節!!!

 

綜合上面所述,對於創業型的公司來說,如果需要在最短時間內實現聊天功能,除了使用環信,融雲等第三方IM服務外,最好是選擇xmpp協議。


         現在主流的實現了xmpp的兩個開源項目:

 

(1)Ejobberd,用erlang語言開發,成熟穩定,集群支持,支持多進程高並發。但由於它是基於小眾的erlang,也造成了很高的開發成本,例如,想招個熟悉erlang同時也熟悉聊天服務的人,很難。

 

(2)openfire, 用java開發,成熟穩定,插件多,但是對內存要求高,並發低,集群支持差,單機的並發就十多萬。


         在創業公司里,我的建議是使用openfire,畢竟熟悉java的開發人員還是挺多的,而且在初期,也不會有太高的並發,等有錢有人后,再對聊天系統改造。

 

雖然,作為一名有理想有道德有職業尊嚴的后端工程師,想把聊天系統做好,但理想是美好的,現實是殘酷的。創業初期的環境,決定了沒法打造完善的系統,但最起碼,使用openfire能先把聊天功能做出來。

 

2. 開發社交app中,實現聊天服務踩過的坑

 

在做第一個社交app中,使用openfire除了常規的聊天外,還需要實現兩個功能:

(1)      未讀消息數

(2)      保存聊天記錄

 

       由於當時不具備對openfire進行二次開發的能力(或者說是因為心存恐懼),采用了一個現在看起來無比傻的方案:

        

         接收消息,App端是直接連接openfire服務器;發送消息,用php封裝了相關發送消息的api,app端通過調用api來發送消息,在api層來處理”未讀消息數”和” 保存聊天記錄”。

 

          實現”未讀消息數”的方法:每次app打開或退出前,調用一個api標識該app是否在線並在redis中記錄下來,在調用 發送消息的api時,通過檢測一個消息,判斷是否未讀消息(發送離線的消息就是未讀消息)

 

         實現” 保存聊天記錄”的方法:在調用 發送消息的api時,把發送的消息異步保存到數據庫。

 

         實現了上面兩個技術方案,體會到為了解決一個問題引引入了無數的新問題是啥情況了。”未讀消息數”功能簡直是惡夢,數字根本不准,特別是遇上了app閃退,斷網的情況下。這個功能必須要在openfire內部去實現,聊天服務器都有記錄相關的用戶在線狀態的。

 

         在做第二個社交app時,需要實現“發送給ios的離線消息,用apns推送”這個功能。我吸取了第一個社交app的教訓,采用了開發openfire插件的方法,把所有發送給ios的離線消息在openfire內部截獲下來,並用隊列傳送到apns系統中,愉快地解決了這個問題。最后,把這個插件開源,放到了我的github中(github.com/newjueqi/sendOfflineMsg

 

3.    那些著名app的聊天服務

 

Whatsapp:

 

初期使用開源Ejabberd服務器,使用Erlang實現。接下來的許多年一直從事Ejabberd的重寫和修改,包括從XMPP轉換到內部開發協議、調整代碼庫以及重設計一些核心組件,對Erlang VM做了大量的修改以獲得高性能。

 

陌陌

 

         最初的一年是使用了xmpp,一年后改為私有的協議。

 

環信:

 

         對xmpp協議進行了改造:

(1)      登錄握手的改進

(2)      心跳的改進

(3)      文件傳輸

(4)      在線狀態的改造

(5)      把聊天室協議改為適合移動互聯網的群聊

 

 

陌生人社交應用Whisper中文版“耳語”:

 

         據小道消息,把xmpp協議中的xml改為json。

 

 

--------------------------------------------------------------------------------------------------------------------------

打開鏈接  app后端系列文章總目錄 總目錄 ,能查看本人發表過的所有原創“app后端”文章。

【作者】曾健生
【QQ】190678908
【app后端qq群】254659220 
【微信公眾號】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi 


如果您覺得文章對你有所幫助,歡迎打賞。


微信打賞:



支付寶打賞:


 

 

 

版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM