解读阿里云oss-android/ios-sdk 断点续传(多线程)

摘要: oss sdk 断点续传功能使用及其相关原理

前言
移动端现状
随着移动端设备的硬件水平的不断提高,如今的cpu,内存等方面都大大的超过了一般的pc电脑,因此在现今的程序中,合理的使用多线程去完成一些事情是非常有必要的。
多线程上传的好处

进一步占满网络资源。
进一步占满I/O资源。
实现原理
策略
oss有分片上传的功能,阿里云断点续传就是基于分片上传的几个api接口进行的封装,主要由InitiateMultipartUpload,UploadPart,CompleteMultipartUpload,AbortMultipartUpload,ListParts这几个组成。
流程
图片描述
细节
断点续传是一个大任务,又3部分来完成,分别是获取uploadId,分片上传,完成上传,这一整个连续的步骤统一在一个线程中进行。
获取uploadId这块需要先对本地缓存文件进行获取,如未拿到,就会直接重新生成新的uploadId直接去进行分片上传,否则会对记录的id进行之前上传了多少片进行还原,继续原来的位置继续上传。
分片上传部分,采用多线程并发上传机制,目前线程开启数量最多5条,根据cpu的核数进行判断,如果核数<5 会采用核数进行配置, 分片的个数最多5000。
完成上传,对上传的part进行排序,需要按照自然顺序1~n 的顺序进行上传。
文件校验,通过文件的md5等其他信息进行校验,分片上传中每一片也会跟服务器做md5校验。
进度回调机制,目前进度回调算是最基础版,目前回调原理是根据每一个分片来回调的,即当分片上传成功回调一次。
使用方式
在本地持久保存断点记录的调用方式:

android:

String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/";
File recordDir = new File(recordDirectory);
// 要保证目录存在,如果不存在则主动创建
if (!recordDir.exists()) {recordDir.mkdirs();
}
// 创建断点上传请求,参数中给出断点记录文件的保存位置,需是一个文件夹的绝对路径
ResumableUploadRequest request = new ResumableUploadRequest("<bucketName>", "<objectKey>", "<uploadFilePath>", recordDirectory);// 设置上传过程回调
request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {@Overridepublic void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize);}
});
OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() {@Overridepublic void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {Log.d("resumableUpload", "success!");}@Overridepublic void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) {// 异常处理}
});

ios:

