1. 聊天服務(wù)的技術(shù)選型
需要開(kāi)發(fā)聊天服務(wù),首先要選擇用到的協(xié)議,現(xiàn)在,常用的聊天協(xié)議有:
(1) xmpp,一個(gè)基于xml的消息協(xié)議,被廣泛應(yīng)用于Gtalk,Facebook,但缺點(diǎn)也很明顯,由于基于xml,會(huì)產(chǎn)生大流量。 (2) mqtt,IBM開(kāi)發(fā)的即時(shí)通訊協(xié)議,一個(gè)簡(jiǎn)單的消息協(xié)議,需要自己實(shí)現(xiàn)加好友,群聊等IM常見(jiàn)的功能 (3) 類ActivitySync,微信實(shí)現(xiàn)的協(xié)議,省流量,性能高,但由于是私有協(xié)議,IM的所有功能都需要自己實(shí)現(xiàn)。
Xmpp協(xié)議作為一個(gè)被廣泛使用的消息協(xié)議,有大量的網(wǎng)絡(luò)資料和成熟開(kāi)源模塊,例如在android和ios上,就很方便集成xmpp協(xié)議。IM作為一個(gè)復(fù)雜的系統(tǒng),有方方面面需要考慮,使用成熟的協(xié)議,能幫助我們避免很多問(wèn)題,提高了開(kāi)發(fā)效率。
同時(shí),xmpp協(xié)議的缺點(diǎn)也很明顯,基于xml,造成了費(fèi)流量。
不信,你瞧:
[plain] view
plaincopy
上面是xmpp協(xié)議添加好友的內(nèi)容,看到了嗎?這么簡(jiǎn)單的一個(gè)功能,用了多少字節(jié)?。?!
綜合上面所述,對(duì)于創(chuàng)業(yè)型的公司來(lái)說(shuō),如果需要在最短時(shí)間內(nèi)實(shí)現(xiàn)聊天功能,除了使用環(huán)信,融云等第三方IM服務(wù)外,最好是選擇xmpp協(xié)議。
現(xiàn)在主流的實(shí)現(xiàn)了xmpp的兩個(gè)開(kāi)源項(xiàng)目:
(1)Ejobberd,用erlang語(yǔ)言開(kāi)發(fā),成熟穩(wěn)定,集群支持,支持多進(jìn)程高并發(fā)。但由于它是基于小眾的erlang,也造成了很高的開(kāi)發(fā)成本,例如,想招個(gè)熟悉erlang同時(shí)也熟悉聊天服務(wù)的人,很難。
(2)openfire, 用java開(kāi)發(fā),成熟穩(wěn)定,插件多,但是對(duì)內(nèi)存要求高,并發(fā)低,集群支持差,單機(jī)的并發(fā)就十多萬(wàn)。
在創(chuàng)業(yè)公司里,我的建議是使用openfire,畢竟熟悉java的開(kāi)發(fā)人員還是挺多的,而且在初期,也不會(huì)有太高的并發(fā),等有錢有人后,再對(duì)聊天系統(tǒng)改造。
雖然,作為一名有理想有道德有職業(yè)尊嚴(yán)的后端工程師,想把聊天系統(tǒng)做好,但理想是美好的,現(xiàn)實(shí)是殘酷的。創(chuàng)業(yè)初期的環(huán)境,決定了沒(méi)法打造完善的系統(tǒng),但最起碼,使用openfire能先把聊天功能做出來(lái)。
2. 開(kāi)發(fā)社交app中,實(shí)現(xiàn)聊天服務(wù)踩過(guò)的坑
在做第一個(gè)社交app中,使用openfire除了常規(guī)的聊天外,還需要實(shí)現(xiàn)兩個(gè)功能: (1) 未讀消息數(shù) (2) 保存聊天記錄
由于當(dāng)時(shí)不具備對(duì)openfire進(jìn)行二次開(kāi)發(fā)的能力(或者說(shuō)是因?yàn)樾拇婵謶郑?,采用了一個(gè)現(xiàn)在看起來(lái)無(wú)比傻的方案:
接收消息,App端是直接連接openfire服務(wù)器;發(fā)送消息,用php封裝了相關(guān)發(fā)送消息的api,app端通過(guò)調(diào)用api來(lái)發(fā)送消息,在api層來(lái)處理”未讀消息數(shù)”和” 保存聊天記錄”。
實(shí)現(xiàn)”未讀消息數(shù)”的方法:每次app打開(kāi)或退出前,調(diào)用一個(gè)api標(biāo)識(shí)該app是否在線并在redis中記錄下來(lái),在調(diào)用 發(fā)送消息的api時(shí),通過(guò)檢測(cè)一個(gè)消息,判斷是否未讀消息(發(fā)送離線的消息就是未讀消息)
實(shí)現(xiàn)” 保存聊天記錄”的方法:在調(diào)用 發(fā)送消息的api時(shí),把發(fā)送的消息異步保存到數(shù)據(jù)庫(kù)。
實(shí)現(xiàn)了上面兩個(gè)技術(shù)方案,體會(huì)到為了解決一個(gè)問(wèn)題引引入了無(wú)數(shù)的新問(wèn)題是啥情況了?!蔽醋x消息數(shù)”功能簡(jiǎn)直是惡夢(mèng),數(shù)字根本不準(zhǔn),特別是遇上了app閃退,斷網(wǎng)的情況下。這個(gè)功能必須要在openfire內(nèi)部去實(shí)現(xiàn),聊天服務(wù)器都有記錄相關(guān)的用戶在線狀態(tài)的。
在做第二個(gè)社交app時(shí),需要實(shí)現(xiàn)“發(fā)送給ios的離線消息,用apns推送”這個(gè)功能。我吸取了第一個(gè)社交app的教訓(xùn),采用了開(kāi)發(fā)openfire插件的方法,把所有發(fā)送給ios的離線消息在openfire內(nèi)部截獲下來(lái),并用隊(duì)列傳送到apns系統(tǒng)中,愉快地解決了這個(gè)問(wèn)題。最后,把這個(gè)插件開(kāi)源,放到了我的github中(github.com/newjueqi/sendOfflineMsg)
3. 那些著名app的聊天服務(wù)
Whatsapp:
初期使用開(kāi)源Ejabberd服務(wù)器,使用Erlang實(shí)現(xiàn)。接下來(lái)的許多年一直從事Ejabberd的重寫(xiě)和修改,包括從XMPP轉(zhuǎn)換到內(nèi)部開(kāi)發(fā)協(xié)議、調(diào)整代碼庫(kù)以及重設(shè)計(jì)一些核心組件,對(duì)Erlang VM做了大量的修改以獲得高性能。
陌陌:
最初的一年是使用了xmpp,一年后改為私有的協(xié)議。
環(huán)信:
對(duì)xmpp協(xié)議進(jìn)行了改造: (1) 登錄握手的改進(jìn) (2) 心跳的改進(jìn) (3) 文件傳輸 (4) 在線狀態(tài)的改造 (5) 把聊天室協(xié)議改為適合移動(dòng)互聯(lián)網(wǎng)的群聊
陌生人社交應(yīng)用Whisper中文版“耳語(yǔ)”:
據(jù)小道消息,把xmpp協(xié)議中的xml改為json。 |
|
來(lái)自: WindySky > 《即時(shí)通訊》