移动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 更多 个人分类: 造 ...
随机推荐
- Servlet 的认识
Servlet的响应过程:1,web 客户端向 Servlet容器发出http请求2,Servlet容器接收 客户端发来的请求3,创建一个 HttpRequest对象,将客户端发来的请求信息封装到这个 ...
- Oracle列操作(增加列,修改列,删除列)
Oracle列操作 增加一列: alter table emp4 add test varchar2(10); 修改一列: alter table emp4 modify test varchar2( ...
- 关于MAC系统的DNSCrypt的设置教程
DNSCrypt的设计完全是为了解决某些网站DNS系统被污染的问题. 如图是查看本地的DNS DNS系统是一个主要领域的安全保障,因为受损数据从一个DNS服务器会导致你的系统或者无法找到需要的服务器需 ...
- 用JQuery的Ajax对表进行处理的一些小笔记
--示例INSERT INTO 表名 ( 参数 )VALUES(@+参数),new SqlParameter("@参数", 值);注:配合SqlHelper使用. 一.Load() ...
- Windows 8.1 应用再出发 - 几种常用控件
本篇为大家简单介绍Windows 商店应用中控件的用法,为方便讲解,我们在文本控件和按钮控件这两类中分别挑选有代表性的控件进行详细说明. 1. 文本控件 (1) TextBlock TextBlock ...
- delphi 获取颜色值的RGB
前言:http://www.cnblogs.com/studypanp/p/5002953.html 获取的颜色值 前面获取到一个像素点的颜色值后(十六进制),比如说(黄色):FFD1C04C(共八位 ...
- webdriver 获取元素焦点方法
--------------------------------------- http://www.ltesting.net/ceshi/open/kygncsgj/selenium/2013/01 ...
- hdu 2586(LCA在线ST)
How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): A ...
- 使用本地服务器组来管理局域网或公网上的SQLSERVER
使用本地服务器组来管理局域网或公网上的SQLSERVER 测试的两台机器 Windows7 64位 SQLSERVER2005 SP5 Windows7 64位 SQLSERVER2012 S ...
- Magicodes.WeiChat——WeChatOAuthTest(网页授权获取用户基本信息)
Demo访问地址:http://wechat.magicodes.net/app/AppDemo/WeChatOAuthTest?tenantId=1 关于公众号如何获取用户信息,请参考此文档:htt ...