对于大部分 app 而言,首屏启动是最为关键的场景之一,一旦出现阻塞将直接影响到用户体验,为此阿里云 httpdns sdk 推荐异步接口 getIpByHostAsync 来获取 ip,其大致过程如下:
用户从调用 getIpByHostAsync 接口大致会经历:
从流程中可以看出,由于 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 请求成功,解析记录会同步更新到内存缓存和持久化缓存,其大致过程如下:
采用持久化缓存前,APP 启动时发起业务请求时过程:
采用持久化缓存后的过程如下:
有了持久化缓存,app 首屏启动就能立刻拿到解析好的 ip,同时,阿里云 httpdns sdk 内部的过期机制也能保证拿到 ip 的可靠性。此外,网络切换发生后,SP(Server Provider,服务提供商)也可能发生变化,相同 Host 在不同 SP 下获取的 ip 也会区别对待。httpdns sdk 会结合当前网络环境,通过 SP 和 Host 共同确定 ip,让 app 拿到的结果更加精准。
持久化缓存功能在Android v1.1.2 及以上版本添加,ios 版本也将在近期上线,敬请期待!使用过程中如果遇到什么问题,可以加入钉钉群进行交流,群号:11777313。