Android源码分析之Exchange的PUSH技术理解

Android源码分析之Exchange的PUSH机制

摘要

本文是一篇介绍Exchange中PUSH机制的文章。首先,简要介绍了PUSH是什么以及当前流行的Push技术;然后,介绍了Exchange的Push技术——Direct Push;最后,简要介绍了Android系统中对Exchange中PUSH技术的客户端实现。本文希望通过这篇文章可以完成对Exchange中PUSH技术的简要介绍,并达到快速了解Android系统中Exchange应用对PUSH机制的客户端实现。

关键词

PUSH技术、Exchange、Direct PUSH、Exchange实现

一、PUSH概述

所谓PUSH技术是一种基于客户端 / 服务器机制,由服务器主动的将信息发往客户端的技术。同传统的拉技术(PULL)相比,两者最为主要的区别在于前者的是由服务器主动发送信息,而后者则是由客户机主动请求信息。在PUSH应用中,在服务器发送内容给客户机之前,没有明显的客户机请求,也就是说,PUSH事务是由服务器发起的。
换个角度,PUSH保证了实时性。在当前时候,PUSH技术被广泛使用,例如Google的Google Cloud Message(GCM服务)、Apple的Apple Push Notification service(APNs)等。当服务器有消息到来时,服务器会推送通知给客户端,客户端主动来获取消息,已达到实时推送的目的。
本文将重点对Exchange的PUSH技术进行介绍。

二、Exchange中的PUSH机制

Exchange是微软出品的。坏处就是不开源,好处的就是文档多。在本章节中,大部分来自于微软的官方网站中的内容。

2.1 Exchange的Direct Push

Exchange的PUSH机制,微软称之为Direct Push技术。该技术依据HTTP/HTTPS长链接保证客户端与服务器可以随时通信,从而达到服务器有数据发生变化时,可以保证客户端及时获取到新变化的数据。上述为我自己的理解,微软给出的【DirectPush】说明如下:

By default, Direct Push is enabled in Exchange 2013. Mobile devices that support Direct Push issue a long-lived HTTPS request to the server running Microsoft Exchange. The Exchange server monitors activity on the user's mailbox and sends a response to the mobile device if there are any changes, such as new or changed email, calendar, contact, or task items. If changes occur within the lifespan of the HTTPS request, the Exchange server issues a response to the device that states that changes have occurred and the device should initiate synchronization with the Exchange server. The device then issues this request to the server. When synchronization is complete, a new long-lived HTTPS request is generated to start the process again. This guarantees that email, calendar, contact, and task items are delivered quickly to the mobile device, and that it is always synchronized with the Exchange server.

在引用的上文中,the lifespan of the HTTPS request是由心跳间隔(HeartbeatInterval)来指定。下面将介绍一下心跳间隔的概念。

2.2 心跳间隔(HeartbeatInterval)

这里的心跳间隔是EAS协议中Ping命令中的一个属性,该属性定义了一个时间值。这个时间值是Exchange服务器收到Ping命令后,如果Ping命令中指定的Folder没有更新,那么服务器应该等待的时间长度。当然,这里的应该是要注意的,有些Exchange服务器并不会等待这个时间。例如,163的Exchange服务器(i.163.com)在收到一个心跳间隔在8min到28min范围内的心跳间隔,如果指定的Folder没有更新,那么其只会等待1min左右,就返回了响应。
微软对心跳间隔(HeartbeatInterval)给出了一下解释【Ping_HI】:

The HeartbeatInterval element is a child element of the Ping element in Ping command requests and responses. In Ping command requests, it specifies the length of time, in seconds, that the server SHOULD wait before sending a response if no new items are added to the specified set of folders, as specified in section 3.1.5.8. The HeartbeatInterval element is also returned by the server with a status code of 5 and specifies either the minimum or maximum interval that is allowed when the client has requested a heartbeat interval that is outside the acceptable range.

心跳间隔受到较多因素的影响。其中客户端设置、服务器对心跳间隔范围的限制比较容易理解。此外还受到网络的影响。例如大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰NAT表中的对应项,造成链路中断,从而导致客户端不能受到服务器的响应。在网络中找到了一份数据通信运营商网络的NAT超时时间,如下【NAT】

地区/网络 NAT超时时间
中国移动3G和2G 5分钟
中国联通2G 5分钟
中国电信3G 大于28分钟
美国3G 大于28分钟
台湾3G 大于28分钟

对Exchange的Direct Push有了一个基本概念后,下面将介绍一下Direct Push的一个工作流程。

2.3 Direct Push的工作流程

在这里,微软官方给出了一个Direct Push中客户端和服务器的交互图,如下图【TC34591】所示:

Android源码分析之Exchange的PUSH技术理解_第1张图片
image

