通用技术 如何让 App 首屏启动更快 -- httpdns 持久化缓存方案

MQC · 2017年09月27日 · 580 次阅读

首屏启动之痛

对于大部分 app 而言,首屏启动是最为关键的场景之一,一旦出现阻塞将直接影响到用户体验,为此阿里云 httpdns sdk 推荐异步接口 getIpByHostAsync 来获取 ip,其大致过程如下:

_a

用户从调用 getIpByHostAsync 接口大致会经历:

  • 内存缓存检查
  • ip 合法性检查
  • 异步 httpdns 请求

从流程中可以看出,由于 httpdns 请求是异步的,对于 app 首屏场景来说,httpdns 可能正在解析途中,app 在解析结果返回前会拿到空的 ip,转而去做 Local DNS 解析。

解决之道:持久化缓存

为了追求极致的性能体验,尽量避免首屏启动时的 Local DNS 解析,本文推出 httpdns 的持久化缓存方案,新增接口:
void setCachedIPEnabled(boolean enable);

初始化示例:
service = HttpDns.getService(getApplicationContext(), ACCOUNT_ID);
service.setCachedIPEnabled(true);

当 setCachedIPEnabled(true) 被调用时,httpdns 解析记录从持久化缓存同步到内存缓存。httpdns 请求成功,解析记录会同步更新到内存缓存和持久化缓存,其大致过程如下:

  • Step1 httpdns sdk 初始化
  • Step2 持久化缓存开启
  • Step3 持久化缓存记录更新到内存缓存
  • Step4 调用 getIpByHostAsync
  • Step5 检查 ip 是否合法
  • Step6 拿到 ip,发起 http 请求

采用持久化缓存前,APP 启动时发起业务请求时过程:

_b

采用持久化缓存后的过程如下:

_c

有了持久化缓存,app 首屏启动就能立刻拿到解析好的 ip,同时,阿里云 httpdns sdk 内部的过期机制也能保证拿到 ip 的可靠性。此外,网络切换发生后,SP(Server Provider,服务提供商)也可能发生变化,相同 Host 在不同 SP 下获取的 ip 也会区别对待。httpdns sdk 会结合当前网络环境,通过 SP 和 Host 共同确定 ip,让 app 拿到的结果更加精准。

持久化缓存功能在Android v1.1.2 及以上版本添加,ios 版本也将在近期上线,敬请期待!使用过程中如果遇到什么问题,可以加入钉钉群进行交流,群号:11777313

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册