移动APP的IM后台架构浅析
IM(InstantMessaging 即时通讯)作为一项基础功能,很多APP都有,比如:手机QQ、微信、易信、钉钉、飞信、旺旺、咚咚、陌陌等。而IM如同我们日常生活中的水和电一样,必不可少,也是很多“社交”类APP必不可少的基础功能,而上面这些APP里面,微信最为出色。
如果作为一名创业者需要用到IM的功能,我建议是直接使用第三方提供的服务,比如:易信(网易的童鞋们记得要给我打赏哇,我看过它提供的DEMO和服务,确实很赞~),为什么不自己开发?你有单聊那就需要群聊吧,而在移动互联网时代,因为移动互联网的特点,导致对技术的门槛比PC上的IM要高不少,而IM做为基础功能又至关重要,传闻很多公司内部是不允许使用QQ的(原因是怕因为信息外泄,360肯定是不用QQ的,具体用啥我也不清楚了)。扯了这么多,准备切入正题...
移动互联网的一些特性:
1、弱网络
2、对电量、流量敏感;
如果你的APP提供的IM服务,一是慢、经常丢失消息二是还特别费流量、电量,你觉得用户有什么理由不卸载你的APP呢?而光解决弱网络这个问题就是一个比较深的坑,所以没有一定的技术积累或是资源投入还是建议不要往这里面跳了。
IM的基本原则:
1、消息收、发尽可能快(不快、不实时就不叫即时通讯了);
2、不能丢失消息(你把消息都丢失了,谁还敢用,跟钱存银行钱可能会丢差不多);
网络传输协议的选择
APP上的IM传输协议以TCP主为,同时支持HTTP,而PC上的QQ主要采用UDP协议(历史原因),手机QQ是否也采用了UDP还不太确定。如果要实现像微信一样,支持web版,可以用HTTP/HTTPS来实现comet或者直接使用websocket(低版本的浏览器不支持)
消息协议的选择
几个原则:
1、传输信息体积尽可能小,越小才能传的越快,失败重传的可能性也越低;
2、传输的数据是安全、可靠的,你不能明文传输吧,而序列化、反序列化又会影响你的性能(Java在序列化、反序列化上性能问题尤为突出);
3、易于扩展、可维护(产品加一项功能,不能说后端更新了,APP端无法解析就会更种报错,无法使用);
常用的聊天协议:
1、XMPP
基于XML的消息协议,调试方便,抓到XML能大概看懂什么意思,缺点就是太臃肿了,虽然方便扩展,但是太费流量,强烈不建议使用,用它实现的APP收发消息不会快到哪去;
2、自定义的二进制协议
二进制肯定是比XML的体积要小的,建议是自定义的二进制协议 + protobuf
协议的定制的话,可以参考MySQL或者Redis的协议格式,这里给出一个参考的格式(类MySQL的):
数据包长度(4 byte)+ 协议头(2 byte)+ 协议版本(2 byte) + 错误码(2 byte)+ 回执码(2 byte)+ 消息体(data body)
为了安全和性能方面的平衡,可以考虑将消息体进行简单的加密处理(可以简单的将指定的位置的字节进行顺序调整,比如第一位与最后一位进行对调都可以)。这样在传输的过程中不用反序列化就很容易知道当前这条消息它的消息头是什么,提升一些业务逻辑的处理效率。客户端在接收数据时,为了解决粘包的总是,肯定会有一个缓冲池(可能是环形缓冲池),而数据包的长度能避免粘包的问题。
简单的收发架构
连接层(主要维护客户端的连接与消息的中转)
逻辑层(用户会话的验证,业务逻辑验证,消息存取,异步的消息队列)
持久层(数据的存储,热冷数据,灾备)
基本的消息收发流程:发 -> 存 -> 推送通知 -> 拉取消息,同时消息采用基于版本号的设计来保证消息的顺序。

注:图片来自从0到1:微信后台系统的演进之路
=== 关于连接层
陌陌之前对外的PPT里讲到单台压测连接数达到70W,这个跟配置、带宽有很大的关系,而蘑菇街的技术博客提到他们单机并发连接10万用户,我觉得单台并发10万相对靠谱一些。
因为移动网络的不稳定性,比如iPhone来个电话或者按了电源键几秒后,网络都会中断,会导致socket的重连同时也产生非常多的TCP half-open,而防止TCP的half-open通常采用心跳包的机制,而心跳包的频率也是非常有讲究,假设使用移动网络,频率高了费流量不说,还会导致信令风暴【参见 从微信信令风暴谈起】。而时间太长就会导致服务端过多的连接消耗。而心跳的频率具体应该定为多少,建议的话20s左右,具体的时间还跟ISP运营商的策略有关,一条通道多长时间不用就要被回收掉,而如果重新建立一条通道这个时间就会变的比较漫长。
而服务端如何及时的清理half-open的连接呢
一种用轮询的方式,每一个连接发消息过来时更新最后收到心跳包的时间,每一少都定时检测所有的连接,超时了就主动断开连接,因为要循环所有连接所以系统性能受影响比较大。
另外一各就是每一个连接都有一个定时器,超时了自动就断开了,但这会导致系统的资源消耗过高,十万个连接就得有十万个定时器,明显不合理嘛。
还有一种就是时间轮片(Timing Wheel),详情可参考这里:基于时间轮 (Timing-Wheel) 方式实现的定时器