// 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象
OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];
resumableUpload.bucketName = <bucketName>;
resumableUpload.objectKey = <objectKey>;
resumableUpload.partSize = 1024 * 1024;
resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>];
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
resumableUpload.recordDirectoryPath = cachesDir;//记录断点的文件路径
OSSTask * resumeTask = [client resumableUpload:resumableUpload];
[resumeTask continueWithBlock:^id(OSSTask *task) {if (task.error) {NSLog(@"error: %@", task.error);if ([task.error.domain isEqualToString:OSSClientErrorDomain]&& task.error.code == OSSClientErrorCodeCannotResumeUpload) {// 该任务无法续传,需要获取新的uploadId重新上传}} else {NSLog(@"Upload file success");}return nil;
}];

性能统计
数据分析
android/ios 端的分片上传改为并发后的测试与之前对比,上传分片的网络请求速度 多线程 和 单线程是一样的使用时间,这个主要是取决于带宽速度, 多线程相较于单线程主要是提高了读取文件的io时间。数据如下:

iOS 模拟器测试  
100mb大小文件
1000 part  num  单线程  104.530217s  多线程  54.528591s
100  part  num  单线程  59.306880s  多线程  54.336914s
1.31g 大小文件
100 part  num  单线程  746.775666s  多线程  731.940330s
1000 part  num  单线程  822.866331s  多线程  733.306236s
2000 part  num  单线程  965.428122s  多线程  731.940330s
5000 part  num  单线程  1205.379382s  多线程  732.982330s
android motoXT1085 双核cpu
100mb文件
100 part  num  单线程  70.484s  多线程   53.656s
1000 part num  单线程 104.530217s  多线程54.528591s
1.31g视频文件
135  part num  单线程  869s  多线程  738s
1342 part num  单线程   1079.081s  多线程 732.079s

图片描述
总体来看比之前有提升,单线程随着片的个数的增加时间耗时越来越高,而多线程下,时间基本是一样的,按照目前默认配置的part size 256kb ,单线程下网络资源与I/O资源都吃满,并发下性能提高平均有30%左右(上传时间减少)

小结
移动端下,网络资源与I/O资源一般都比较紧缺,多线程不会提高网络的总带宽:比如,在跑满某个资源下载策略分配一个连接供给带宽2000Kb/s的时候,本地单线程 能够同时吃满 2000Kb/s,这里就到达了一个峰值;但是如果某个资源连接带宽是2000Kb/s,但是单线程请求带宽 已经达到 2000Kb/s,那么就是本地网络带宽 Block了上传速度,也就是说开再多线程,再多连接也都无济于事;但,如果本地网络带宽 吃完2000Kb/s 的同时还有很多的网络资源剩余,假如还有2000Kb/s的提升空间,那么这时再建立一个连接 将这 2000Kb/s 也吃满,那么此时的速度就可以达到 4000Kb/s,这时提速很明显,I/O资源同理。

后续计划
增加crc64编码方式进行文件正确性校验,服务端与客户端进行交互验证。
分片上传的多线程数量改为可配置,用户可以根据自己的实际需求进行设置。
进度回调优化,对进度的粒度进一步的细化,支持回调频率可配置等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云钻还在吗 苏宁怎么解除实名认证_快手7天怎么养号,5步简易养号方案送上

今天我们聊一聊&#xff0c;新注册的快手号&#xff0c;7天怎么养号&#xff1f;为什么要养号&#xff1f;什么情况下需要养号&#xff1f;一般来说&#xff0c;新账号、播放量不高、很少热门、违规等情况&#xff0c;都需要养号。养号有什么作用&#xff1f;养号的作用很多&am…

将html表格导出到excel表格,table2excel-将HTML表格内容导出到Excel中_html/css_WEB-ITnose...

简要教程jquery-table2excel是一款可以将HTML表格的内容导出到微软Excel电子表格中的jQuery插件。该插件可以根据你的需要导出表格中的内容&#xff0c;不需要的行可以不导出。它文件体积小&#xff0c;使用非常方便。注意导出的Excel文件的格式&#xff0c;默认导出为.xlsx格式…

RDS读写分离,海量数据一键搞定

简介 RDS为用户提供高透明&#xff0c;高可用&#xff0c;高性能&#xff0c;高灵活的读写分离服务。在最近的版本我们基于短连接的用户进行了优化&#xff0c;使得短连接的用户负载均衡更加完善合理。RDS读写分离有如下特性&#xff1a; 易用/透明性 用户只需要在原来的只读…

7 行代码优雅地实现 Excel 文件导出功能?

文章目录一、前言二、Apache poi、jxl 的缺陷三、阿里出品的 EasyExcel&#xff0c;安利一波四、EasyExcel 解决了什么五、快速上手5.1 添加依赖5.2 七行代码搞定 Excel 生成六、特殊场景支持七、Web 下载示例代码八、需要注意的点九、总结一、前言 关于导出 Excel 文件&#…

Docker精华问答 | 用dockerfile制作镜像

Docker 是个划时代的开源项目&#xff0c;它彻底释放了计算虚拟化的威力&#xff0c;极大提高了应用的维护效率&#xff0c;降低了云计算应用开发的成本&#xff01;使用 Docker&#xff0c;可以让应用的部署、测试和分发都变得前所未有的高效和轻松&#xff01;1Q&#xff1a;…

日志服务Flink Connector《支持Exactly Once》

摘要&#xff1a; Flink log connector是阿里云日志服务推出的&#xff0c;用于对接Flink的工具&#xff0c;包含两块&#xff0c;分别是消费者和生产者&#xff0c;消费者用于从日志服务中读数据&#xff0c;支持exactly once语义&#xff0c;生产者用于将数据写到日志服务中&…

两个瓶子水怎样一样多_同事每天比我多睡两个小时!省下70万买了地铁站附近房子 杭州姑娘却感叹买房时一定是脑子进了水……...

都市快报讯 你上下班路上要多久&#xff1f;这个问题最近引起网友热议。 昨天&#xff0c;杭州市城乡建设发展研究院发布11月份城区交通运行分析&#xff1a;从上个月起&#xff0c;杭州的交通运行已经开启“冬季模式”&#xff0c;晚高峰出行进一步集中&#xff0c;拥堵程度环…

为什么电路交换不适合计算机网络,电路交换技术不适合计算机数据通信

5.2 分组交换原理上一节介绍了计算机网络的组成和网络的体系结构&#xff0c;其中通信子网的基本任务就是将数据信息从源点传送到S的点&#xff0c;在源点与目的点之间可能要经过许多个链路和中继节点。链路的功能是传输&#xff0c;而中继节点的功能是交换&#xff0c;也就是从…

Kibana:数据分析的可视化利器

摘要&#xff1a; 阿里云Elastisearch集成了可视化工具Kibana&#xff0c;用户可以使用Kibana的开发工具便捷的查询和分析存储在Elastisearch中的数据。除了柱状图、线状图、饼图、环形图等经典可视化功能外&#xff0c;还拥有地理位置分析、数据图谱分析、时序数据分析等高级功…

Kubernetes监控在小米的落地

戳蓝字“CSDN云计算”关注我们哦&#xff01;转自&#xff1a;小米云技术作者&#xff1a;郭如意本文介绍了高可用、持久存储、可动态调整的Kubernetes监控方案的实现过程。小米的弹性调度平台&#xff08;Ocean&#xff09;以及容器平台主要基于开源容器自动化管理平台kuberne…

智能机器人建房子后房价走势_深圳建二手房价引导制度,学习长沙意图明显,距离稳准狠差点意思...

#深圳建二手房价引导制度#大家好&#xff0c;我是勇谈。9月17日&#xff0c;深圳市司法局就《深圳市房地产市场监管办法(修订征求意见稿)》公开征求意见。《征求意见稿》共九章108条。对于修订监管办法的必要性&#xff0c;深圳市司法局也给出了自己的答案“《办法》的相关规定…

idea解决maven pom依赖下载失败

流程1 第一步&#xff1a;打开cmd窗口&#xff0c;进入repository本地仓库 执行命令&#xff1a; 进入本地仓库&#xff1a; cd %userprofile%\.m2\repository第二步&#xff1a;执行以下命令&#xff1a; for /r %i in (*.lastUpdated) do del %i流程2 mvn -U idea:idea

6位技术大咖11月倾心巨献,大数据+安全主题的技术分享合集【阿里云MVP 干货集锦】...

摘要&#xff1a; 大家好&#xff0c;阿里云 MVP 11月大数据安全主题分享新鲜出炉&#xff0c;快来一睹为快吧&#xff01;哪些MVP的分享最吸引你&#xff0c;你最想支持哪个MVP&#xff1f; 我们将开启为期一周的最人气内容评选&#xff0c;我们将在MVP评论内容下抽取评论最佳…

淤泥管道机器人_丛台区设备管道清洗超高效率

丛台区设备管道清洗超高效率后&#xff0c;施工前对施工人员安全措施安排完毕后&#xff0c;对检查井内剩余的砖、石、部分淤泥等残留物进行人工清理&#xff0c;直到清理完毕为止。  CCTV管道检测是指管道闭路电视检测系统可以实现排水管道的内窥检测工作&#xff1a;可以检…

华为发布开发者召集令,等你来战!

戳蓝字“CSDN云计算”关注我们哦&#xff01;曾几何时&#xff0c;“上云”只是大型企业和科技领域的特权。时至今日&#xff0c;“云”不再是漂浮空中那般缥缈。普通企业&#xff0c;甚至是个人开发者之间&#xff0c;对“上云”的谈及也如同一日三餐那么平常。对于新兴行业而…

承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道...

摘要&#xff1a; 阿里持续交付平台已经经历了 8 年的不断迭代进化&#xff0c;成长为集团几万应用所依赖的最重要的研发工具&#xff0c;它的效率直接影响着几万研发日常工作。但平台不能只是工具的堆砌&#xff0c;更需要针对互联网时代的研发模式进行深度思考&#xff0c;不…

使用FTP下载文件connect.retrieveFileStream(filename) 获取不到InputStream流,返回null的问题

使用同事的代码做FTP下载文件&#xff0c;InputStream in connect.retrieveFileStream(fileName);执行这句时InputStream总是获取为空 后来把代码改成ftp.retrieveFileStream(new String(dirPath[1].getBytes(“UTF-8”), “ISO-8859-1”));加上字符集指定就好了&#xff0c;…

css怎么让两个table并排_关于CSS布局

水平居中水平居中可能是CSS布局中最常用到的布局&#xff0c;这里介绍几种水平居中的方式1、使用inline-block 和 text-align实现.parent{text-align: center;} .child{display: inline-block;}优点&#xff1a;兼容性好&#xff1b;不足&#xff1a;需要同时设置子元素和父元素…

边缘计算高考题!全答对就可以去华为上班!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 边小缘来源 | 边缘计算社区绝密★启用前2019年普通高等学校招生全国统一考试&#xff08;边缘计算社区版&#xff09;不定向选择题。&#xff08;1010100分&#xff09;1以下哪项不是边缘计算的特点&#xff1f;A.低时延C.离…

《2017中国开发者调查报告》即将发布!你看那个人,好像一个程序员哦!

摘要&#xff1a; 2017云栖大会北京峰会期间&#xff0c;云栖社区即将重磅发布首份《2017中国开发者调查报告》&#xff0c;历时3个月的调研&#xff0c;7032人参与调查问卷&#xff0c;最终呈现出一份集开发者画像与能力的完整描绘。想了解最接地气的中国开发者现状吗&#xf…