旋风下载组件是腾讯研究院旋风下载团队在专注下载领域多年、积累雄厚技术沉淀的基础上推出的一款通用下载工具,它源于QQ旋风的下载内核,并针对软件升级、补丁下载等应用场景进行了多方面的优化。

由于旋风下载组件可以提供稳定、可靠的下载服务,目前旋风下载组件已在腾讯公司内部的多款业务上发力并获得了一致的好评,每年为公司节省带宽成本上亿元。目前旋风下载组件日独立用户数已突破1亿。

这些骄人成绩的背后,离不开旋风下载组件扎实的技术基础以及良好的系统架构。麻雀虽小,五脏俱全,旋风下载组件系统是一个整合了前后台多个功能模块,并且以庞大的服务器系统作为支撑的完整系统。

(一)旋风下载组件自身架构

旋风下载组件是一款体积小巧、以进程外COM(组件对象模型)形式存在的通用下载工具。它不能独立运行,必须依靠其它程序(称为旋风下载组件客户端)程序调起,并在完成下载后释放。旋风下载组件自身的架构如图1.1所示。

图1.1 –旋风下载组件架构图示

1、进程外COM组件封装/安装/驻留模块:该模块封装了下载组件COM方式的API接口。客户端程序通过这些接口管理下载任务,包括创建、删除下载任务、设置下载/上传速度、设置代理等等。这一层还实现了组件的安装逻辑,通过运行简单的安装指令就可以实现旋风下载组件的自动安装。

2、多业务加载逻辑控制模块:该模块负责统一协调的高层业务的下载行为,将高层业务的并发调用进行串行化。高层的组件客户端程序对旋风下载组件的调用可以是随意的,但在该模块的管理下,下载内核的相关调用可以有条不紊的进行。

3、UI界面展示:旋风下载组件拥有自身的UI界面,可以将当前下载的行为以图形化方式展示给用户。为满足业务对UI显示的不同需求,UI是否展示可以根据业务的需求进行后台配置。

4、Crash收集上报:当旋风下载组件进程发生Crash时,Crash收集上报模块会将组件版本号、Crash栈帧等信息上报至旋风后台服务器,以便监测旋风下载组件Crash情况,及时定位修复问题。

5、后台配置控制升级模块:旋风下载组件的升级模块会定时向后台服务器查询是否有更新并自动下载相关文件,支持对下载内核以及对整个下载组件的升级。

6、下载内核封装:该模块封装了下载内核,完成实际的下载任务相关操作,并通过回调方式将下载状态通知高层业务。下载内核支持从 Internet上的资源服务器进行多源下载(称为P2S),还支持下载组件节点之间点对点的数据交换(称为P2P)。

(二)旋风下载组件客户端架构

旋风下载组件基于组件对象模型(COM)编程,是一个进程外COM组件。当系统中有多个业务都需要调用旋风下载组件进行下载时,系统中只会生成一个旋风下载组件进程,各个业务之间的调用互不影响。多业务加载旋风下载组件的过程如图2.1所示。

图2.1 多业务调用旋风下载组件图示

业务加载旋风下载组件时需要传入专属的业务号。旋风下载组件根据业务号从配置服务器拉取各个业务的下载策略。这些配置可以实时调整,比如在游戏发布高峰期,适当降低HTTP源限速,尽量利用P2P带宽;而在带宽比较空闲时,可以提高HTTP下载速度。通过动态的参数配置,旋风下载组件可以灵活的调度带宽资源,实现带宽优化配置。

为了方便客户端程序的接入,旋风提供封装好的LIB库或DLL文件,简化对旋风下载组件的操作。对于接入旋风下载组件的业务,其客户端程序的架构如图2.2所示。

图2.2 旋风下载组件客户端架构图示

其中,旋风下载组件封装库LIB/DLL具有业务鉴权机制,只允许合法的业务ID加载,如果有新的业务需要使用旋风下载组件,需要向旋风下载申请合法的业务ID。

另外,LIB/DLL具有异常修复功能,可以通过重新安装旋风下载组件,或者直接加载下载内核的方式来保证下载功能。

(三)旋风下载组件后台系统架构

旋风下载组件的正常运行,很大程度上依赖于后台系统。旋风下载组件拥有一套完整的后台服务器系统,为旋风下载组件的正常运行提供强有力的支撑。旋风下载组件整体的系统架构如图3.1所示。

图3.1 旋风下载组件平台系统架构

从功能上划分,旋风下载组件的后台服务器大致可分为以下几类:

1、组件管理服务器

组件管理服务器主要负责管理旋风下载组件的自动更新。当旋风需要对旋风下载组件进行自动升级时,可以通过配置组件管理服务器向旋风下载组件下发升级任务。

2、资源服务器组

资源服务器组是旋风自己部署的内容服务器,可以向旋风下载组件提供加速资源的下载。这里的加速资源可以是热门精品资源、优先保障的资源等等。在重点业务正式升级的时候可以通过资源服务器加速保证下载的质量。

3、统计服务器

旋风下载组件会对各业务的下载性能进行统计,并将相关数据上报至统计服务器。统计服务器组对原始数据进行汇总分析,以Web页面的形式向各业务展示。

4、P2S服务器

P2S服务器是一个查询服务器,维护了URL与文件的对应关系,用于向旋风下载组件返回加速链接。旋风下载组件下载时,可以请求获取与当前URL指向同一文件的其他URL列表,从而实现多源下载。

5、P2P服务器组

P2P服务器(也称为P2P Tracker)负责管理当前的在线节点及其资源索引。旋风下载组件启动后,定期向P2P服务器发送心跳包上报可共享的资源,下载时会向P2P服务器查询拥有所需文件的其他节点信息。没有了P2P服务器,旋风下载组件的P2P就无法正常工作。

