轉自: http://www.biaodianfu.com/huanxin.htmlhtml
即時通信(IM)功能是APP的重要功能之一,而開發好移動IM卻絕非易事。一般來講,IM技術選型至少要解決如下問題:java
- 協議選型
- IM服務器選型
- 對協議和服務器作相應修改,一般來講直接拿個標準協議和開源服務器是必定不能用到生產環境的
- 保證消息到達率,毫不丟消息
以上4點搞定後基本就有了一個可用的IM平臺上。想更上一層樓,能夠對電量和流量等作進一步優化,或者研究怎樣支持百萬級以上的用戶。redis
協議選型數據庫
經常使用作IM的協議:緩存
IM服務器選型服務器
常見的開源IM服務器網絡
標準協議及IM服務器的改進數據結構
XMPP協議的問題及改進併發
- 登錄握手部分的改進:XMPPQuickStart (XEP0305)
- 心跳改進:Xmpp Ping/Pong (XEP0199)40+字節 -> 單向 whitespace ping 4字節
- 文件傳輸:Xmpp協議的文件傳輸是點對點,須要改爲用http上傳的server,語音視頻壓縮後上傳
- Presence:對移動互聯網場景,不轉發是否在線(永遠在線)
- Muc聊天室:Muc是羣聊天協議,要改進成移動社交app中的羣組,發送消息時發送給羣裏的全部用戶,而不是隻發「在線」用戶,disable presence
Openfire源碼級別改進app
- 發送消息回執:java 裏維護一個發送消息的隊列,收到client端的回執,把消息從隊列移除,在close()函數裏,把未收到確認的消息存到offline msg裏
- 離線通知插件:實現一個offline notification plugin。msgListener = new NotificationListener();OfflineMessageStrategy.addListener(msgListener);
- Muc changes:java send(Packet),若是是Presence不須要broadcast.Broadcast()不是隻發給在線用戶,改成發送給全部用戶
- 性能,狀態數據和無線狀態數據分離:不要使用內置數據庫,Vcard 能夠用 memorycache 提升訪問速度,好友列表加載到內存 redis,提升效率(能夠考慮用一臺單獨的server)
移動網絡環境下的優化
- 長連接的維護:Android 平臺,維護client到server的長連接,添加網絡監聽,service自動重啓。iOS平臺直接用APNS便可
- 心跳包 GGSN:維護移動網 GGSN 路由
- 消息回執處理(ack):移動網絡有可能丟包,發送,接收須要加入回執機制
- 語音圖片的收發優化:大文件分拆爲多個數據包,每一個包 10K 字節,若是發生失敗,只須要重發一個包,而不是每次重發整個文件
流量電量優化
流量測量
1 2 3 |
uid = Process.myUid(); initRecvBytes = TrafficStats.getUidRxBytes(uid); initSentBytes = TrafficStats.getUidTxBytes(uid); |
流量優化
- 心跳:減少心跳包尺寸,減少發送頻率,智能心跳(頻率不固定,空閒時才發)
- 協議:roster versioning (增量),xmpp quickstart,推送更新
- Transport,Compress 將xml壓縮成binary,http壓縮
耗電量測量
既要測量應用在前臺的耗電,也要測量後臺待機狀態下的耗電量
耗電量優化
- 不要影響手機休眠:經過alram manager 觸發心跳包
- 儘可能減小網絡請求:本地db,內存cache數據,只同步增量,最好一次發送多個請求
- 少用GPS定位:發送位置時才定位,網絡定位優先
- 真對不一樣移動網絡特性的優化:移動網絡下下載速度大於上傳速度:2G一次發送數據包不要太大,3G,4G一次發送多更省電
- file upload buffer size:2G數據包 1024字節 3G,10k
- file download buffer size:2G 2048 3G 30k
- 其餘常規移動app開發優化:對訪問最多的數據,直接訪問而不用get/set 能減小一次函數的調用開銷,經常使用數據結構的重用,對象緩存等。
client端各類問題及解決
數據同步
好友申請,羣組邀請等的請求,數據同步須要支持離線,和斷網兩種狀況,切換用戶登陸,不一樣設備之間同步
UI例子:位圖顯示效率和加載太多位圖致使OutOfMemory
解決:
- Image cache (Android LruCache)
- Build in ThumbnailUtil vs Decode image file to thumbnail image
- Call Bitmap.recycle()
- ImageView,scaleType -> 儘可能避免顯示刷新時的二次縮放,準備幾個固定比例的ImageView
支持百萬以上併發
- Operation system
- TCP/IP
- Scale Out
- Session Replication
- Stateless Everything (or as much as possible)
- Async Everything (or as much as possible)
- Big Data
- Multi Data Center
環信部署圖
原PPT下載地址:http://vdisk.weibo.com/s/A0GI9rXObFMd