《移动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. [Servlet]Servlet工作流程及注意事项

    Servlet工作过程 采用Servlet完成Web实际的工作流应用程序是通过Tomcatserver公布服务,client与server遵循的端部之间的相互作用Http议完毕的. 详细工作流程例如以 ...

  2. 创建asp.net core 的静态网站

    这个名字听起来很怪 既然是静态网站 为什么要是asp.net core的呢? 1.在vs上面好像不能创建纯静态的网站,所以我们就想创建一个asp.net core的空网站 然后在里面使用静态的html ...

  3. XMPPFramework

    XMPP Extensible Messaging and Present Protocol 可扩展消息处理现场协议 特征: XMPP使用tcp传XML流程, 做IM xmpp.org objcio. ...

  4. python 教程 第二章、 类型

    第二章. 类型 常量 5,1.23,9.25e-3,’This is a string’,”It’s a string!” 1) 数 整数:2 长整数: 浮点数:3.23,52.3E-4 复数:-5+ ...

  5. 卷积(convolution)与相关(correlation)(matlab 实现)

    1. 卷积(convolution) 输出 y(n) 是作为在 x(k) 和 h(n−k)(反转和移位)重叠之下的样本和求出的. 考虑下面两个序列: x(n)=[3,11,7,0,−1,4,2],−3 ...

  6. 解决MacOS下readlink: illegal option -- f

    时间: 2017.03.21 分类: [操作系统] 评论 Mac下的readlink没有-f参数,诸如screenfetch又会去调用readlink -f,于是每次都会出现: readlink: i ...

  7. mac 安装使用Liteide

    1.下载go 官网下载地址(需要FQ)golang 中国镜像网站下载golangtc 下载go1.5.1.darwin-amd64.tar.gz包,解压得到一个Go目录,把go目录移动到你想要的路径下 ...

  8. GAC的一种非官方实现方式

    1.GAC简介 全局程序集缓存(Global Assembly Cache, GAC)计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享.在全局程序集缓存中部署的应 ...

  9. 采用WebService客户端调用WSDL/SOAP网络报错的解决办法

    WebService接口是网络传输控制的重要途径,在Windows系统下运行客户端时,平时一直能正确运行,但某天可能突然会发生调用wsdl soap邮件标头无法识别等莫名其妙的错误提示,出现这种情况一 ...

  10. PHP 一致性Hash

    一致性HASH 好久没有写文章了,最近忙着公司的事情,也一拖再拖.这篇一致性hash是很久之前就有的一篇算法,记录一下,这周写个基于该算法的Redis中间件. HASH算法的精髓就在于打散原本杂乱无序 ...