1. 程式人生 > >27.app後端搭建聊天伺服器的經歷

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="
[email protected]
" name="user"/> </query> </iq> <presence from="[email protected]" to="[email protected]" 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 後臺開發運維和架構實踐》,該書已在京東,噹噹和亞馬遜上銷售。

《App後臺開發運維和架構實踐》的購買連結

京東

京東 
噹噹 
亞馬遜 
互動出版網 
天貓

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

開啟連結  app後端系列文章總目錄 總目錄 ,能檢視本人發表過的所有原創“app後端”文章。

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

相關推薦

27.app搭建聊天伺服器經歷

         現在,聊天功能已經成了社交app的標配了。但是,眾多web開發出生的程式設計師對聊天相關的服務的不瞭解,帶來了很多開發上的困擾。在這篇文章中,根據下面3個方面,談談聊天服務。 1.      聊天服務的技術選型 2.      開發社交app中,實現聊天

APP搭建整理

常見的APP後端搭建 語言有 Java,PHP,Python,下面可以簡單瞭解一下 Java: https://blog.csdn.net/a_running_wolf/article/category/6188707 http://keeganlee.me/post/pract

IDEA搭建SSM框架,Node伺服器建立Vue前端(附時間格式轉換問題)

SSM框架搭建後端 1.新建專案後jar包引入到WEB-INF目錄下的lib(沒有lib就自己建立) 2.引入總配置檔案web.xml3.引入相應的檔案資訊4.該@RequestMapping("/findAll")地方用於前端訪問前端,後期可以直接拼接訪問"http://localhost

模仿J2EE的session機制的App會話信息管理

序列化 相關 || redis 字節 param div 模仿 remove 此文章只將思想,不提供具體完整實現(博主太懶,懶得整理),有疑問或想了解的可以私信或評論 背景   在傳統的java web 中小型項目中,一般使用session暫存會話信息,比如登錄者的身份信息

appapi設計【轉】

不用 ray 版本更新 array nvl 動態生成 出錯 命名 test 博客:https://blog.csdn.net/newjueqi/article/details/44037011 app和後端的交互,一般都是通過後端提供的api實現。api的設計,估計很多

Odoo作為App時如何調試App

技術分享 Edito 管理系 cno onf span edi 後臺系統 pre 轉載請註明原文地址:https://www.cnblogs.com/cnodoo/p/9307340.html 一:Odoo可以作為app後臺+後臺管理系統使用 Odoo作為一個可供

今日頭條抖音火山研發實習生面試經歷

