作者: 邓明轩
M DS/BES 中的 推 送队 列
MDS /BE S 服 务 器 有 一 个 队 列 用 于 缓 存 推 送 请 求 , 因 为 手 持 设 备 并 不 是 一 定 在 线 , MDS /BE S 服 务器 需要 先将 推送请 求保 留在 服务端 , 在 合适的 情况 下将 数据 推送 到手持 设备 端 后才从 队列 中将 该请 求移 除。
MDS /BE S 服 务器 上的 推送 队列是 MD S 推送 的关 键组 件,它 的行 为不 仅仅 影响 应用服 务 器端是 否能 够发 送新 的请 求,也 影响 到手 持设 备端 是否能 够接 收到 数据 。所 以对于 M DS 推 送的开 发人 员必 须了 解 M DS /BE S 服 务器 上的 推送队 列。
MDS /BE S 服 务器 上的 推送 队列有 一个 队列 深度 , 缺 省为 1 00 0 , 也就 是说 MD S /BE S 服务
器在同 一时 间只 能缓 存 1 0 0 0 个推 送请 求。 该队 列的 深度可 以由 管理 员在 管理 端修改 。
同时 MDS / BE S 服 务器 上的 推送队 列并 不是 永久 保存 推送数 据, 它有 一个 过期 时间, 缺 省为 1 0 分 钟, 也 就是 说一 个推送 请求 在 MDS / BE S 服 务器上 最多 能够 被保 留 1 0 分钟。 同样 ,
这个过 期时 间可 以由 管理 员在管 理端 修改 。 推送队 列的 深度 修改 界面 如下:
推送队 列的 过期 时间 的修 改界面 如下 (以 毫秒 为单 位) :
对于推 送队 列的 进一 步讨 论是有 关推 送数 据进 入队 列后的 状态 如何 变化 , 下面 是推送 数 据在队 列中 的状 态变 化图 ,说明 了推 送数 据在 不同 情况下 的状 态变 化。 下图 的各个 状态中 , 淡蓝色 的状 态为 起始 状态 , 深 蓝色 的状 态为中 间状 态, 红色 的状 态为终 止状 态。 处于 中间 状 态的数 据最 终必 然会 转为 终止状 态的 其中 一种 。
当 MDS /BE S 服 务器 接收到 推送数 据后 ,如 果之 前目 标用户 没有 5 个 处于暂时 失败的 数
据包 , 服 务器 会将 数据放 入等待 发送 的队 列中 , 推 送的数 据处 于 “尝 试发 送” 状态 。 处 于 “ 尝 试发送 ”会 在很 短的 时间 内占 用 1 0 0 0 个队 列位 置中 的一个 ,不 管是 成功 还是 失败, 它所 占 用的队 列位 置很 快被 释放 。
然后 MDS / BE S 服 务器 尝试 将数据 推送 到手 持设 备端 ,如果 此时 对应 的手 持设 备处于 开 机状态 , 网络 一切 正常 , 则 MDS /BE S 服务 器将 数据 发送给 手持 设备 , 推送数 据变成 “ 成功 ” 状态 。 MDS / BE S 服 务器会 向应用 服务 器发 送异 步的 确认消息 , 同 时将 数据从 队列中 移除 。 注 意,此 时 MDS / BE S 服务器 向应用 服务 器返 回的 确认 消息并 不一 定是 表示 成功 2 0 0 ,具 体是
返回代 表成功 的 2 0 0 还是 返回代 表失败 的 40 0 还取 决于其 它因素 , 有 关这 一点 我们在 后面 的 章节中 详细 讨论 。
如果 MDS / BE S 服 务器 尝试 将数据 推送 到手 持设 备的 时候手 持设 备处 于关 机状 态 ,则 该 数据进 入 “暂 时失 败” 状 态。 处 于 “暂 时失败 ” 状 态的数 据不 占用 等待 队列 的队列 位置。 某 一个目 标用 户最 多只能 有 5 条 数据 处于 “暂 时失败 ” 状态 。 目 前没 有明 确的数 据或者 是文 档 说明一 个 MDS / BE S 服 务器 总共可 以保 留多 少条 “暂 时失败 ”状 态的 数据 。
如果某 一用 户已 有 5 条数 据处于 “暂 时失 败” 状态 , MDS /BE S 服 务器 接收到 该用户 新 的推送 请求 时会 直接 将该 数据转 入 “ 等待 ” 状 态。 每一条 进入 “等 待” 状态 的推送 数据 会占 用推送 队列 中的 一个 位置 。 当队 列中 的 1 00 0 个 位置 都被占 满的时 候 MDS /BE S 服务器 就停 止 接收新 的数 据推 送, 无论 新的数 据是 推送 给哪 个用 户。
处于“ 暂时 失败 ”和 “等 待”状 态的 数据 会在 服务 器上保 留 1 0 分钟 (如 上所 述,这 一
时间可 以由 管理 修改 ) , 1 0 分 钟后 处于 这两 种状态 的数据 将被 丢弃 , 进 入 “ 过期” 状态, 同
时 MDS /BE S 服务 器会 向应 用服务 器发 送异 步消 息, 这种情 况下 发送 的异 步确 认消息 一定 是 代表失败 的 40 0 。 如果 在 1 0 分 钟内 手持 设备 重新进 入网络 , 手持 设备 会发 送消 息到 MDS / BE S 服务器 告知 该手 持设 备已 经上线 , MDS /BE S 服务器 会将处 理 “ 暂时 失败”和 “等待” 状态 的 数据转成“尝试发送状态 ” ,重新发送该数据。 需 要注意的是 在 1 0 分钟 的 等待过程中 , MDS /BE S 服 务器 如果 没有 接收到 手持 设备 重新 连接 网络的 消息, 则 MDS /BE S 服务器 不会 尝 试重新 发送 “暂 时失 败” 和“等 待” 状态 的数 据。
根据以 上的 分析 可以 对推 出以下 结果 :
1 . 当用户 的手 持设 备在 线时 , 对 该用 户的 数据 推送会 被马上 处理 , 该数 据只在 很短的 时间 占用 1 00 0 个 等待 队列 中的 一个位 置。
2 . 当用户 的手 持设 备不 在线 时,假 设该 服务 器只 有一 个用户 ,则 服务 器在 1 0 分钟内 最多
可以接 收该 用户 的 10 0 5 条 数据。 其中 5 条处 于“暂 时失败 ”状 态, 1 0 0 0 条在 等待队 列 中。
3 . 如果用 户的 手持 设备 在数 据发送 给 MDS / BE S 服务 器 1 0 分钟 内重新 接入 网络 , MDS /BE S
服务器 可以 将该 数据 推送 到手持 设备 端。
4 . 如果 MDS / BE S 服 务器 的等 待队列 未满 ,推 送给 新的 用户的 前 5 条 数据 不占用 等待队列 。
5 . 如果 MDS /BE S 服务 器的等 待队列 已满 ,不 管是 由哪 个用户 的数 据占 满的 , MD S /BE S 服 务器都 会停 止接 收所 有用 户的新 的数 据推 送。
总结而 言, 在生 产环 境中 保证 MDS / BE S 服 务器 正常 工作的 关键 是要保 证 MDS / BE S 服务 器的等 待队 列不 被占 满。
手持设备端对 推送数 据 的处理
M DS /BE S 服 务器 成功 接收 应用服 务器 推送 的数 据后 会将数 据推 送到 手持 设备 端, 在手 持 设备端 需要 由客 户端 应用 程序将 推送 的数 据提 取出 来。 一个 直观 的猜 测是 手持 设备端 同样 需 要一个队列 保存数据, 否则客户端应 用程序在提 取前一条数据 时新到达的 数据就会直 接丢 失。 需要 验证 的是这 个队 列有多深 , 队 列行为 是否 被系统 隐藏 。 经过测 试证 实手持 设备端 确 实也存 在队列 ,队 列深度 为 1 0 , 而且可 以反 映在应 用层。 其中最 值得 开发人 员注意 的是 这 个队列 是一 个可 溢出 队列 。关于 手持 设备 端推 送数 据队列 的示 意图 如下 :
如图所 示, 当客 户端 提取 程序正 在读 取数 据“ R ” , 如图中 标有 R 的椭 圆形所 示,如果 有更多 的数 据被 推送 到手 持设备 端, 所推 送的 数据 会被放 入设 备的 队列 中, 一共 有 1 0 条数 据可以 被保 留在 设备 队列 中,如 椭圆 形 1 到 1 0 所示 。此时 如果 有更 多的 数据 被推送 进来 , 设备队 列已 满, 则这 些新 的数据 会溢 出, 如椭 圆形 1 1 、 12 、 1 3 所示 。同 时, 对于服 务器 端 而言, 数据 1 1 、 1 2 、 1 3 已 经被推 送过 一次 ,服 务器 端不会 再次 尝试 推送 这些 数据。 在这 种 情况下 ,数 据 1 到 1 0 可以 继续被 客户 端提 取程 序所 提取, 而数 据 1 1 、 1 2 、 1 3 则丢失 了。 对于尚 未推 送到手 持设备 端的数 据, 如数 据 1 4 、 15 ,假设 因为 网络中 断没有 被推送 到
手持设 备端 ,则 仍保 留在 服务器 端。 当网 络恢 复后 数据 1 4 、 1 5 仍可 以被 正常 处理。 对于确 认消 息 (图中 橙色 圆形所示 ) 的 处理则 更为 复杂 , 在 异步 确认消 息一 节中再作 讨
论。
从这一 节的 讨论 得出 的结 果是数 据到 达手 持设 备端 未必就 能够 被客 户端 提取 程序提取 , 客户端 提取 程序 有职 责尽 快提取 数据 , 防 止推 送数 据的溢 出。 溢出 的数 据在 客户端 无法 再被 处理, 而且 服务 器端 也不 会尝试 继续 推送 这些 数据 。
异步确认消息 (应用依赖和非 应用依赖 )
手持设 备端 在接 收到 推送 数据后 会通 知 MDS / BE S 服 务器, 这时 MDS /BE S 服务 器会根 据 最初的 推送 请求 向指 定的 U RL 发送 一个 确认 消息, 告知应 用服 务器 某一 条推 送数据 的最 终 结果, 这就 是异 步确 认消 息。异 步确 认消 息以 h t t p 协议发 送给 应用 服务 器, 消息 2 0 0 代表 数据推 送成 功, 40 0 代表 数据推 送失 败。
异步确 认消 息是 应用 服务 器判断 推送 是否 成功 的有 效工具 。 但 是, 很 多开 发人 员因为 对 异步确 认消 息的 机制 不了 解错误 地使 用了 异步 确认 消息 , 从 而导 致数据 的丢 失。 所以 , 我 们 需要详 细了 解异 步确 认消 息的工 作机 制。
要讨论 异步 确认 消息 的工 作机制 , 必 然涉 及到 应用 依赖与 非应 用依 赖。 应用 依赖的 推送 和非应 用依 赖的 推送 对应 的异步 确认 消息 工作 机制 是不同 的。
下面先 讨论 非应 用依 赖的 场景, 这也 是很 多开 发商 使用的 场景 。 如果推 送是 非应 用依 赖的 , 数据 是以 到达 手持 设备 为成功 标志 的, 只要 数据 到达了 手持
设备, MDS /BE S 服务 器就 认为该 数据 推送 成功 ,会 给应用 服务 器发 送异 步确 认消 息 2 0 0 。 如果数 据推 送时 手持 设备 不在线 , 则 1 0 分 钟内 M DS /BE S 服 务器 会在 服务 器上 保留该 数 据。 如 果 1 0 分钟 内手 持设 备重新 接入 网络 , 则 MDS / BE S 服务 器会 尝试 发送该 数据, 一旦 数
据到达 手持 设备 , MDS / BE S 服务器 都会 给应 用服务 器发送 异步 确认消 息 2 00 。
如果 1 0 分 钟内 手设备 没有 接入网络 ,则 该推 送数据 过期 , MDS / BE S 服 务器会 丢弃该 数 据,同 时给 应用 服务 器发 送异步 确认消 息 40 0 。
可以看 出, 非应 用依 赖的 推送方 式并 不能 保证 客户 端应用 程序 接收 到数 据, 在非应 用依 赖的推 送方 式下 MDS /BE S 返回 2 0 0 确认 消息 也不能 认为客 户端 已接 收到 数据 。如果 数据 送
达 手 持 设 备 的 时 候 客 户 端 应 用 程 序 没 有 启 动 , 所 推 送 的 数 据 会 在 手 持 设 备 端 丢 失 , 而
MDS /BE S 服 务器 认为 数据 已成功 送达 。 或 者是 客户 端应用 程序 已启 动, 但是 没有及 时读 取推 送数据 ,在 手持 设备 端溢 出的数 据也 会丢 失, MDS / BE S 服务 器同 样认 为数据 已成功 送达 。 所以 , 在 非应 用依 赖的 情况 下, 如果 接收 到 4 0 0 确 认消 息可以 确定 客户 端没 有收 到数据 ,
如果接收 到 2 0 0 确认 消息 ,只能 认为 客户 端可 能收 到了数 据。
从以上 的讨 论看 , 非 应用 依赖的 推送 方式 并不 适合 用于可 靠性 要求 较高 的应 用。 对 于可 靠性要 求较 高的 应用 , 需 要知道 客户 端应 用程 序是 否接收 到了 数据 。 应 用依 赖的推 送方 式就 是为此 而设 计的 , 如 果推 送是应 用依 赖的 , 数 据是 以客户 端应 用程 序确 认为 成功标 志的 , 只 要在应 用程 序确 认后 , MD S /BE S 服 务器 才认 为数 据推 送成功 , 这 时才 给应 用服 务器发 送异 步 确认消 息 2 0 0 。
有关客 户端 应用 程序 如何 确认收 到数 据, 在 “ 客户 端接收 关键 代码 ” 一 节中 有描述 , 简
单而言 就是 客户 端应 用程 序通过 调用 MDSP us hI np ut St re am 实例 的 ac ce pt 函 数 确认 数据 收 到,如 果客 户端 应用 程序 在接收 到数 据后 没有 调用 ac cept 函数 , MDS /BE S 服务器会 认为 数
据推送 失败 , 给应 用服务 器发送 异步 确认消 息 400 。 另 外一 点曾 经强 调过的 是, ac c ept 函数 调用后 , 只有 In putSt r e am 和 St re am Co nn ect io n 都关 闭了 , 确 认消 息才 被发送 给 MDS /BE S 服 务器。 在极 端的 情况 下这 一点会 影响 到异 步确 认消 息的结 果。
下面具 体分 析各 种情 景: 如果手 持设 备在 线, 但是 客户端 应用 程序 没有 启动 , 推送 数据 到达 手持 设备 端后没 有程
序侦听 推送 端口 ,当 然也 没有程 序会调 用 ac ce pt 函 数,此 时 MDS /BE S 服 务器 会认为 数据 推 送失败 ,向 应用 服务 器发 送异步 确认消 息 40 0 。
如果手 持设 备在 线, 客户 端应用 程序 在读 取推 送数 据后没 有调 用 ac ce pt 函数 直接关 闭 连接, 此时 MDS / BE S 服务 器同样 会认 为数 据推 送失 败, 向 应用 服务 器发 送异步 确认消 息 40 0 。 在这种 情景下 , 即使 客户 端接收 到了 数据 , 但 应用 服务器 仍收 到失 败消 息, 因为作 为成功 标
志的 ac c ept 函 数并 没有调 用。
如果手 持设 备在 线, 客户 端应用 程序 在读 取推 送数 据后调 用了 ac c ept 函 数, 并关闭 连 接,此 时 MDS / BE S 服 务器 会认为 数据 推送 成功 ,向 应用服 务器 发送 异步 确认 消息 2 0 0 。
对于手 持设备 不在 线的情 况,结 果与非 应用 依赖相 似, 1 0 分钟内 如果 手持设 备不接 入 网络的 话, 推送 数据会 在 MDS /BE S 服 务器 上过 期, MDS /BE S 服 务器 会向 应用 服务器 发送 异 步确认消 息 40 0 。
如果 1 0 分钟 内手 持设 备重 新接入 网络 , MDS /BE S 服务 器会尝 试发 送数 据至 手持 设备端 , 还是以 ac c ept 函 数的 调用 为推送 成功 的标 志。 如果 数据重 新发 送成 功, 但是 客户端 没有 调
用 ac ce pt 函数 ,则 MDS /BE S 服务 器会 向应用 服务器 发送异 步确 认消 息 2 0 0 。 对于推 送到 手持 设备 端但 是溢出 的数据 , 因 为没 有程 序能够 读取 该数 据并 针对 该数据 调
用 ac cept 函 数, MDS /BE S 服务器 会一 直等 待到 1 0 分 钟后 向应 用服务 器发 送异步 确认 消息
4 0 0 , 认为 数据 过期 。
一个特殊的情况是客户端应用程序在接收到数据后调用 了 ac cept ,但是没有关 闭 In putSt re am 和 St re am Co nn ect io n 。此时 M DS /BE S 服 务器会 认识 客户 端还 在处 理数据 ,会 继 续等待。 如果 服务 器等待 时候超 过 1 0 分 钟, M DS /BE S 服务 器会 认为数 据推送 失败 ,向 应用
服 务 器 发 送 异 步 确 认 消 息 4 0 0 。 如 果 在 1 0 分 钟 内 客 户 端 主 动 关 闭 In putSt re am 和 St re am Co nn ect ion , 或者是 网络异 常中断, MDS /BE S 服务器 会认 为数 据推 送成 功, 向应 用服 务器发 送异 步确 认消 息 20 0 。
下面再 讨论 一个 异常 情况 下的特 例:
结合以 上描 述的 各种 因素 , 在 极端 的情 况下会 出现 一些特 殊的 情况 。 如 上图 所示 , 假 设
MDS /BE S 服 务器 在推 送了 数据 R 、数 据 1 到 数据 1 3 后出现 网络 中断 。同 时客 户端应 用程 序 正在缓 慢地 读取数 据 R 。 此时数 据 1 到 数据 1 0 会 被保留 在手 持设 备队 列中 ,客 户端 应用 程 序在读 取数 据 R 后可 以继 续读取 数据 1 到 数据 1 0 。 如果客 户端 应用 程序 在读 取了数 据后 都 调用 了 ac ce pt 函数 , 则会 产生对 应用 确认 消息 , 如 图中的 确认消 息 R , 确 认消 息 1 到确 认消
息 1 0 。 但是 因为 网络 的中 断,这 些确 认消 息都 无法 到达 M DS /BE S 服务 器。如 果网络 在 10 钟内没有恢 复, MDS /BE S 服务器上所 有等待确 认消息的记录都 会认识是 过期的 , MDS /BE S 会向应 用服 务器 发送 异步 确认消 息 4 0 0 。 此后 即使网 络恢复 , 确 认消 息 R , 确认 消息 1 到确 认消 息 1 0 都不 再有效 。
在这种 特殊 情况下 , 即使 客户端 应用 程序 接收 到数 据, 并调 用了 ac cept 函数 , MDS / BE S
服务器 同样 认为 数据 没有 推送成 功。
根据以 上的 讨论 , 应 用依 赖的推 送同 样不 能保 证客 户端应 用一 定能 收到 数据 , 但 是,在 应用依 赖的 推送 方式 下 M DS /BE S 返回 2 0 0 确 认消息 可以确 定客 户端 已接 收到 数据。 因为 2 0 0 确认消 息是 由客 户端 应用 程序调 用 ac ce pt 函数 触发 的,客 户端 应用 程序 可以 在确认 数据 收 到后才 调用 ac c ept 函 数, 通知应 用服 务器 该数 据已 成功接 收。 甚至 可以 在接 收到数 据后 根 据数据 内容 决定 不调 用 ac c ept 函 数, 从而 通过 应用服 务器该 数据 没有 被接 收。
所以 , 在 应用 依赖 的情 况下 , 如 果接 收到 20 0 确 认消息 可以确 定客 户端 已经 接收 到数据 , 如果接收 到 40 0 确 认消息 ,只能 认为 客户 端可 能没 有收到 数据 。
因此,应用依赖的 推送 方式更适合可靠性要 求高 的应用,如果应用服 务器 接收 到 2 0 0 确认消 息就 可以 认为 推送 成功 , 继 续处 理其 它事务 。 如果应 用服 务器 接收 到 4 0 0 确 认消 息则 需要组 织数 据重发 , 直到 接收 到 2 0 0 确认 消息 为止 。 这 样就 可以 保证 客户端 一定能 够接 收到 需要推 送的 数据 。
如何保证数据推送的可靠性
通过以 上几 个章 节的 讨论 ,我们 知道 ,虽 然 MDS /BE S 服务器 提供 了很 多机制 保证数 据 推送的 可靠 性, 但是 都无 法完全 保证 数据 被客 户端 应用程 序所 接收 。
对于数 据推 送的 可靠 性保 证, 一 方面 开发 人员 需要 了解各 个可 能导 致故 障的 因素, 在应 用编写 的时 候尽 量减 少故 障出现 的可 能性 , 对 故障 点进行 规避 , 另 一方 面开 发人员 也需 要实 现额外 的机 制进 行数 据 重 发,在 故障 点无 法规 避的 情况下 通过 数据 重发 消除 故障点的影响 。
应用依赖和非 应用依赖的比较 和选 择
在实现 推送 应用 的时 候, 首要考 虑的 是有 关应 用依 赖与非 应用 依赖 的选 择。 应用依 赖的 推送 形式 在可 靠性方 面更 优于 非应 用依 赖的推 送形式 。 但 是应 用依 赖的推 送
形式 对 MDS /BE S 应用 服务 器的潜 在压 力较 大, 客户 端应用 程序 的实 现也 较为 复杂。 非应用 依赖 的推 送形 式优 势在于 实现 简单 ,对 MDS / BE S 应用 服务 器形 成的压 力相对 较
小。
非应用 依赖 的推 送形 式从 某种程 度上 讲有 点类 似于 广播协议 , 着 重点 是从 服务 器向客 户 端发送 大量 数据 , 并 不看 重客户 端的 接收 情况 。 从 数据的 应用 类型 来分 , 非 应用依 赖的推 送 更适合 于天 气信 息、 最新 报价等 数据 , 这些数 据在 客户端 应用 关闭 时被 自然 丢弃 , 短 时间 内 的多条 数据 有丢 失影 响也 不大, 必竞 用户 不会关 注 1 1 点 零六 分的 天气 和 1 1 点 零七分 的天 气 有何不 同。
应用依 赖的 推送 形式 则类 似于点 对点 协议 , 不 仅从 服务器 端向 客户 端发 送数 据, 同 时也 关注客 户端 的接 收情 况。 应用依 赖的 推送 更适合 于 O A , E RP 这 种应 用, 这种 应用需 要保 证 新的文 档或 者是 记录 一定 能到达 客户 端应用 , 丢 失一 条待办 信息 可能 就会 导致 整个审 批流 程 的停滞 。
再从两 种推 送方 式的 本质 差别看 , 应 用依 赖并 没有 额外的 机制 消除 故障 点, 它的优 势在 于它的 异步 确认 消息 更可 信。 所以 , 在 选择 了应用 依赖的 推送 方式 后, 进一 步还是 需要 实现 额外的 数据 重发 机制 ,根 据 MDS /BE S 所发 送的 异步 确认消 息实 施数 据重 发。
应用依 赖的 推送 , 再 加上 结合异 步确 认消 息的 数据 重发机 制, 是保 证推 送数 据可靠 性的 最好方 法。
M DS 接收线程限制的处理
不管使 用什 么方 式的 推送 ,应用 开发 时都 需要 考虑 到 MD S 接收 线程 的限 制。 不过, 以 现在的 服务 器处 理能 力, 正常情 况下 的 HT TP 推 送请 求可以 在几 毫秒 或者 是几 十毫内 处理 完 成,少量 的 HTTP 推送 不足 于构成 网络 阻塞 。
需要考 虑的 是应 用服 务器 端的推 送程序 , 在 推送 过程 中不要 在建 立连 接后 才动 态组织 数 据, 这 样会浪 费 h t t p 连接 资源。 好的 建议 是预 先组 织好数 据, 在建 立 HT TP 连 接后快 速写 完 数据, 尽快 关闭 连接 。
此外, 对于 应用 服务 器的 推送线 程也 要加 于控 制, 避免在 短时 间内 无限 制地 启动新 的线
程进行 连接 ,否 则也 容易 造成连 接过 多而 阻塞 的情 况。
从网络 层面 来看 ,调 整应 用服务 器与 MDS /BE S 服务 器之间 的网 络超 时设 置也 是避免 这 种问题 的一 种方法 。 在 允许 的范围 内调 大网 络超 时时 间可以 让应 用服 务器 的推 送线程 等待 更
长的时 间, 从而 让 MDS / BE S 有足够 的时 间释 放原有 的连接 。 最后 , 无 论使 用了什 么方 法调优 , 都需 要对应 用服 务器的 推送 程序 进行 异常 处理 , 当 发
现网络 超时 异常 的时 候可 以组织 数据 重发 。 当然 , 数据重 发的 间隔 时间 也要 考虑 , 不 要因 为 重发数 据再 次造 成网 络阻 塞。
M DS 推送队列限制的处理
相对而 言, M DS 推送 队列限 制造成 的推 送失 败比 M DS 接收队 列造 成的 推送 失败 更常见 。 已经发 现的 一个 实际 案例 是周未 的时 候用 户大 量关 机,导 致大 量推 送数 据处 于推送 队列中 , 填满了 推送 队列 ,从 而导 致 MDS /BE S 服务 器不 再响 应新的 推送 请求 。一 旦过 期时间 到达 , 有新的 队列 位置 空闲 ,又 有大量 新的 推送 数据 ,重 新占满 推送 队列 。
对于 MD S 推 送队 列的 限制 ,直观 的做 法是 对队 列参 数进行 调整 。如 之前 讨论 的,管 理 员可以 对队 列的 深度 和过 期时间 进行 调整 。
然而 , 出 于对 过期时 间的 不正确 理解 , 管理员 倾向 于将过 期时 间调 大。 当过 期时间被 调 大后, 推送 给关 机用 户的 数据在 服务 器占 用队 列的 时间就 变长 ,导 致 MD S 推 送队列 更容 易 被占满 。
所以, 如果 对过 期时 间进 行调整 的话 , 方 向是 将过 期时间 调小 。 过 期时 间越 小, 等 待数 据占用队列的时 间就越短 , MD S 推送队列被 占满的 可能性就越小。 但是,过 期时间也不 能 过小, 过期 时间 过小 可能 会导致 过多 的过 期数 据, 使应用 服务 器需 要处 理更 多的数 据重发 。 比如将 过期 时间调 成 1 分 钟,用 户走 过一 个人 行遂 道都可 能导 致数 据发 送失 败。
对于队 列深 度的 调整 ,方 向是调 大队 列深 度, 如从 缺省 的 100 0 调 整到 20 0 0 。此时 ,
MDS /BE S 服 务器 在同 一时 间可以 保留 更多 的等 待数 据, 减 少了 队列 占满 的机 会。 不 过调 大队 列深度 会让 MDS /BE S 服务 器保留 更多 的数 据, 从而 占用更 多的 服务 器内 存, 对服务 器产 生 更大的 压力 。所 以调 用队 列深度 需要 根据 服务 器的 运行能 力进 行调 用。
从应用 服务 器设 计角 度, 应用 MD S 队 列限 制的 方法 是尽量 减少 等待 数据 的发 送。如 发 送第一 条数 据的 时候 发现 数据过 期, 对于 该用 户的 其它数 据可 以调 整发 送时 间, 在 更长 的时 间间隔 后才 尝试 发送 。
对于 MD S 队列 限制 , 应用 服务器 端的 推送 应用 需要 对 MDS /BE S 服务 器返 回的 5 0 3 错误 进行处理 , 对 于出 现 5 0 3 错的数 据组 织重发 。 同样 , 重 发的 间隔 也需 要考虑 , 不 要因 为数 据 重发占 用更 多的 推送 队列 。 也可 以根 据目 标用 户进 行判断 , 对 于可 能关 机的 用户暂 时不 重发 数据。
手持设备端接 收队列的处 理
手持设 备端 接收 队列 并未 从文档 中明 确列 出, 是根 据测试 结果 分析 得出 的, 手持设 备端 目前也 没有 发现 设置 可以 调整该 队列 。 所以 客户 端程 序设计 的时 候不 应该 依赖 手持设 备端 队 列。
开发人 员需 要意 识到 的是 手持设 备端 的接 收队 列是 可溢出 队列 , 一旦 推送 数据 从接收 队 列出溢 出, 客户 端程 序就 无法提 取该 数据 了。 所以 在客户 端应 用开 始过 程中 要注意 加快 推送 数据的 提取 过程 , 在 提取 过程中 不要 对数 据进 行复 杂的计 算, 提取 完成 后尽 快读取 下一 条数 据。对 于接 收数 据的 处理 和计算 ,可 以交 由另 一个 线程完 成。
因为溢出数据对客 户端 应 用而言不可见,所 以数 据溢出时在客户端应 用中 也不会有异 常。开 发人 员需 要通 过服 务器返 回的 过期 消息 才能 知道该 数据 推送 失败 。
对于这 一点 , 客 户端 应用 除了尽 量避 免数 据溢 出外 , 无法 在客 户端 通过 其它 机制进 行补 充。
应用依赖的客 户端
对于应 用依 赖的 客户 端应 用, 关 键点 是决 定何 时调 用 ac ce pt 函数 , 同 时保 证 I np ut St re am
和 St re am Co nn ect io n 被关 闭。
如之前 讨论 的, 使用 应用 依赖的 推送 关键 是希 望使 用 MDS /BE S 发送 给应 用服 务器的 异 步确认 消息 , 从 而对 数据 是否到 达进 行判 断。 所以 应用依 赖的 客户 端应 用需 要保证 正确 调用 ac cept 函 数。
另外, 如果 In putSt re am 和 St re am Co nn ect io n 没有 关闭的 话, ac cept 函 数所 发出的 确认
消 息 无 法 被 MDS / BE S 服 务 器 收 到 。 开 发 人 员 在 代 码 中 应 该 主 动 关 闭 In putSt re am 和 St re am Co nn ect io n , 同 时 在 程 序 发 生 异 常 时 也 需 要 在 ca t ch 代 码 段 对 In putSt re am 和 St re am Co nn ect io n 进 行关 闭处理 。
异步确认消息 处理
异步确 认消 息用 于判 断数 据是否 被成 功推 送至 客户 端应用 , 要 使用 异步 确认 消息, 首先 要保证 成功 地, 无遗 漏地 接收所有 从 MDS /BE S 服务 器发送 过来 的异 步确 认消 息。
异步确 认消 息是一 个 HTTP 消息 , 消 息比 较短 , 接收 过程的 并发 压力 不大 , 下 面是一 个 异步确 认消 息的 样例 :
R eceiv e d not ifi ca t io n: G ET / HT TP / 1 . 1
Us er -Ag en t : RIM M DS CS A cc ept : * /*
X - RIM-P us h-ID : pus hI D: 20 8 1 7 7 3 7 6 8
X - RIM-P us h-D e s t in a t io n: m m t e s t @ bj.s e arb.c n
X - RIM-P us h-S t a t us : 40 0
Hos t : lo c al ho s t :77 78
其 中最 关 键是 的 获取属 性 X - RIM-P us h-S t a t us , 根 据 该属 性 的值 判 断数 据 推 送 是成 功
( 2 00 ) 还 是失 败 ( 4 0 0 ) 。 当然 , 属 性 X - RIM-P us h-ID 也非常 重要 , 用于 确定该 确认消 息是 针 对哪条 推送 数据 的。
如果应 用服 务器 端通 过确 认消息 发现 数据 推送 失败 ,则需 要根 据属 性 X - RIM-P us h-ID 重 新组织 数据 进行 重发 。
BlackBerry SDK下载
相关链接:
BES服务器推送机制分析(一)
BES服务器推送机制分析(二)
BES服务器推送机制分析(三)