环信即时通讯的技术要点学习【转】

转自: http://www.biaodianfu.com/huanxin.html

即时通讯(IM)功能是APP的重要功能之一,而开发好移动IM却绝非易事。通常来说,IM技术选型至少要解决以下问题:

  • 协议选型
  • IM服务器选型
  • 对协议和服务器做相应修改,通常来说直接拿个标准协议和开源服务器是一定不能用到生产环境的
  • 保证消息到达率,绝不丢消息

以上4点搞定后基本就有了一个可用的IM平台上。想更上一层楼,可以对电量和流量等做进一步优化,或者研究怎样支持百万级以上的用户。

协议选型

常用做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源码级别改进

  • 发送消息回执: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

转载于:https://my.oschina.net/qiangzigege/blog/700850