簡歷在牛客網投遞,第二天收到hr電話。約在12月10號下午面試。問題如下: 連結串列翻轉 給出奇數位置組成上升序列偶數位置組成下降序列的連結串列,轉化為整體上升的連結串列(此處感謝cdm 程序執行緒瞭解嗎?(此處感謝zhr學長 程序間通訊,引出套接字 套接字使用,引出網路協議 TC

Nginx與JAVA搭建積分下載服務

前言 大家都知道現在很多站點下載資料都是要收費的,無論是積分還是金幣,想免費只能說很少很少了,那麼這些網站是如何做到資源防盜鏈的呢? 這裡推薦一款比較容易上手的神器,Nginx本身提供了secure_link來完成防盜鏈功能,可以給伺服器檔案連結新增時間戳和校驗

thinkphp5.0的搭建簡單配置

從出來工作就直接接觸了tp5.0,一年時間加自己外包專案,大大小小做個10個專案左右,現在也用laravel5.5開發了一年的專案,突然就想總結下以前學習過的知識,本人部落格只是按照自己的程式碼習慣,不一定每個人都受用,不說廢話,馬上開擼! 1.composer 安裝tp5最新版本(本地comp

app設計(7)-- 專案管理

移動網際網路行業是個快速發展的行業,需求不斷變化,產品更新快。基於移動網際網路的以上特點,在開發產品的過程中,我們放棄了傳統的瀑布流開發模型,引入了精益的理念和scrum這個敏捷開發框架,下面談談實施過程中的一些經驗。    scrum簡介:Scrum是一個敏捷開發框架

餐飲圈APP容器化實踐

專案介紹 簡單介紹一下餐飲圈專案規模,以及團隊配置,用以作為技術選型和實踐的參考條件。 餐飲圈介紹 餐飲圈是專注於餐飲行業社交,招聘的APP。 後端採用微服務的設計思想,將不同的業務放在不同服務中。 隨著業務的發展,目前後端服務有20多個。 容器化之前,採用的是傳統的負載均衡(阿里雲負載均衡)、多

【遊戲】遊戲伺服器開發的一些建議(轉載)

摘要: 本文作為遊戲伺服器端開發的基本大綱,是遊戲實踐開發中的總結。第一部分專業基礎,用於指導招聘和實習考核, 第二部分遊戲入門,講述遊戲伺服器端開發的基本要點,第三部分服務端架構,介紹架構設計中的一些基本原則。希望能幫到大家一 專業基礎1.1 網路1.1.1 理解TCP/I

17.app如何保證通訊安全--aes對稱加密

在上文《16.app後端如何保證通訊安全--url簽名》提到,url簽名有兩個缺點,這兩個缺點,如果使用對稱加密方法的話,則完全可以避免這兩個缺點。在本文中,會介紹對稱加密的具體原理,和詳細的方案,使app通訊更加安全。1.對稱加密的原理   採用單鑰密碼系統的加密方法,

APP資料介面注意事項

2014年,移動APP的熱度絲毫沒有減退,並沒有像桌面軟體被WEB網站那樣所取代, 不但如此,越來越多的傳統應用、網站也都開始製作自己的移動APP,也就是我們常說的IOS客戶端、android客戶端。 這彷彿又回到了多年前的CS架構,那時候我們用VB、VC、Delphi在Windows平臺上快速開發各種應用

java社招面試經歷

  最近打算換工作,對面是經驗做一些總結,今後也是打算開啟部落格總結自己工作中遇到的一些問題分享給大家,算是一個開始吧!先說下整體面試下來的一些感受:1. java基礎知識真的要紮實,面試準備階段不像考試有題可壓,任何一個問題都有可能都會問到,所以,對自己負責,欺騙自己等於拿

Android實戰簡易教程-第六十六槍(伺服器搭建伺服器Json資料互動)

學習Android有一段時間了,對伺服器端有很深的好奇,決定對伺服器端的實現進行一些研究,這裡實現了一個簡單的小例子,用於獲取伺服器端的json資料,例子很簡單,適合初學者學習使用。伺服器端首先我們搭建伺服器端,伺服器端使用struct2架構,對該架構不熟悉的人可以花一點時間

app架構

(1)Restful設計原則     Restful風格:RESTfu設計原則,它被Roy Felding提出(在他的”基於網路的軟體架構“論文中第五章)。而REST的核心原則是將你的API拆分為邏輯上的資源。這些資源通過http被操作(GET ,POST,PUT,D

app設計(8)-- 資料庫分表

    當專案上線後,隨著使用者的增長,有些資料表的規模會以幾何級增長,當資料達到一定規模的時候(例如100萬條),查詢,讀取效能就下降得很厲害,這時,我們就要考慮分表。    更新表資料時會導致索引更新,當單表資料量很大時這個過程比較耗時,這就是為什麼對大表進行新增操作

三年半 Java 鵝廠面試經歷

流量異常 很好 cluster 更新 沒有 定義 zook 比較 需要 經過半年的沈澱,加上對MySQL,redis和分布式這塊的補齊,終於開始重拾面試信心,再次出征。 鵝廠 面試職位:go後端開發工程師,接受從Java轉語言。 都知道鵝廠是cpp的主戰場,而以cpp為背景

8.app和web的區別

  很多從web後端轉到app後端的小夥伴經常很茫然,不知道這兩者之間有啥區別。本文通過例子,分析web後端和app後端的區別,使各位更好地把握app後端的架構。   (1) app後端要慎重考慮網路傳輸的流量,主要是api設計,圖片處理上     現階段,手機上網的資費還