《移动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. Project Euler:Problem 28 Number spiral diagonals

    Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is forme ...

  2. AvalonDock的基本用法

    原文:AvalonDock的基本用法         AvalonDock是优秀的开源项目,用于创建可停靠式布局,能够在WPF中方便开发出类似VS2010的软件界面.对于复杂的软件系统,大量控件的使用 ...

  3. WPF中制作立体效果的文字或LOGO图形

    原文:WPF中制作立体效果的文字或LOGO图形 较久之前,我曾写过一篇:"WPF绘制党徽(立体效果,Cool) "的博文.有感兴趣的朋友来EMAIL问是怎么制作的?本文解决此类问题 ...

  4. 简明Python3教程 3.介绍

    介绍 Python是少有的几种既强大又简单的编程语言.你将惊喜地发现通过使用Python即可轻松专注于解决问题而非和你所用的语言格式与结构. 下面是Python的官方介绍: Python is an ...

  5. CSRF 专题

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造.      也被称为:one click attack/session riding(一 ...

  6. VS2015静态编译libcurl(C++ curl封装类)

    一.最新libcurl静态编译教程(curl-7.51版/curl-7.52版) 1.安装perl,在官网下载,安装好以后,测试perl -v是否成功 2.编译openssl(已编译好的下载地址) p ...

  7. Hadoop入门实验

    一.实验目的 了解Hadoop的MapeReduce工作原理 二.实验内容 实现基于单机的伪分布式运行模拟 三.实验需要准备的软件和源 1.Jdk1.6以上 下载地址:http://www.oracl ...

  8. Full Stack developer and Fog Computing

    尊重开发人员的劳动成果.转载请注明From郝萌主 http://blog.csdn.net/haomengzhu/article/details/40453769 看到这两组词,你是什么感觉? 不知所 ...

  9. mac 安装使用Liteide

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

  10. Matlab随笔之三维图形绘制

    1.三维曲线 用到了plot3函数.plot3(x,y,z)用来绘制3维曲线图,而不能绘制曲面图!就是把所有的(x,y,z)点连接在一起. t=linspace(,*pi,); x=sin(t); y ...