!文章内容如有错误或排版问题,请提交反馈,非常感谢!
环信的技术选型
即时通讯(IM)功能是APP的重要功能之一,而开发好移动IM却绝非易事。通常来说,IM技术选型至少要解决以下问题:
- 协议选型
- IM服务器选型
- 对协议和服务器做相应修改,通常来说直接拿个标准协议和开源服务器是一定不能用到生产环境的
- 保证消息到达率,绝不丢消息
环信的平台架构
协议选型
常用做IM的协议:
IM服务器选型
常见的开源IM服务器
环信的优化与改进
标准协议及IM服务器的改进
XMPP协议的问题及改进
- 登陆握手部分的改进:XMPP QuickStart(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()不是只发给在线用户,改为发送给所有用户
- 性能,状态数据和无线状态数据分离:不要使用内置数据库,Vcard可以用memory cache提高访问速度,好友列表加载到内存redis,提高效率(可以考虑用一台单独的server)
移动网络环境下的优化
- 长链接的维护:Android平台,维护client到server的长链接,添加网络监听,service自动重启。iOS平台直接用APNS即可
- 心跳包GGSN:维护移动网GGSN路由
- 消息回执处理(ack):移动网络有可能丢包,发送,接收需要加入回执机制
- 语音图片的收发优化:大文件分拆为多个数据包,每个包10K字节,如果发生失败,只需要重发一个包,而不是每次重发整个文件
流量电量优化
流量测量
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 Thumbnail Util 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
环信MQTT消息云
环信MQTT消息云,是一款面向移动互联网、物联网领域的公有云服务。基于MQTT订阅/发布模型、QoS等级、保活机制、持久化等消息协议特性,提供一种低延迟、高并发、高可靠的通用消息传递服务。开发者只需要在自身应用或设备中搭建MQTT客户端,即可快速连接环信MQTT消息云,轻松实现消息通信。
应用场景:
- 在线应用通知:系统、公告消息通知
- 事件提醒:工单、订单提醒
- 动态通知:好友上下线动态通知
- 实时数据同步:实时监控大屏、实时在线人数
- 远程互动:你画我猜游戏、VR看房(场景数据和控制指令)
- 智能设备管理:自动售卖机、智能工牌、智能价签、智能穿戴设备
- 位置共享:车辆位置跟踪、外卖实时位置
备注:当前的功能不适合做即时通讯。
产品功能:
- 千万级设备接入。支撑千万级设备在线连接,消息毫秒级到达,为端、云提供快速稳定的双向通讯能力。
- 标准规范传输协议。支持包含MQTT、MQTT over TCP、MQTT over TLS、MQTT over WS、MQTT over WSS在内的多种通信协议接入,覆盖各类行业应用。
- 全语言SDK客户端。支持全语言平台,提供Android、iOS、Java、C、C#、小程序等10余种主流SDK客户端,客户端SDK下载
- 服务器端集成。提供标准的REST API接口与服务器SDK,支持Java、Python等服务器快速集成,REST API和服务器SDK
- 全消息协议特性。支持最新MQTT V5.0及MQTT V3.1.1,具备QoS等级、保活、持久化等全消息协议特性。
- 功能完备监控服务。监控会话数、消息收发量等统计指标;支持查询客户端在线、连接记录及消息收发记录。