如何让你产品的用户拥有一流的上传体验

社区编辑2018-05-18 14:12

在当下的互联网产品中,短视频、线上 KTV、线上多媒体互动等场景可谓是越来越多。此类产品非常依赖价值创造者,比如美女主播,小视屏制作者,音乐制作人等等,为价值提供者创造一个优质的用户体验对这些互联网产品来说显得尤为重要。
 
那么,如何才能保障这一点呢?下面我们就从价值提供者生产并传播价值 (上传数据) 的用户体验方面来聊一聊。
 

 
如上图所示,这应该是当下很多 APP都面临的问题,上传失败、上传慢,导致了在用户体验上不尽如人意,从宏观层次来看我们可以把原因大致归结如下:
 

Mobile

移动端网络多种多样, wifi、2g、3g、4g,相比于 PC端,移动互联网较为显著的一个特点就是环境很不稳定,丢包比较严重,这就直接导致了客户端与服务端的连通率较低,导致文件上传下载速度很慢、成功率较低。

Long journey

另一点是移动端网络和 PC端网络都必须要面对的问题——广域网高延时。从网易云对象存储分布于各个区域布点机房之间的延时监控可以了解到,华北、西北、西南等区域节点到杭州机房的延时基本是 30ms~50ms左右,到了晚上网络繁忙时,有时延时往往会达到百 ms级别,丢包率也会相应变高。

You are in china

国内网络环境还有一个典型的问题就是电信、联通南北分隔,还有诸多小运营商的网络问题。国外和跨境访问就更不必说了,无论是国内访问国外还是国外访问国内基本只能干着急,延时丢包高到吓人。
 
深入到技术层面来看,技术人员都清楚这是因为互联网的根基——伟大的 TCP协议在此类移动、广域网络环境下显得有些捉襟见肘了。正如下图所示,我们面临的是一条质量极差的底层 TCP数据传输通道,丢包 ( High loss rate))和高延时 ( High RTT) 使得这条数据传输通道变得又窄又拥挤。
 

 

网易云提供解决方案

网易云作为一流的存储服务提供商(这是我们的目标),为网易集团内部和诸多合作伙伴提供了优质的对象存储以及基于存储的上下行数据传输加速等增值服务,一站式地为企业解决了移动互联网时代非结构数据的管理难题。
 
在国内、国外和跨境上传难、上传慢等是我们在与各行各业的互联网产品对接时它们所共同反映的问题。为此,从2014年初开始,网易云就着手打造统一的解决方案来帮助产品克服这一难题,目前,我们也已有了非常完善的解决方案。下面先来看一下我们取得的一些成果:

加速效果明显

 

 
网易云提供的解决方案帮助产品在传输速度和上传成功率上都取得了不错的提升效果,得到了用户肯定。( 上图是采用全国各级进行基调测试而得到的客观数据 )

接入便利

企业只需要使用 SDK(Android、iOS、Web PC),就可以在短时间内全方位解决各种上传不了、上传慢、安全上传等问题,让产品用户拥有一流的上传体验。
 

 
而如果有企业想要自己去构建一套客户上传系统,就会涉及到方方面面的投入:
 
○ 靠谱的上传协议:支持文件分片、断点上传、流式上传、安全上传(HTTPS)
○ 上传服务端系统:支持高并发、高吞吐(设计大量数据交互的服务端实际往往是很困难的)
○ 全平台的 SDK:包括移动端 Android、iOS; Web端;PC端
○ 大量资源投入等: 包括大量的人力资源(开发、运维)、各个地区边缘节点,国内外的专线资源等等
 
这么多的投入,资本耗费起码也得数百万。而使用网易云,企业可以零成本接入上传系统,和网易的合作伙伴站在同样的技术起跑线上去打造产品。

技术大揭秘

接下来就来和大家分享下我们在技术上是如何打造上述上传解决方案的。
 
我们在资源、架构、系统优化等方面的投入都非常之多,其中,主要的优化工作包括:
 
○ 边缘布点

○ TCP协议调优

○ 应用层协议优化

○ 移动端上传优化

○ 路由优化系统
 

1 边缘布点与TCP优化

 

 
客户端到基站主要是 High Loss Rate,即高丢包率问题;基站到数据中心之间主要是 High RTT 高延时问题。
 
我们的解决思路是一分为二。为了解决后半部分网络的高延时问题,我们将边缘节点服务器部署到离用户最近的地方,结合高速专线等方式快速地将用户数据上传到数据中心。
 
目前,网易云对象存储直传加速网络已经覆盖了国内的华中、华北、华南、华东、西南、西北几个大区;国外主要包括美国、日本、东南亚、欧洲等区域,其他区域覆盖也在不断完善中。
 
下图为国内覆盖的区域:
 

 
在国外,我们使用 aws机房的节点进行覆盖,通过国外高速专线接入国内机房。
 

 
边缘节点与数据中心 ( NOS中心机房)之间的网络是掌握在网易云自己手里的,所以优化首先就是克服掉广域网的高延时问题。我们在边缘节点和中心机房之间建立了长连接池,并且对 TCP连接做了一定的参数调优,比如 tcpslowstartafteridle、tcp_wmem 等等。这样做避免了每次上传数据的慢启动过程,保障一片数据只需要经过一次 RTT即可发送到数据中心 (理论上的最优效果)。
 
以下为线上基调测试北京节点优化前和优化后边缘节点到中心机房的统计 (边缘节点到中心机房的时间,包含写 NOS),可以看到优化后,相比于杭州 BGP边缘节点到杭州中心机房 (同机房),北京 AWS与之基本相差一个 RTT 30ms左右。
 

 

2 应用层协议优化

传统标准的对象存储服务(AWS S3 基本是事实标准) 原生就是为服务端进行设计的,包括系统设计及其提供的接口等都并不能很好地适应移动网络的需求。其中最重要的一点是传统(也是标准的) 对象存储的存储接口是不能支持断点续传的,其分块上传协议也主要是针对用户上传大文件的场景(最小分块大小为 5M)。
 
就当前移动互联网的应用场景而言,为了给用户提供更好的体验,包括语音、图片和视频等资源一般都是在确保不影响用户体验的基础上进行大幅度的数据压缩,其上传文件的大小往往都不会超过 1M,最小分块 5M完全派不上用场。
 
所以,必须为直传设计一套通用的协议以支持移动端上传,我们主要考虑了如下两个基本的设计目标:
 
断点续传:支持小文件短时间内的断点续传,支持大文件较长时间的断点续传。
 
流式上传:支持大小文件的流式上传,即在不知道最终文件大小的情况下进行一部分一部分的流式上传,比如支持边录边传。
 
如下为核心接口 PostPart
 

POST /${bucketName}/${objectName}?offset=${Offset}&complete=${Complete}&context={context}&version=1.0 HTTP/1.1
Content-Length: ${length}
Content-Type: ${contentType}
x-nos-token: ${token}

<data of body>

○ offset 为上传数据在整个文件中的偏移
○ x-nos-token 为上传令牌
○ complete 标识是最后一个文件分片数据
○ context 为服务端返回的标识,用于断点续传场景下唯一标识此次文件上传
 

3 移动端上传优化

为了应对移动端网络的高丢包率,除了设计如上专用于分片上传的协议之外,我们还做了以下几点优化:
 

HTTP PipeLine

 
在移动端网络环境下,为了提高文件上传的成功率,客户端往往会把文件进行切片。比如 1M的文件以 16K作为一个分片,一个分片一个分片进行上传。
 
传统的 HTTP 1.1 请求的模式 (即当前大部分用户使用的方式)为如下的 no pipelining模式。每一次分片上传都是等待一次 RTT之后才能够进行上传。在广域网环境下,比如海外的用户上传到杭州,下一次分片上传必须得等待上一次分片上传完成,也就是好几百 ms的时间之后才能进行下一分片的上传。
 

 
显然在广域网环境下传统的 HTTP non pipeling协议模式是不太合适的。当前,网易云的 SDK 支持 Http pipeling模式,在默认情况下使用 Http pipling模式进行上传。充分利用了客户端的上传带宽,同时也使得上传速度对客户端分块大小不是很敏感。
 
网易云在实验环境下,使用树莓派 + Facebook Augmented Traffic Control (FaceBook开源的网络环境模拟工具,其主要用来测试 FaceBook社交网络在一些弱网络环境的表现) 对 pipeline进行了一轮测试,如下为测试效果。且其在实际线上的表现也非常好,能够在服务端和网络优化的基础上再得到近一倍的速度提升。
 
国内:
 

 
国外:
 

 

连接池管理

 
完成一次 tcp 3次握手的时间基本在上百 ms的时间,所以 NOS Andriod SDK 、iOS SDK等 SDK上维护了与上传节点的连接池,避免每一次上传之前连接建立的时间消耗。
 

4 路由优化系统

 
另外,广域网系统也在不断地调整的过程中。为了获得最佳的上传效果,我们构建了一个闭环系统,使用基调动态跟踪广域网最佳路由,找到最优策略。
 
线上基调随机路由数据=>统计各路由质量=>生产最佳系统路由=>更新线上路由
 

 

更多精彩

除了直传加速服务,网易云对象存储服务在典型的数据资源,比如图片、音视频、反垃圾等方面还做了其他的多样的服务生态,一站式解决互联网时代非结构数据管理难题,助力企业高效起步。

○ s丰富的图片处理
○ 原生支持视频点播
○ 视频截图、转码服务
○ 易盾一键反垃圾
○ 事件通知
○ 丰富的访问控制