6、组件配置服务器

组件配置服务器管理各个业务的配置。旋风下载组件被加载时,根据业务号到组件配置服务器上查询相关业务的策略配置信息。在游戏发布或者软件更新的时候,可以通过调整各业务的配置,可以动态的改变各个业务的下载策略,实现带宽的灵活调度。

(四)旋风下载组件中的关键技术

旋风下载组件在实现中采取了多项关键技术来提高下载的性能,这些技术包括:高效的节点选择机制、P2S服务器加速、P2P加速等等。

1、高效的节点查询与选择机制

旋风下载组件一个非常重要的组成部分是P2P下载,需要在旋风下载组件之间交换数据,这就涉及到节点查询和选择的问题。

旋风下载组件在传统基于Tracker的节点查询机制上,引入了节点之间互相推荐的节点查询机制,节点的查询分为服务器查询与节点推荐两个部分。如图4.1所示

图4.1 节点查询机制

服务器端节点筛选:旋风后台的P2P服务器组是旋风下载组件的Tracker系统,实时维护着所有在线节点的信息。旋风下载组件会周期性向P2P服务器注册自己信息,并在下载的时候查询其他节点信息。

在接收到查询请求后,P2P服务器会综合考虑节点的多个属性,如网络类型、空闲带宽情况等,向节点返回一批经过筛选过的节点。由于P2P服务器已经做过筛选,从服务器获得的节点通常都具有相同ISP、负载较轻、网络性能较好等特点。这对于提升节点之间的连接性能非常有好处。

节点间互相推荐:除了从服务器查询节点,节点之间还可以互相推荐优质节点。节点在下载过程会实时的记录与对端节点之间的数据交换质量,并从中选择出综合性能较好的节点作为推荐节点。当有其它的节点请求相同资源时,节点可以将推荐节点列表中的节点返回。

节点之间的推荐机制,不仅可以避免由于P2P服务器宕机带来的单点失效问题,还可以对节点的实际数据交换能力进行实时评估,尽可能利用优质资源。

2、P2SP(Peer to Server and Peer)

P2SP也称为点对服务器和点(用户对服务器和用户)。与单纯的P2P网络不同,P2SP将原本孤立的服务器和镜像资源与P2P资源整合到了一起。服务器的深度参与,使许多P2P经典技术难题可以简单化,在下载稳定性和速度上比传统的P2P或P2S均有大的提高。

图4.2 旋风下载组件P2SP架构简图

旋风下载组件P2SP架构简图如图4.2所示,其基本架构主要由三部分构成:P2S系统、P2P系统以及其它辅助系统。

P2S加速系统

P2S主要负责整合internet上的各种URL资源,维护URL和资源(HASH)的对应关系,向旋风下载组件节点返回与当前下载URL指向相同文件的其他URL列表,帮助旋风下载组件从多个HTTP源进行并发下载。

旋风下载组件的P2S加速系统除了可以整合Internet上其它的URL外,还可以整合旋风自身的加速资源,对精品资源、保障资源等进行有目标的加速。自身P2S加速在游戏发布或者软件更新的时候显得非常重要,可以根据带宽和资源使用情况进行灵活的调度带宽,保障重点资源的下载性能。

图4.3旋风下载组件P2S加速架构简图

P2P加速系统

旋风下载组件源于QQ旋风,旋风下载组件P2P网络和QQ旋风P2P网络可以很方便的打通。QQ旋风客户端P2P服务器会把当前在线客户端节点的信息实时同步到旋风下载组件的P2P服务器上,旋风下载组件便可以同时从两类节点上获取数据。

另外,旋风下载组件还与ISP进行了良好的合作,在网络中部署了ISP-Friendly的P2P服务器,主要对本ISP内的P2P进行加速。本地ISP局部范围内的P2P加速不仅能提升用户的下载体验,同时还能有效缓解ISP带宽出口压力。旋风下载组件的P2P架构如图4.4所示。

图4.4旋风下载组件 P2P加速架构简图

辅助系统

除了P2S系统和P2P系统之外,P2SP还需要其他的一些辅助系统。比如爬虫系统,可以不断抓取internet上的URL链接,并将它们添加到P2S的库里,资源上报系统可以接收组件或者客户端的资源上报,通过资源验证系统验证后把相应的URL入库以便为其它节点提供P2S查询。其余还有统计系统、监控系统、升级系统等等,在此不再赘述。

至此,我们已经分三个层次,由低到高分别讲述了旋风下载组件自身架构、旋风下载组件客户端程序架构以及整个旋风下载组件后台系统的架构。这些部分合理组合在一起,构成了旋风下载组件完整的系统。旋风下载组件表面上看上去很小,但它却是一个完备的系统,集成了许多优秀的架构思想:比如多业务共同使用一个旋风下载组件使得一个产品对旋风下载组件的升级便可使其它产品也能立刻从旋风下载组件的最新特性中受益;配置参数的定制化可以使旋风下载组件能够针对不同的业务提供不同的服务,实现下载服务的多样化。后台服务器合理的逻辑化分可以使各服务器组各司其职,关键时候能够针对性能瓶颈迅速扩容……正是凭借这些优良的架构,旋风下载组件才能够承载着越来越多的重量级业务,面对着海量的用户时才能够做到游刃有余。我们也希望通过不断优化这些架构,可以将旋风下载组件打造成为一个重量级的通用下载平台,为需要下载的业务提供可靠稳定的下载支持,为各产品的更新和发布保驾护航。


<