《移动IM开发指南》系列文章将会介绍一个IM APP的方方面面,包括技术选型、登陆优化等。此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问题。

推荐阅读

移动IM开发指南1:如何进行技术选型

移动IM开发指南2:心跳指令详解

在移动 IM 模块中,最核心最复杂的模块莫过于登录模块。一个没有经过很好优化的登录模块往往耗时久且浪费流量:一次登录短则数十秒,长则几分钟,同时同步下几百 KB 甚至几M的数据。

一个简单的登录步骤可以分为如下几步:

l 请求 lbs

l 连接 link

l 收发登录请求

l 同步 IM 数据

而这里的每一步都是有优化的可能性。(事实上下面的很多思路都是普适的,不是只有 IM APP 才用得到)

优化 lbs 请求

在 PC 时代,我们往往将请求 lbs 和连接服务器做一个串联,毕竟只有先请求完毕 lbs 才能够拿到真正的 link 服务器地址,从而进行连接操作。在具体操作上,一般 lbs 请求就是一次 HTTP 请求,这里的耗时可想而知。所以一个朴素的优化想法就是从登录流程中移除这个环节。

然而直接粗暴去除 lbs 请求并不可取,如果我们直接内置域名或 ip,带来最大问题自然是无法做负载均衡。所以更推荐将 lbs 请求异步化:不在登录时做 lbs 请求,而在网络空闲和发生变化时进行请求并缓存,每次登录则直接从本地缓存获取 link 地址。

DNS 优化

使用 TCP 时不可避免会碰到 DNS 解析的问题,毕竟我们不可能一直使用 IP 作为服务器地址。在 PC 时代,DNS 解析几乎不费事。但进入无线时代后,DNS 相关问题越来越严重。一方面,在移动网络下,DNS 解析速度无比龟速,一次 DNS 解析的时间甚至能赶上一次 TCP 连接的时间,几秒,十几秒,甚至三,四十秒的请求时间都很常见。另一方面,由于运营商的不作为和作为,移动网络下 DNS 也呈现了解析准确度低和经常被劫持的状态。

针对这些情况可以考虑使用 HTTP DNS,github 也有很多开源的实现,比如HttpDNSLib。而最激进的方法自然是像前面优化 lbs 一样,在个个环节中避免 DNS 解析:

l lbs 返回服务器 ip 而非域名

l 本地缓存 lbs ip 地址备用,请求 lbs 时优先使用 ip 而非域名

这种方式不仅可以避免 DNS 请求的耗时,也可以一定程度上规避 DNS 被劫持的问题。而弊端是针对这种情况需要在客户端考虑一系列的其他问题:如何从 ip list 选择有效地址,确定重新请求时机,负载均衡,节约流量等。

登录请求

事实上,登录请求环节其实并没有多大的优化空间。一旦你连接上了服务器,接下去要做的事无非是加密当前连接和发送并接收登录反馈。这两步缺一不可。而如何优化又往往会和具体的业务相关:假如我们使用类似于 HTTPS 一般的三步协商的加密流程,安全性的确可以得到保证,但是一来一回的次数过多,整个登录耗时就会增加。取巧的方法自然是将加密和登录请求合并,而这往往会涉及到对登录请求的改造。

同步策略优化

登录完毕后,客户端需要从服务器同步,一个常规的 IM APP 需要同步如下数据:

l 好友列表

l 好友个人信息

l 群组列表

l 群成员列表

l 群成员个人信息

l 离线消息

假设一个用户有 1000 个好友, 20 个 50 人群,平均每一项大约 200 个字节,那么一次全同步大约需要 0.2 * (1000 + 1000 + 20 + 1000 * 2) = 800 KB 的数据,这对于一个移动 IM 是无法接受的,更何况这还是一个较轻度用户的数据量。

显然全同步是无法接受的,改进的方法自然是按时间戳同步。客户端永远只更新比本地缓存数据新的数据。这是一个常规的优化方向,还有一些根据业务需求可以实施的优化:延迟更新和按需更新。以群成员个人信息为例,其实用户并不关心其实时性,毕竟这些群成员并不一定是用户好友,他们的信息变动完全可以在用户进行查看时再更新(微信的策略)。而好友个人信息也是同理,对于大部分界面而言,他们只关心用户 Id,头像和昵称这三个基础信息,而一些锦上添花的 Profile 信息完全可以在用户查看相应界面时进行一次按时间戳的更新。