该流程的描述如下:

  1. 客户端发起一个HTTP请求(使用的是EAS的Ping命令),设置心跳间隔为15分钟。
  2. 服务器收到该请求,并挂起。当心跳间隔内PIM(Personal Information Manager, 个人信息管理系统)没有变动,则返回一个状态码为200的HTTP响应。
  3. 客户端收到该响应,解析。解析结果为服务端没有变化。
  4. 继续对客户端发送一个一个HTTP请求(使用的是EAS的Ping命令),设置心跳间隔为15分钟
  5. 服务器收到该请求,并挂起。在挂起该请求的13分钟时监听到Folder X有新邮件。把该消息封装到HTTP响应中反馈给客户端。
  6. 客户端收到该响应,解析。解析结果为服务端到Folder X有变化。
  7. 客户端发起同步Folder X的同步操作。

到这里,就简要介绍完了Exchange的Direct Push技术。下面,将介绍Exchange应用中如何实现了该技术中的客户端部分。

三、Android的Exchange应用对Direct Push的客户端实现

在Exchange应用中,Direct Push的客户端的实现重点涉及三个类:EasPingPingTaskPingSyncSynchronizer。当然还有一个类,EasService,是Exchange整个客户端功能的集合,不算在Direct Push的实现部分。其中这三个类各自的作用如下表所示:

Java类 功能
EasPing 完成Direct Push中一次HTTP/HTTPS长连接交互所负责的内容
PingTask 如果服务器没有变化,循环执行EasPing,保证客户端实时在线
PingSyncSynchronizer 管理客户端与服务器交互,保证任意时刻,最多只有一个HTTP/HTTPS请求在与服务器交互

这三个类的具体实现部分请查阅源代码(该文源代码依据Android原生代码)。

首先,来说一下Exchange的正常同步操作。

3.1 正常的同步操作

当系统尝试对某个账户执行同步操作(pushModify不算,这只是单纯的PingTask操作),首先,等待当前账户与服务器的交互停止(这部分由PingSyncSynchronizer负责处理)。如果与服务器的交互命令是Ping,则终止Ping操作;如果是其它命令,等待该命令的完成。然后,执行系统的同步操作。最后,同步操作完成后,如果该账户设置为Push(实时更新邮件),那么执行PingTask任务;否则,结束同步流程。PingTask任务保证客户端实时在线,以便实时收取新邮件。PingTaskPingSyncSynchronizer对象启动,而PingSyncSynchronizerEasService的成员属性。

在整个同步过程中,实际上参与Direct Push的部分是PingTask。那下面就讲述一下PingTask的工作机制。

3.2 PingTask的工作机制

在用户不进行操作的前提下,如果服务器中没有数据更新且外界环境正常(外界环境包含网络状态,Exchange的响应等),PingTask会循环做Ping操作。如果服务器数据更新,那么客户端会接收到响应,会对更新的Folder请求同步操作,并结束PingTask。其中更新的Folder请求同步操作实际上是走一次正常的同步流程。如果出现异常,例如网络超时等,也会做相应操作。例如网络超时,PingTask会结束当前PingTask执行,并请求系统做PUSH_ONLY同步。该同步并不会真正做同步操作,而是执行PingSyncSynchronizerpushModify。也就是在不进行同步操作的前提下保证PingTask任务开启。有关其余异常的处理,请参考PingTaskEasPing两个类。

3.3 心跳间隔的调节

如果服务器在上个Ping操作的过程中,服务器没有信息更新,那么下一个心跳间隔会默认增长5min,直到达到了设置的心跳间隔最大值(28min)。如果在上个Ping操作中出现了IO异常(例如网络超时等),那么下一个心跳间隔会默认减少5min,直到达到了设置的心跳间隔最小值(8min)。实际上,当出现了IO异常,当前的PingTask就会结束。

四、总结

虽然本文名称是《Android源码分析之Exchange的PUSH技术理解》,实际上并没有涉及多少Android的Exchange源码介绍。总起来说,Exchange应用对Direct Push的客户端实现比较简单。其中涉及的类中的代码逻辑也不复杂。本文就介绍到这里。
在当前社会中,Push技术被广泛的应用。通过对Exchange的Push机制的学习,也会对这些技术有一些笼统的概念。这样,方面我们接触了解这些技术。

参考文献

  • Ping_HI https://msdn.microsoft.com/en-us/library/gg675561(v=exchg.80).aspx
  • TC34591 https://technet.microsoft.com/en-us/library/cc182240.aspx
  • NAT https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5ab58810ac8bc5994&scene=1&key=dffc561732c22651a7a551503a3e34117fa2cfa4d0eabcfb2a8974dbc8bb9e038324ec7286885b7e855b9272585eee44&ascene=0&uin=MjMyNzA5NjUwMA%3D%3D&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.5+build(14F27)&version=11020113&pass_ticket=ka0fho%2BQmBJa%2FIrVUZ%2B%2F5D9jGw1RgvUIpCZINFEgomTDYSrSKYrIIGZRgS%2BwFBFP
  • DirectPush https://technet.microsoft.com/en-us/library/aa997252(v=exchg.150).aspx

本文中有些内容是自己的理解,如有不准确请指出,谢谢!

你可能感兴趣的:(Android源码分析之Exchange的PUSH技术理解)