功能实现-下载中心
来源:互联网 发布:三大真理五大流氓知乎 编辑:程序博客网 时间: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)大点的文件可以考虑分段或者差异化更新
下载模块的代码设计,请看我的另一篇文章:代码设计之下载中心!点击打开链接
- 功能实现-下载中心
- 简单实现iOS通知中心的功能
- 下载中心
- 下载中心
- jsp实现下载功能
- 实现文件下载功能
- C#实现下载功能
- java 实现下载功能
- PHP实现下载功能
- java 实现 下载功能
- ashx实现下载功能
- 实现文件下载功能
- Servlet 实现下载功能
- .net实现下载功能
- java实现下载功能
- JS实现下载功能
- Servlet实现下载功能
- struts2实现下载功能
- android6.0下webview的定位权限设置
- Leetcode OJ: ZigZag Conversion
- Android开发直接调试后,删除有残留,带签名正式包装不上
- RDF关键词查询技术
- 大神推荐java多并发访问框架
- 功能实现-下载中心
- iOS应用开发基础(四)基础知识(数据存储和多线程)
- iptables防DDOS攻击和CC攻击设置
- Live555 源码分析之延迟事件处理
- Java实现文档在线阅读
- 如何把mac里的照片放移动硬盘
- sublime text3安装以及插件配置教程
- python学习网站
- java 树形对象工具类封装