zoukankan      html  css  js  c++  java
  • 如何让你的大文件上传变得又稳又快?

    随着网络环境的大幅改善及网络资费的显著降低,人们在网络上的互动不再局限于传统的文本内容,图片、语音、视频等纷纷加入了互动行列。

    相较于文本内容而言,多媒体在易用性和情感表达上更有优势,当然相对文本,体积也大了很多。比如一条文本消息只有不到 100 字节,但一条视频消息可能超过 100 MB。这就导致多媒体在网络传输、实时触达等方面相对文本内容会更难一些。

    在网站或者程序中,除了用户交流的图片、视频等互动消息,还有其他形式的大文件也越来越多。保证大文件的上传稳定是一个需要长期投入和突破的重点。今天,我们就来看看都有哪些手段可以保证用户拥有一个良好的上传体验。

    如何让资源传递又快又稳

    或许大家会注意到,使用 QQ 时,朋友发送给你的图片和视频会加载一段时间才会显示,这是因为程序并不是发送文件给你,而是发送了文件路径,当我们访问路径后才会加载文件。这是当前主流的大文件通讯方式,即:

    • 上传文件到文件服务器

    • 推送文件路径

    • 收到文件路径

    • 加载文件

    这么做是因为大文件的传输耗时过长,会影响消息的即时性,所以不会直接传送文件。

    那么,我们如果要想让图片、视频、语音等多媒体消息发送得又快又稳,就可以从“上传多媒体文件到文件服务器”这一步上着手。

    上传接入点

    第一种优化上传文件的手段是优化上传接入点。

    上传请求到文件服务器,服务器响应建联,上传端再继续传递数据,直至上传完成。这个过程的耗时越短就会让人感觉网速越快。

    然而我们国家目前的固网宽带运营商构成复杂,跨运营商网络访问的高延迟和不稳定性一直是个比较棘手的难题。对于传输数据更多的视频、图片等多媒体文件来说,跨运营商来上传文件,多次 RTT(Round-Trip-Time,往返时延)的体验则会更差。

    目前针对这种网络情况的主流做法是,对不同的网络运营商提供不同的上传接入点 IP,然后通过运营商 DNS 解析,让用户能通过本运营商的上传接入点来快速上传文件。同时后端的图片上传存储服务后会部署在多线机房,方便快速地把文件流提交给存储层,从而避免从接入点到存储服务的跨网开销,并解决其他运营商的用户下载图片时需要跨网的问题。

    不过,虽然多个运营商接入点 IP 能解决跨运营商网络访问的问题,但是在管理和使用上会比较复杂。因此大部分服务提供商会利用多线 BGP(Border Gateway Protocol,边界网关协议)机房托管,这样就可以只提供 IP ,让访问用户自主选择最佳路由。

    分块上传

    除去上传接入点的优化,分块上传也可以提升多媒体文件的上传性能和成功率。

    分块上传,是指在上传客户端,把需要上传的文件按照一定规则切分为多个数据块,并按照规则标记序号,然后再分别上传这些数据块,服务端接收到后,按照序号重新将多个数据块组装成完整的文件。

    对于图片、视频这种较大的文件来说,分块上传可以让客户端在分块完成后,使用并发的方式充分利用网络带宽同时上传多个分块,有效提升了上传效率。此外,在一些网络环境较差、信号不稳定的场景下,采用分块的方式,在上传失败后进行重试时,只需要重传某一个失败的分块,不必重新上传整个文件,显著提升了重新发送的成功率。

    在分块上传中,分块大小也是一个重要的问题。如果分块太大,片数少,上传的并发度不够,可能会降低上传效率,而且每个大的分块在失败后重传的成本会比较高。但是如果分块太小,片数多,并发需要的连接数又太多,多条连接会降低网络的整体吞吐,客户上传端和服务接收端拆分与合并分块的开销也相应增加,而且传输时的额外流量也会更多。

    所以,不同网络环境下如何选择一个合适的分块大小至关重要。一般来说,在网络状况较好的环境,比如在 WiFi、4G 下,相应的分块大小应该设置得更大一些;而在 2G、3G 弱网情况下,分块可以适当设置小一点。

    断点续传

    因为大文件的上传耗时较长,如果用户由于网络断开、设备重启等原因,需要在上传未完成时暂停上传任务。当然,用户肯定不会希望下次上传是从头开始。因此如何从暂停位置开始上传的功能就变得必要起来。这就是我们常说的“断点续传”

    断点续传是通过给每一次上传行为分配一个唯一的任务标识,每个分块在上传时除了携带自己的序号外,还需要带上这个任务标识,服务端针对接收到的同一个任务标识的分块进行暂存,即使由于某个原因暂停上传了,这些暂存的分块也不会马上清理掉,而是保留一定的时间。

    当上传端需要继续上传时,在请求的同时会继续携带之前的任务标识。客户端接收到后会检查服务端已有分块的情况,如果没有过期就继续从上次断开的分块位置进行上传,反之则会重新上传。

    断点续传功能在上传大文件时,可解决传输较大文件过程中因网络错误而必须重头再来的痛点,对于提升用户上传体验是很明显的。

    如何快速拥有这些上传优势

    如果想要完成上述大文件上传优化,需要考虑到架构、设计、运维等方面,不仅优化成本高,改造时间相对也长。想要拥有上面所说的这些优势,选择又拍云存储就可以了。

    又拍云存储可以让大型文件通过 CDN 就近完成上传、上传加速传输、分块上传和断点续传,同时还可以使用图片处理、视频处理、文件压缩解压缩对文件进行处理。在文件访问的时候,也会通过 CDN 使用大文件分段缓存、视频拖拉、链路优化等功能进行全网分发。保证企业海量数据的传输、处理、存储、分发与容灾需求。

    推荐阅读

    CSS 盒子的边距塌陷

    热门剧本杀与 SaaS 的不解之缘

  • 相关阅读:
    计算几何中的精度问题
    codeforces上分计划
    洛谷P1962 斐波那契数列 (矩阵快速幂)
    codeforces 1474 E
    codeforces 1474 C
    codeforces 1467 E
    牛客练习赛76 F phi and phi (莫比乌斯反演)
    牛客练习赛76 D 魔物消灭计划 (斯坦纳树)
    牛客练习赛76 E 牛牛数数 (线性基)
    codeforces 1467 D. Sum of Paths (dp)
  • 原文地址:https://www.cnblogs.com/upyun/p/15592195.html
Copyright © 2011-2022 走看看