文档中心 云点播 最佳实践 上传质量优化实践

上传质量优化实践

最近更新时间:2019-10-18 11:34:00

简介

无论是客户端上传还是服务端上传,在文件传输过程中都会碰到下面几个常见的质量问题:

  1. 文件上传为何这么慢?
  2. 如何提高上传速度?
  3. 上传成功率偏低如何解决?
  4. 移动端经常出现弱网问题导致上传失败,如何处理?

衡量上传质量的指标有:上传速度和成功率。

  • 上传速度的快慢往往影响着用户最直观的感受。例如,用户上传了一个50M的视频,半个小时还没上传完成,随着用户耐心耗尽,便面临着流失客户的可能性。
  • 上传成功率的高低是服务质量的保证,因为网络问题导致第一次上传失败后,用户再次发起上传的可能性会降低,带来的直接结果就是用户投诉,所以保证上传成功率是最基本的要求。

本文将基于云点播上传的场景,从原因分析和解决方案两个方面进行着重介绍,您可以根据自己的业务场景进行比对,选择合适的方案提高上传质量。

影响上传质量的原因

网络带宽

网络带宽是指在单位时间内能传输的数据量。带宽越大,单位时间内上传的数据量也越大,体现出来就是上传速度越快。上传是端对端的行为,所以两端的带宽对上传质量都有影响,而云点播后台服务器目前带宽充足,所以上传质量往往取决于用户侧的带宽。

用户与存储中心的距离

上传的文件最终在云点播都需要进行存储,存储的地方即是存储中心。用户开通云点播后,云点播默认会分配重庆地域作为存储中心。用户与存储中心的距离会影响网络链路的长度。

例如,相同文件,用户在北京上传到重庆,相比在成都上传到重庆,中间经过的链路会更长,影响的因素也会随着距离的增加而变多,最终导致上传速度变慢。因为长链路传输,中间环节出现的网络抖动、丢包等问题,也会影响上传成功率。短链路也不能避免这些问题,只是相比长链路,出现的概率会降低不少。减少用户与存储中心的距离,是提高上传质量的关键一步。

弱网

弱网是指一种网络的状态,出现高延迟、高丢包,表现行为即我们平时所说的“上网很慢”。弱网问题在现实生活中也很常见,例如在电梯和地铁里,主要原因是所处环境的信号传输不佳,导致数据包传输慢或者失败。这种场景在客户端上传尤为居多,特别是目前移动互联网盛行的时代,弱网问题困扰着许多开发者,这个也是提高成功率指标最难突破的问题。

解决方案

并发上传

对于网络带宽不足的场景,直接的办法就是申请更大的带宽。如果我们面临的是一个有限的带宽网络,如何充分的利用带宽进行上传,这是需要我们解决的。并发上传分为两个维度:

  • 文件级别,多个文件同时进行上传。
  • 分片级别,单个文件多个分片同时进行上传。

无论是前者还是后者,都可以通过调整对应的并发数,提高带宽的利用率。

文件并发上传

文件并发上传是利用多个进程或者线程,同时发起上传操作。目前云点播没有提供相关的 SDK 包装,用户可以参考具体的语言特性进行实现,下面基于云点播 Java SDK 提供一个简单的示例:

import com.qcloud.vod.VodUploadClient;
import com.qcloud.vod.model.VodUploadRequest;
import com.qcloud.vod.model.VodUploadResponse;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) throws Exception {
        // 并发数
        Integer threadNumber = 20;
        // 待上传的文件路径列表
        List<String> filePathList = new ArrayList<String>();

        // 添加待上传文件路径
        filePathList.add("/data/path1.mp4");
        filePathList.add("/data/path2.mp4");
        filePathList.add("/data/path3.mp4");

        // 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(threadNumber);
        // 创建上传Client
        VodUploadClient client = new VodUploadClient("your secretId", "your secretKey");

        // 并发上传
        for (String path : filePathList) {
            // 提交上传任务
            pool.submit(new UploadThread(client, path));
        }
    }
}

// 上传线程
class UploadThread implements Runnable {
    // 上传 Client
    private VodUploadClient uploadClient;
    // 文件路径
    private String filePath;

    public UploadThread(VodUploadClient uploadClient, String filePath) {
        this.uploadClient = uploadClient;
        this.filePath = filePath;
    }

    public void run() {
        VodUploadRequest request = new VodUploadRequest();
        request.setMediaFilePath(filePath);
        try {
            // 执行上传
            VodUploadResponse response = uploadClient.upload("ap-guangzhou", request);
            System.out.println(response.getFileId());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

分片并发上传

分片并发上传是针对大文件,拆分成多个分片同时进行上传。分片并发上传的优势在于可以快速完成单个文件的上传,云点播提供的 SDK 会根据用户文件的长度,自动选择普通上传以及分片上传,用户不用关心分片上传的每个步骤,即可实现分片上传。而文件的分片并发数通过ConcurrentUploadNumber参数进行指定,具体的使用示例参考对应 SDK,目前已经支持该参数的 SDK 列表如下:

就近上传

就近上传是指能够感知上传者所处的位置,分配离上传者最近的存储中心进行上传。例如,成都的用户会分配重庆地域进行上传,而不会分配到上海地域。

就近上传的能力带来最大的收益是减少了上传者到服务器的传输距离,其优点如下:

  • 减少了传输距离,提高了上传速度。
  • 提高了稳定性,保证了成功率。

云点播本身支持就近上传的能力,您只需简单确认下面两点:

  • 开通多个存储地域
    云点播默认提供的存储地域设置在重庆,如果要充分利用就近上传的能力,就需要开通希望就近存储的区域列表,可以在控制台上自助添加其他存储地域,详情请参见 上传存储设置。启用多地存储后,当用户上传时,通过 IP 识别用户所在的地域,云点播根据已经开通的地域列表,智能分配一个最近地域用于上传。
  • 校验是否正确调度
    如果开通了重庆及上海的存储地域,用户在成都发起上传,通过就近调度,理论上应该是上传到重庆。如何确认调度是否合理,可以获取完成上传返回的FileId,通过 获取媒体详细信息接口 返回的基础信息(basicInfo)进行确认,其中就包含了StorageRegion字段,代表媒体文件存储地区。

如果上传者中间经过了代理或者转发,导致最后云点播通过 IP 识别地区有误,也可以通过强制指定存储地域,上传到目标地域中,具体用法请参见:

预探测上传

预探测上传主要是一种针对各类网络错误场景进行优化的手段,例如网络连接失败、超时、DNS 劫持等,是云点播针对弱网上传提出的一种有效缓解方案,优化的策略包括下面几点:

  • 使用 HTTPDNS 解析域名获取后端地址,防止 DNS 劫持问题。
  • 探测多个地域的连通性及上传速度,获取最优上传地域。
  • 接入腾讯云加速网络,提供可靠稳定的传输通道。

预探测上传的能力目前应用在客户端上传中,接入方式简单,具体的用法参考 SDK 中预上传的说明: