Openfire优缺点

  • 优点
    • 全JAVA语言实现,不依赖任何系统平台;
    • 基完全开源,Apache License2.0协议;
    • 完于成熟的XMPP协议;
    • 基于可扩展的WEB控制管理界面;
    • 基于插件的开发框架,高可扩展性;
    • 稳定,支持上万并发用户。
  • 缺点
    • 大规模并发时集群效果不好
    • MYSQL存储在并发大时性能一般

SKIMServer需求分析

  • 发文字、语音、图片、位置、名片、附件
  • 支持自定义消息
  • 消息回执:已发送,已接受,已阅读
  • 支持2000人大群
  • 群组权限管理
  • 多类型群组:私有群组、公开群组、聊天室
  • 多级权限通讯录

XMPP协议问题及改进

  • 登录握手部分改进 XMPPQuickStart(XEP0305)
  • 心跳改进 Xmpp Ping/Pong (XEP 0199) 40+字节->单向 white space ping ,4字节
  • 文件传输:Xmpp协议的文件传输是点对点的,需要改成http上传到server
  • 语音,视频压缩后上传
  • 下载图片,缺省下载缩略图
  • Presence 对移动互联网场景,不转发是否在线--永远在线
  • Muc聊天室 Muc是聊天室协议,要改进成移动社交app中的群组,发送消息时发给群里的所有用户,而不是只发“在线”用户;disable presence

Openfire源码级别改进

  • 发送消息回执
  • NioConnection.java 里维护一个发送消息的队列,收到client端的回执,把消息从队列移除。在close()函数里,把未收到确认的消息存到offline msg里
  • 离线通知插件
    实现一个offline notification plugin
    msgListener = new NotificationListener();
    OfflineMessageStrategy.addListener(msgListener);
  • Muc changes
    LocalMucRoom.java send(Packet),如果是Presence,不需要broadcast.
    Broadcast(),不是发给在线用户,改为发给所有用户
  • 性能,状态数据和无状态数据分享
    不要使用内置数据库
    Vcard可以用memorycache提高 访问速度
    好友列表加载到mwdhredis,提高 效率(可以考虑用一台单独的server)

移动网络环境下的主要坑点

  • 长连接的维护:Android平台,维护client到server的长连接
  • 心跳包GGSN :维护移动网GGSN路由
  • 消息回执处理(ack):移动岗络有可能丢包,发送,接收需要加入回执机制
  • 语音图片的收发优化:大文件分拆多个数据包,每个包10K字节,支持断点续传
  • 流量测量
    uid = Process.myUid();
    initRecvBytes = TrafficStats.getUidRxBytes(uid);
    initSentBytes = TrafficStats.getUidTxBytes(uid);
  • 流量优化
    心跳:减小心跳包尺寸 减小发送频率 智能心跳
  • 协议:roster versioning
    xmpp quickstart
  • 推送更新
  • Transport
    Compress zip
  • 电量优化
    耗电量的测量:测应用在前台的耗电,也要没后台待机状态下的耗电量
  • 耗电量优化
    不要影响手机休眠:通过alarm manager 触发心跳包
    尽量减少网络请求:本地db,内存cache数据,只同步增量;最好一次发送多个请求
    少使用GPS定位:发送位置的时候才定位;网络定位优化
    针对不同移动网络特性的优化:移动网络下截速度大于上传速度 ;2G一次发送的数据包不要太大,3G4G一次发送多点更省电
    -> file upload buffer size:2G数据包 1024字节 ;3G 10K
    -> file download buffer size:2G 2048, 3G 30K

【文献】