余亞玲,李 寧
(華北計算技術(shù)研究所,北京 100083)
即時通信系統(tǒng)作為一種新興的技術(shù)近來獲得了突飛猛進(jìn)的發(fā)展,它以移動網(wǎng)絡(luò)為基礎(chǔ),手機終端為載體,可使用戶以實時方式與其它在線用戶進(jìn)行信息交互,其突出優(yōu)點是快捷方便。但由于移動網(wǎng)絡(luò)的特點,造成消息的可靠性等與傳統(tǒng)網(wǎng)絡(luò)有較大的差異。
本文提出一種基于移動網(wǎng)絡(luò)安全可靠的消息系統(tǒng),包括消息回執(zhí)、多級別的消息重發(fā)、消息推送以及消息顯示等功能,通過消息回執(zhí)策略、多級別的重發(fā)策略等方式來提高移動網(wǎng)絡(luò)的消息成功率,實現(xiàn)消息的聯(lián)動機制。其中消息回執(zhí)使得服務(wù)器能夠及時獲得用戶獲取消息的反饋,保證消息的真實到達(dá);多級別的消息重發(fā)主要是通過對消息的分類,對待不同級別的內(nèi)容采用不同的重發(fā)策略;消息顯示是用戶在獲取到消息事件后,根據(jù)消息格式對不同類型的消息進(jìn)行顯示。
基于不可靠移動網(wǎng)絡(luò)的消息系統(tǒng),是目前移動互聯(lián)網(wǎng)及時通訊研究的熱點,無論是消息推送,還是IM等及時通訊應(yīng)用都涉及這個方面的問題,如何保證消息及時有效地送到用戶是研究的關(guān)鍵。從技術(shù)上,消息的送達(dá)主要有2類技術(shù),一類是客戶端輪詢,即客戶端不斷地發(fā)送請求獲取新內(nèi)容;另一類是推送,即服務(wù)端在有消息內(nèi)容時將消息推送到客戶端。輪詢實現(xiàn)比較簡單,即客戶端在一定的時間間隔內(nèi)向服務(wù)端請求,獲取新的數(shù)據(jù),目前這種方式在當(dāng)前互聯(lián)網(wǎng)上的消息應(yīng)用中較為普遍。但這種方式在移動網(wǎng)絡(luò)下存在較多問題,如果設(shè)置時間間隔太長,會造成消息的及時性不夠,如果設(shè)置太短,會造成較大的數(shù)據(jù)流量,移動網(wǎng)絡(luò)目前的流量成本還比較高,另外對移動設(shè)備的電量消耗較大。而推送方式采用長連接的方式,有效地避免了上述問題,但是,由于移動網(wǎng)絡(luò)的不穩(wěn)定性,在長連接情況下沒有傳統(tǒng)網(wǎng)絡(luò)穩(wěn)定,客戶端時有掉線。因此筆者在參考推送模式和XMPP(Extensible Messaging and Presence Protocol,可擴展消息與出席協(xié)議)的基礎(chǔ)上,借用輪詢請求的方式,實現(xiàn)消息的有效回執(zhí),同時采用重試鏈接的方式回避長連接的不穩(wěn)定,在傳統(tǒng)的推送基礎(chǔ)上加了重發(fā)機制。
該消息系統(tǒng)在架構(gòu)上由客戶端、服務(wù)端和數(shù)據(jù)層構(gòu)成,各層由不同子功能模塊組成。
客戶端主要為用戶提供交互操作的界面,包含消息回執(zhí)、消息顯示等模塊,其核心是客戶端收到消息后,根據(jù)消息體的相關(guān)屬性決定消息是否需要回執(zhí),采用何種模板進(jìn)行消息體的展示。
服務(wù)端由多臺基于Openfire的IM服務(wù)器集群、Zookeeper集群以及消息待發(fā)隊列和重發(fā)隊列組成,用于處理、轉(zhuǎn)發(fā)及重發(fā)客戶端消息、接收客戶端消息回執(zhí)、監(jiān)聽客戶端狀態(tài)等。此外,還包含統(tǒng)一的數(shù)據(jù)訪問接口,用于訪問緩存數(shù)據(jù)庫。
數(shù)據(jù)層用于存儲來自應(yīng)用系統(tǒng)的相關(guān)數(shù)據(jù)和用戶狀態(tài),其中緩存數(shù)據(jù)庫主要存儲用戶信息及離線消息等,Zookeeper集群主要存儲IM服務(wù)器集群的共享數(shù)據(jù)。系統(tǒng)的具體架構(gòu)如圖1所示。
圖1 系統(tǒng)架構(gòu)圖
1)客戶端消息回執(zhí)模塊用于構(gòu)造并發(fā)送客戶端消息回執(zhí)。當(dāng)客戶端成功接收在線消息或離線消息時,立刻向服務(wù)端發(fā)送“成功接收在線消息”或“成功接收離線消息”的回執(zhí),告知服務(wù)器客戶端已成功接收到消息,不用重復(fù)向其發(fā)送此消息,服務(wù)端的業(yè)務(wù)層根據(jù)回執(zhí)的情況對消息進(jìn)行相應(yīng)的業(yè)務(wù)處理。
2)客戶端消息顯示模塊根據(jù)消息類型對消息予以不同的顯示。消息主要分為普通消息、多媒體消息、聯(lián)動消息3類,客戶端消息顯示模塊根據(jù)上述的類型,從消息彈出方式、消息字體顏色、消息的聯(lián)動等方面進(jìn)行不同的處理。比如消息是否需要彈出、客戶端收到消息的聲音模式以及該消息內(nèi)容是否進(jìn)行下一步聯(lián)動操作。
3)服務(wù)端消息處理模塊主要負(fù)責(zé)接收客戶端的消息回執(zhí),當(dāng)該模塊接收到客戶端的消息回執(zhí)時,表示客戶端已經(jīng)收到該消息,后續(xù)對該消息進(jìn)行完整的事務(wù)處理,把該消息從待發(fā)隊列移除,同時置該消息狀態(tài)位為已發(fā)送。
4)服務(wù)端消息處理推送模塊主要根據(jù)消息接收者的狀態(tài)實行不同的消息發(fā)送策略,同時根據(jù)消息的內(nèi)容和形式組成不同的消息體,便于客戶端進(jìn)行消息的顯示,同時提供其他應(yīng)用服務(wù)器能夠通過IM服務(wù)器向客戶端推送消息接口。
5)服務(wù)端消息重發(fā)模塊用于重新發(fā)送未成功送達(dá)客戶端的消息。服務(wù)器端維護(hù)一個重發(fā)隊列保存其發(fā)送過的消息,當(dāng)收到回執(zhí)時則從隊列刪除相應(yīng)消息,若未收到回執(zhí),則在計時器周期遍歷重發(fā)隊列時重發(fā)此消息,以此來提高服務(wù)器端向客戶端發(fā)送消息的可靠性。服務(wù)器端根據(jù)消息的重要程度采用不同級別的重發(fā)策略,越重要的消息重發(fā)的頻率和次數(shù)越高,多級別的重發(fā)策略便于定制,更為靈活。
6)服務(wù)端狀態(tài)管理模塊主要是維護(hù)客戶端的長連接狀態(tài),如客戶端上線、離線、暫時不接受某類消息等,該模塊對消息推送策略的制定至關(guān)重要。
7)數(shù)據(jù)層的數(shù)據(jù)存儲模塊主要是對消息內(nèi)容的保存和用戶連接狀態(tài)的存儲,由于消息的量比較大,文件大小較小,采用緩存機制可以有效降低磁盤IO吞吐消耗,緩存機制的讀取和存儲速度較快,有效地提升系統(tǒng)的響應(yīng)速度。
保障客戶端的消息接收是本文的關(guān)鍵,難點在重發(fā)策略。消息重發(fā)策略包括服務(wù)端消息重發(fā)策略及客戶端消息回執(zhí)策略。為支持服務(wù)端消息重發(fā)功能,IM服務(wù)器需要維護(hù)一個消息重發(fā)隊列,當(dāng)IM服務(wù)器推送完成一條消息后,將該消息從待發(fā)隊列中移到重發(fā)隊列,IM服務(wù)器檢測客戶端的在線狀態(tài),如果在線,則立即發(fā)送,同時待成功收到客戶端的回執(zhí)時從重發(fā)隊列刪除相應(yīng)的消息,如果不在線,則將消息存為離線消息,標(biāo)識消息的發(fā)送時間和已發(fā)送次數(shù)。IM服務(wù)器采用集群方式,各個IM服務(wù)器需要共享同一個消息重發(fā)隊列,本文借助Zookeeper實現(xiàn)消息隊列的共享與同步。Zookeeper是通過選舉產(chǎn)生leader和follower,其算法正確執(zhí)行的前提是有一半以上機器正常工作,每臺機器部署一個IM服務(wù)器及一個Zookeeper服務(wù)器,各IM服務(wù)器之間進(jìn)行負(fù)載平衡,各Zookeeper之間進(jìn)行數(shù)據(jù)同步,IM服務(wù)器優(yōu)先從本地Zookeeper存取數(shù)據(jù)。各機器中只有一臺機器作為主服務(wù)器,其余作為從屬服務(wù)器,主服務(wù)器負(fù)責(zé)消息的重發(fā)。
計時器控制消息重發(fā),要求重發(fā)隊列中的消息至少包含消息體、已重發(fā)次數(shù)、上一次發(fā)送時間等數(shù)據(jù)。當(dāng)執(zhí)行計時器任務(wù)遍歷重發(fā)隊列時,若某消息距上次發(fā)送時間超過閾值則重發(fā)此消息,并修改消息最后一次發(fā)送時間以及已發(fā)送次數(shù),當(dāng)某消息發(fā)送次數(shù)達(dá)到設(shè)定的上限時就將其存為離線消息,待用戶登錄以后再接收此消息。
本系統(tǒng)在完成設(shè)計后,筆者搭建了一套測試系統(tǒng),該系統(tǒng)服務(wù)端采用4臺2CPU/4G內(nèi)存機器做IM服務(wù)器和3個Zookeeper集群,1臺2CPU/8G內(nèi)存的服務(wù)器作為數(shù)據(jù)存儲的redis服務(wù)器。同時選取了目前市場比較主流的中國移動2G Android手機1臺,中國聯(lián)通的3G Android手機終端1臺。在應(yīng)用搭建完成后,分別在2G、3G網(wǎng)絡(luò)下,通過服務(wù)端進(jìn)行了100、1000、1000、10000條消息向客戶端推送,一種情況是消息沒有重發(fā)和回執(zhí)策略,另一種情況采取5次的重發(fā)策略和消息回執(zhí)策略,從圖2的測試結(jié)果來看,特別是2G(不穩(wěn)定)的網(wǎng)絡(luò),通過提升重試次數(shù),大大增加了消息的投達(dá)能力,消息到達(dá)率由80%多平均提升到96%左右,而在3G網(wǎng)絡(luò)下,消息的到達(dá)率也平均有90%提升到98%左右。同時由于有了消息回執(zhí)機制,服務(wù)端顯示的消息到達(dá)條數(shù)和客戶端實際收到的消息條數(shù)是一致的。而沒有采用消息回執(zhí)策略的,客戶端實際收到的消息大概是95%左右,有5%的異常情況。
圖2 不同策略消息發(fā)送圖
圖3 各個時間范圍的失敗消息情況圖
進(jìn)一步分析各種失敗的消息情況,可以看到重試間隔時間越長,消息的失敗率越高。如圖3所示。
從測試報告可以看出,系統(tǒng)的重試間隔時間在一定范圍內(nèi),成功率比較高,隨著時間越長,成功率顯著下降。因此重試間隔也有一定的限制。
隨著從傳統(tǒng)的互聯(lián)網(wǎng)時代步入移動互聯(lián)網(wǎng)時代,無論對于個人還是企業(yè),對于即時通訊的需求一直有增無減,及時獲取消息,對提升用戶體驗,保證通信質(zhì)量,提高用戶滿意度,增強產(chǎn)品及企業(yè)的競爭力具有重要的意義。本文通過結(jié)合推送和輪詢模式,探索出一種基于移動網(wǎng)絡(luò)安全可靠的消息系統(tǒng)。它既能大大地提升服務(wù)能力和服務(wù)體驗,還能有效地降低系統(tǒng)成本。
[1]劉殿興,薛建生.一種基于流量預(yù)測的多優(yōu)先級隊列緩存管理算法[J].計算機工程,2006,32(10):116-118.
[2]姜宏岸,王剛.優(yōu)先級隊列的緩存管理機制的性能分析[J].計算機工程與應(yīng)用,2009,45(25):86-88.
[3]鄭明,沈威,白天,等.基于可擴展標(biāo)記語言的新型即時通訊系統(tǒng)[J].吉林大學(xué)學(xué)報(工學(xué)版),2012,42(6):1548-1552.
[4]郭卓.基于Openfire服務(wù)器iOS即時通訊系統(tǒng)的設(shè)計與實現(xiàn)[D].長春:吉林大學(xué),2013.
[5]張斌,馮猛,張朋,等.基于微軟MSN的安全即時通信插件研究[J].計算機工程與設(shè)計,2009,30(12):3012-3014,3017.
[6]羅偉.基于Android平臺的即時通訊系統(tǒng)的研究與實現(xiàn)[D].長沙:湖南師范大學(xué),2009.
[7]吳玉婷.基于XMPP協(xié)議的即時消息系統(tǒng)的研究與實現(xiàn)[D].西安:西安電子科技大學(xué),2009.
[8]王龍濤.基于XMPP協(xié)議的服務(wù)器關(guān)鍵技術(shù)研究[D].西安:西安電子科技大學(xué),2008.
[9]王光輝.基于XMPP協(xié)議的即時通信系統(tǒng)研究與實現(xiàn)[D].成都:成都理工大學(xué),2011.
[10]李小海.基于XMPP協(xié)議的即時通信系統(tǒng)客戶端的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2011
[11]李威.基于XMPP協(xié)議的通訊軟件的研究和實現(xiàn)[D].北京:北京交通大學(xué),2013.
[12]陸慶,周世杰,秦志光,等.消息隊列中間件系統(tǒng)中消息隊列與消息分發(fā)技術(shù)研究[J].計算機應(yīng)用研究,2003,20(8):51-53.
[13]杜威,林滸,楊海波.XMPP協(xié)議在流媒體互動平臺中的擴展與實現(xiàn)[J].計算機系統(tǒng)應(yīng)用,2012(4):82-87.
[14]周文瓊,王樂球,周桐,等.基于XMPP的企業(yè)即時通信系統(tǒng)研究與應(yīng)用[J].吉林大學(xué)學(xué)報(信息科學(xué)版),2010(1):106-111.
[15]鄒正宸,左春.基于Jabber的客戶服務(wù)中心通用信息交換系統(tǒng)設(shè)計[J].計算機工程與設(shè)計,2007,28(1):68-71.
[16]鄒奕婷,趙方.B/S模式下基于Jabber的IM系統(tǒng)的構(gòu)建方法[J].計算機應(yīng)用與軟件,2008,25(12):196-198.
[17]雷煒.基于服務(wù)器推送技術(shù)建立在線交流平臺的探討與實現(xiàn)[J].福建電腦,2007(5):125-126.