功能实现-下载中心

来源:互联网 发布:三大真理五大流氓知乎 编辑:程序博客网 时间:2024/04/28 14:56

       项目介绍

       这是我加入YY后的第一个工作任务,项目名称:下载中心   目标:下载成功率达到99.9%以上,下载独立于主进程从而能够提供更为及时的更新服务!

       项目经过了差不多一个半月的周期,最终实现了目标:下载成功率,排除个别地区(如新疆)由于政策的干涉,顺利达到99.9%以上,基本在99.94%以上;下载及时性也OK,下载策略是:优先在独立进程下载,主进程备用下载;

       虽然时间用的有点长,但是也没有办法,因为整个项目都是我一个人在搞,编码和测试都是自己;其次是,需要不断:优化-采集数据验证——》再优化-采集数据验证——》...! 采集数据还得跟着版本发布来,不能随时发灰度采集数据;

       我们做下载中心主要想支撑的业务有2块:(1)插件化模块的更新  (2)包Size瘦身 (将大量SO从hardcode中去掉,进行动态下载)。所以,下载中心必须具备两点:成功率高、下载更快(及时)。


      实现步骤

      整个项目计划分为了三步:1 下载模块实现  2 成功率优化  3 及时性优化

      第一步 实现了:下载模块实现,下载成功率数据采集;

      第二步 成功率优化,首次灰度上线后,摸底下载成功率,然后制定优化方案;我们初步的成功率为99.35%,主要错误如下:

     

      接下来的几周,我们不断采集数据分析+优化+验证,2个来回后,我们做了下面这些优化,成功率也最终达到了:99.94%。

     (1)文件系统操作重试及检测:目录创建、文件创建;有时创建目录和文件会失败,甚至创建后,会被一些安全软件删除,需要不时check;

     (2)下载文件SHA1值校验 :校验文件完整性

     (3)重试机制优化

     (4)网络分类处理:弱网络、网络不可达、认证WiFi等,做不同的处理,如判断为认证WiFi,暂停下载,check登录情况,确认登录后,立即下载;弱网络,加大超时时间及重试间隔;网络不可达,等待网络。

     (5)Etag校验:防止被劫持下载到不必要的文件;及进行链路选择

     (6)接入SmartDns:解决部分域名解析错误的情况

     (7)下载后台配置CDN

     (8)链路选择:IP直连与域名请求之间切换

     (9)支持断点续传

       等等

      下图是重试机制流程图:

       

    下面是下载信息收集字段:

    


     第三步下载及时性

     由于网速的情况我们无法控制,我们的设计选择了:

     1 在后台进程下载,且后台进程可以接收Push进程的更新指令下载so或者插件进行更新;

     2 重点下载类型,设置无限重试(即:在有网络的情况下,间隔地不停下载,直到成功;无网络,后台进程等待网络的到来,一旦连接上,立即继续下载)。

     第一点,有个好处就是app主进程未启动时(即用户未打开app),后台照样能够下载及进行重点业务更新;在大部分情况下,用户下次启动app时,我们的插件和so都已下载ok,用户可以使用最新的特性了。当然,也做了备用方案,就是在后台进程被杀死,或者主进程启动不了后台进程时,主进程会去下载(这种备用方案,只在特殊情况下使用)。


     99.99%成功率的挑战

   如果想要实现99.99%的成功率,可以考虑尝试下面的优化(我们没有实现):
   (1)考虑使用okhttp,它的重试机制更先进,目前我们的网络框架还是使用的Apache;okhttp和Apache的比较,请看我的另外一篇文章:okhttp和Apache重试机制对比

   (2)下载地址备用,即同时在两个服务器配置下载文件,一个常识多次失败后,到备用后台下载;

   (3)大点的文件可以考虑分段或者差异化更新

     

    下载模块的代码设计,请看我的另一篇文章:代码设计之下载中心!点击打开链接


      

       

0 0
原创粉丝点击