移动IM开发指南3:如何优化登录模块的更多相关文章

  1. [Android开发]- MVC的架构实现登录模块-1

    本系列博客主要展示一下,在C-S(Client - Server)系统开发当中,如何使用MVC的架构来实现安卓端的一个登录验证的模块.如果你能有基本的数据库开发,WEB开发,和安卓开发的知识,那么理解 ...

  2. 使用uni-app开发微信小程序之登录模块

    从微信小程序官方发布的公告中我们可获知:小程序体验版.开发版调用 wx.getUserInfo 接口,将无法弹出授权询问框,默认调用失败,需使用 <button open-type=" ...

  3. Window上python开发--4.Django的用户登录模块User

    Android系统开发交流群:484966421 OSHome. 微信公众号:oshome2015 在搭建站点和web的应用程序时,用户的登录和管理是差点儿是每一个站点都必备的. 今天主要从一个实例了 ...

  4. 项目开发-->身份认证及用户登录模块

    1.首先明确的两个问题 如何判断当前申请是由一个已登录用户发起的?如果Request.IsAuthenticated为true,则表示是一个已登录用户. 如何获取当前登录用户的登录名?如果是一个已登录 ...

  5. Libgdx 开发指南(1.2) 应用框架——模块概览

    模块概览 引言 LibGDX由一些为一个典型游戏架构中的各个步骤提供服务的模块组成. Input:为所有平台提供一致的输入模型与处理器.支持键盘.触屏.加速度传感器与鼠标. Graphics:使用硬件 ...

  6. 移动IM开发指南2:心跳指令详解

    <移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...

  7. 移动IM开发指南1:如何进行技术选型

    <移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...

  8. OAuth2.0开发指南

    OAuth2.0开发指南 1.认证与登录 来往开放平台支持3种不同的OAuth 2.0验证与授权流程: 服务端流程(协议中Authorization Code Flow): 此流程适用于在Web服务端 ...

  9. 企业门户(Portal)项目实施方略与开发指南

    <企业门户(Portal)项目实施方略与开发指南> 基本信息 作者: 郑文平    丛书名: 企业大型应用集成丛书 出版社:电子工业出版社 ISBN:9787121211843 上架时间: ...

随机推荐

  1. hdu 1087 Super Jumping! Jumping! Jumping!(dp 最长上升子序列和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 ------------------------------------------------ ...

  2. Like关系查询

    比如:有表1.表2两张相,希望通过like进行关联查询 // mysql中使用concat连接字符串 select  t1.id, t1.title, t2.keyword from t1 inner ...

  3. 中英文对照 —— 手机 App/PC 端软件(系统)、互联网

    0. 经典 & 缩略词 SMS:short message service,短信息服务, SMS code,短信验证码: swipe:vt. 猛击:偷窃:刷-卡 Swipe up/down/r ...

  4. Linux性能测试 dmesg命令

    dmesg 命令主要用来显示内核信息.使用 dmesg 可以有效诊断机器硬件故障或者添加硬件出现的问题.  另外,使用 dmesg 可以确定您的服务器安装了那些硬件.每次系统重启,系统都会检查所有硬件 ...

  5. ASP.NET Core 视图 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 视图 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 视图 花了几章节,终于把 ASP.NET Core MVC 中的 C 控 ...

  6. Tab选项卡界面(1)

    Tab用一个简单的应用程序接口的标签是集中的界面布局文件的同一页上的接口组件不同的标签.并计划将在主类集中的代码文件.这种方法的优点是,文件在项目数不会被添加,但是,假设Tab接口组件更个性化的标签. ...

  7. Matlab随笔之插值与拟合(上)

    原文:Matlab随笔之插值与拟合(上) 1.拉格朗日插值 新建如下函数: function y=lagrange(x0,y0,x) %拉格朗日插值函数 %n 个节点数据以数组 x0, y0 输入(注 ...

  8. Eucalyptus企业云计算(建立能够和Amazon EC2兼容的云)

    Eucalyptus是与一个在加利福尼亚大学的研究性项目,创建了一个使企业能够使用它们内部IT资源(包括服务器.存储系统.网络设备)的开源界面,来建立能够和Amazon EC2兼容的云. “Eucal ...

  9. QT实现鼠标钩子(使用SetWindowsHookEx安装mouseProc函数)

    HHOOK mouseHook=NULL; LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam ) { if(nCode ...

  10. 利用FR导出PDF汉字乱码的处理

    利用FR导出pdf,然后在unigui中显示,发现汉字乱码,改成gb2312,不乱码,但不自动折行,最后是改成DefaultCharSet搞定.FR版本:5.4.6 后记:有的浏览器中还是乱码,把字体 ...