而关于连接这一块的优化,可以参考腾讯云提供的维纳期服务
https://www.qcloud.com/product/wns.html
后面二块非我所长,我就不具体深入写了,重点可参考微信的那篇文章。针对个人,微信为每一个人同步数据时产生一个唯一、递增的序列号,在高并发的场景下,这个又是如何设计的呢,有兴趣可以参考这篇文章,讲的非常详细:万亿级调用系统:微信序列号生成器架构设计及演变
移动APP的IM后台架构浅析的更多相关文章
- APP后台架构20191205
1.架构,架构与业务紧密相关,是有业务驱动的. 2.APP后台演进原则. App后台的架构是由业务规模驱动而演进的,App后台是为业务服务的,App后台的价值在于能为业务提供其所需要的功能,不应过度设 ...
- APP后台架构开发实践笔记
1 App后台入门 1.1 App后台的功能 (1)远程存储数据: (2)消息中转. 1.2 App后台架构 架构设计的流程 (1) 根据App的设计,梳理出App的业务流程: (2) 把每个业务流程 ...
- App 后台架构
转载请注明出处:http://blog.csdn.net/smartbetter/article/details/53933096 做App做的久了,就想研究一下与之相关的App后台,发现也是蛮有趣的 ...
- 记一个社交APP的开发过程——基础架构选型(转自一位大哥)
记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...
- Camera服务之--架构浅析
Camera服务之--架构浅析 分类: Camera 分析2011-12-22 11:17 7685人阅读 评论(3) 收藏 举报 android硬件驱动框架jnilinux内核平台 一.应用层 Ca ...
- QPS从0到4000请求每秒,谈达达后台架构演化之路
达达是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利用社会闲散人力资源,解决O2O最后三公里即时性配送难题(目前达达已经与京东到家合并). 达达业务主要包含 ...
- 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力
1.引言 达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利 ...
- QPS从0到4000请求每秒,谈达达后台架构演化之路(转载)
https://blog.csdn.net/czbing308722240/article/details/52350219 QPS从0到4000请求每秒,谈达达后台架构演化之路 达达是全国领先的 ...
- Others-大数据平台Lambda架构浅析(全量计算+增量计算)
大数据平台Lambda架构浅析(全量计算+增量计算) 2016年12月23日 22:50:53 scuter_victor 阅读数:1642 标签: spark大数据lambda 更多 个人分类: 造 ...
随机推荐
- Odoo10尝鲜:出勤登记
非常的cool,使用一个 联网的PAD 就能使用超级潮的 出勤登记功能 扫描 工牌条码,或者 从员工目录选择 员工, 例如 输入 PIN 密码, 防止"代打卡" ...
- sql sever 2008修改数据类型
如果是新表,直接在表中修改: 如果不是新表,则须sql语句修改 附sql语句 alter table 表名 alter column 列名 新的数据类型
- freeCodeCamp:Truncate a string
截断一个字符串! 如果字符串的长度比指定的参数num长,则把多余的部分用...来表示. 切记,插入到字符串尾部的三个点号也会计入字符串的长度. 但是,如果指定的参数num小于或等于3,则添加的三个点号 ...
- net 连mysql奇怪问题
程序出现以上提示,采用6.3.5的connetor就好了.
- 【Maven】Eclipse 使用Maven创建Java Web项目
创建环境 系统:win 10 软件:eclipse,maven 创建步骤 需求创建一个Servlet版本是3.0,Java版本是1.7的项目Maven web项目 使用eclipse工具创建maven ...
- iOS删除本地文件
以前在博客里记录的东西都是截屏,没有插入代码,今天进去一看,图片都不显示了,只好重新插入代码,发现以前写的文件操作这块,没有写本地文件删除这个功能,重新再记录一下 //需要删除文件的物理地址 NSSt ...
- 模拟Linux的shell
在学习了Linux的进程控制之后,学习了fork函数和exec函数族,通过这些个函数可以简单的实现一份shell,就是实现一份命令行解释器,当然是简单版的,实现功能如下 能执行普通的命令如ls ,ps ...
- MySQL MHA配置
MySQL环境: master:192.168.202.129:3306 slave:192.168.202.129:3307,192.168.202.129:3307,192.168.202.130 ...
- IT人士感言2(转)
01. 自己的户口档案.养老保险.医疗保险.住房公积金一定要保管好.由于程序员行业每年跳槽一次,我不隐瞒大家,我至少换过5个以上的单位,这期间跳来跳去,甚至是城市都换过3个.还好户口没丢掉,其他都已经 ...
- alt属性
也被称为alt text, 是当图片无法加载时显示的替代文本.alt属性对于盲人或视觉损伤的用户理解一幅图片中所描绘的内容非常重要,搜索引擎也会搜索alt属性. 简而言之,每一张图片都应该有一个alt ...