一种文件下载方法和装置转让专利

申请号 : CN201010580747.0

文献号 : CN102487401A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 黄仁海

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明实施例公开了一种文件下载方法和装置。该方法包括:服务器接收文件下载请求后,控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。该装置包括接收模块和下载模块;所述接收模块,用于接收文件下载请求;所述下载模块,用于控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。应用本发明能够对文件下载流量进行控制。

权利要求 :

1.一种文件下载方法,其特征在于,该方法包括:服务器接收文件下载请求后,控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。

2.根据权利要求1所述的方法,其特征在于,所述控制读取文件数据的频率包括:利用调度器控制服务器读取文件分片的频率。

3.根据权利要求2所述的方法,其特征在于,所述利用调度器控制服务器读取文件分片的频率包括:服务器根据文件下载流量,从当前处于等待调度状态的链接中调度出若干个链接,为该若干个链接读取文件分片;

其中,服务器将读取的文件分片发给请求文件下载的客户端后,如果该客户端请求下载的文件未下载完毕,则该客户端与服务器的链接进入等待调度状态。

4.根据权利要求3所述的方法,其特征在于,所述根据文件下载流量,从当前处于调度状态的链接中调度出若干个链接包括:利用服务器当前能够提供的文件下载流量的最大值除以最大文件分片的大小,所得的商是调度出的链接的个数。

5.根据权利要求3所述的方法,其特征在于,所述调度出若干个链接包括:按照各个链接进入等待调度状态的由先到后的顺序进行调度。

6.根据权利要求2至5任一权利要求所述的方法,其特征在于,所述将读取的文件数据发给请求文件下载的客户端包括:每次将服务器读取的文件分片的一部分发给请求文件下载的客户端。

7.根据权利要求2所述的方法,其特征在于,所述读取文件分片包括:服务器从其后台的其他服务器下载文件分片;

或者,服务器从本地读取文件分片。

8.一种文件下载装置,其特征在于,该装置包括接收模块和下载模块;

所述接收模块,用于接收文件下载请求;

所述下载模块,用于控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。

9.根据权利要求8所述的装置,其特征在于,所述下载模块包括调度器和数据读取单元;

所述调度器,用于控制读取文件分片的频率;

所述数据读取单元,用于根据所述调度器的调度结果读取文件分片,将读取的文件分片发给请求文件下载的客户端。

10.根据权利要求9所述的装置,其特征在于,所述调度器,用于根据文件下载流量,从当前处于等待调度状态的链接中调度出若干个链接;

所述数据读取单元,用于为所述调度器调度出的链接读取文件分片;

其中,数据读取单元将读取的文件分片发给请求文件下载的客户端后,如果该客户端请求下载的文件未下载完毕,则该客户端与服务器的链接进入等待调度状态。

11.根据权利要求10所述的装置,其特征在于,所述调度器,用于利用服务器当前能够提供的文件下载流量的最大值除以最大文件分片的大小,将所得的商确定为调度出的链接的个数。

12.根据权利要求10所述的装置,其特征在于,所述调度器,用于按照各个链接进入等待调度状态的由先到后的顺序进行调度。

13.根据权利要求9至12任一权利要求所述的装置,其特征在于,所述数据读取单元,用于每次将服务器读取的文件分片的一部分发给请求文件下载的客户端。

14.根据权利要求9所述的装置,其特征在于,所述数据读取单元,用于从该装置所在服务器后台的其他服务器下载文件分片,或者从该装置所在的服务器本地读取文件分片。

说明书 :

一种文件下载方法和装置

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种文件下载方法和装置。

背景技术

[0002] 目前,服务器处理业务请求的方式包括同步的处理方式和异步的处理方式。
[0003] 在同步处理方式下,调用者向服务器发起业务请求后,需要等待服务器的处理结果,然后调用者根据该处理结果继续后面的步骤。
[0004] 在异步处理方式下,调用者向服务器发起业务请求后,不需要等待服务器的处理结果,在服务器完成针对该请求的处理后,向该调用者发起通知,然后调用者再根据该通知执行该业务请求对应的后续步骤。
[0005] 多任务的服务器一般采用如下两种方式提高效率:
[0006] 其一,在同步处理方式下采用多线程的方式,其实现相对简单。
[0007] 其二,采用异步处理方式。由于在异步处理方式下,调用者在发起一项业务请求之后、且收到该项业务请求处理完毕的通知之前,该调用者还可以发起其他项业务请求,因而一般情况下,异步处理方式具有更高的效率。
[0008] 由于在异步处理方式下,一项业务的各个处理步骤被分开,因此中间数据需要保存下来,以便后续步骤的进行,且业务逻辑的描述以若干动作响应组成,因此引入状态机以保存中间数据和描述业务逻辑。
[0009] 状态机是一个有向图形,由一组节点和一组相应的转移函数组成,一个状态机对象对应一个完整的客户端的请求/响应过程。
[0010] 一种典型的采用异步处理方式的多任务服务器是异步并发下载服务器,其结构如图1所示。
[0011] 图1是异步并发下载服务器的模块化结构示意图。
[0012] 如图1所示,异步并发下载服务器包括前端网络交互模块、异步并发处理模块和源数据读取模块。
[0013] 其中,前端网络交互模块,用于与客户端进行通信;异步并发处理模块,是异步并发下载服务器的核心模块,用于按照业务逻辑进行业务处理;源数据读取模块,用于与异步并发下载服务器的后台系统相连,并进行相应的业务处理。
[0014] 图2是异步并发下载服务器的进程结构示意图。
[0015] 如图2所示,异步并发下载服务器中的包括三个进程,分别为:网络接收器、核心处理进程和网络连接器。这三个进程都采用异步处理方式,三个进程之间通过专用的信息通道来传递信令和数据。
[0016] 其中,网络接收器位于前端网络交互模块中,核心处理进程位于异步并发处理模块中,网络连接器位于源数据读取模块中。
[0017] 网络接收器,用于与客户端进行通信。具体地,网络接收器监听与客户端相连的端口,接收客户端的连接请求,将客户端发来的数据转发给核心处理进程,将核心处理进程回复的数据转发给客户端,向核心处理进程通知网络变化事件,例如通知链接已关闭、数据发送完毕等事件。
[0018] 核心处理进程是核心模块,用于按照业务逻辑进行业务处理,向网络接收器回复处理结果。
[0019] 网络连接器,用于从后台分布式系统拉取数据。具体地,网络连接器接收核心处理进程的请求,将该请求完整发送给相关服务器,接收相关服务器的回复并转发给核心处理进程,向核心处理进程通知网络变化事件,例如链接关闭、网络异常等事件。
[0020] 图3是核心处理进程的状态机示意图。
[0021] 如图3所示,核心处理进程从当前所述状态机开始,按照图3所示主驱动循环的箭头顺序依次经历其他状态机。例如,如果核心处理进程当前所处状态为收到链接/请求状态,则经历的状态按顺序为:创建状态机对象并加入状态机池、探测网络事件并触发相关状态机、进行其他相关调度、如果收到结束通知则退出当前处理进程,如果超时则进行超时处理。
[0022] 图3所示状态机的主驱动循环的单轮时间为2-3ms,其中,在收到当前状态机完成的通知后,直接进入下一状态机。
[0023] 图4是异步并发下载服务器进行文件下载的流程。
[0024] 如图4所示,该流程包括:
[0025] 步骤401,核心处理进程监测到接收器事件,该接收器事件为收到网络接收器发来的文件下载请求,则核心处理进程进入收到请求进行初始化的状态。
[0026] 步骤402,核心处理进程在初始化完毕后,进入查询文件信息的状态。具体地,核心处理进程向网络连接器推送查询文件请求。
[0027] 步骤403,核心处理进程监测到网络连接器回复文件信息的事件,进入得到文件信息的状态。
[0028] 步骤404,核心处理进程向网络连接器推送下载文件分片的请求,进入下载文件分片的状态。
[0029] 步骤405,核心处理进程监测到网络连接器回复分片数据的事件后,进入得到分片数据的状态。
[0030] 步骤406,核心处理进程进入回复客户端分片数据的状态,通过网络接收器向客户端推送分片数据。
[0031] 步骤407,核心处理进程监测到网络接收器回复已接收完毕的事件,判断当前正在下载的文件是否已下载完毕,如果是,则下载任务完成,如果否,则返回步骤404。
[0032] 由图4可见,网络接收器事件和网络连接器事件是驱动核心处理进程的状态机运行的唯一动力来源,即当核心处理进程完成一个分片的数据下载后,会立即启动下一个分片的数据下载。在这种被动的逻辑下,文件下载流量得不到任何控制。
[0033] 因此,对于采用异步处理方式的高并发文件下载服务器,如何对文件下载流量进行控制是当前亟需解决的技术问题。

发明内容

[0034] 有鉴于此,本发明提供了一种文件下载方法和装置,以便对文件下载流量进行控制。
[0035] 本发明的技术方案具体是这样实现的:
[0036] 一种文件下载方法,该方法包括:
[0037] 服务器接收文件下载请求后,控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。
[0038] 一种文件下载装置,该装置包括接收模块和下载模块;
[0039] 所述接收模块,用于接收文件下载请求;
[0040] 所述下载模块,用于控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。
[0041] 由上述技术方案可见,本发明提供的文件下载方法和装置,通过在文件下载的过程中控制文件数据的下载频率,来控制文件下载流量。在每次下载的文件数据量较为稳定时,文件数据的下载频率越高,则文件下载流量越大,文件数据的下载频率越低,则文件下载流量越小,因此,本发明通过控制文件数据下载频率能够解决文件下载流量控制的技术问题。

附图说明

[0042] 图1是异步并发下载服务器的模块化结构示意图。
[0043] 图2是异步并发下载服务器的进程结构示意图。
[0044] 图3是核心处理进程的状态机示意图。
[0045] 图4是异步并发下载服务器进行文件下载的流程。
[0046] 图5是本发明提供的文件下载方法流程图。
[0047] 图6是一个客户端从服务器下载文件的方法流程图。
[0048] 图7是文件下载流量的水位关系示意图。
[0049] 图8是调度器中的等待队列示意图。
[0050] 图9是本发明提供的又一文件下载流程图。
[0051] 图10是本发明提供的一种文件下载装置的结构图。

具体实施方式

[0052] 本发明提供的文件下载方法和装置,应用于采用异步处理方式的服务器中,通过控制文件数据的下载频率来控制文件下载流量。
[0053] 当在服务器后台采用分布式网络架构存储需要下载的文件、且需要下载的文件较大而需要分片下载时,可以利用调度器控制文件分片的下载频率。当在服务器本地存储需要下载的文件时,如果客户端从该服务器下载文件,由于服务器每次读取的数据块的大小有限,一般不能一次读取整个文件,也需要每次读取文件的一个分片,因此服务器可以通过控制从本地读取文件分片的读取频率来控制文件下载流量。
[0054] 图5是本发明提供的文件下载方法流程图。
[0055] 如图5所示,该流程包括:
[0056] 步骤501,服务器接收文件下载请求。
[0057] 步骤502,服务器在文件下载的过程中控制读取文件数据的频率。
[0058] 步骤503,服务器将读取的文件数据发给请求文件下载的客户端。
[0059] 其中,可以利用调度器控制服务器读取文件分片的频率。具体地,当在服务器后台采用分布式网络架构存储需要下载的文件时,可以利用调度器控制从该服务器后台的其他服务器下载文件分片的频率;当文件数据存储在服务器本地时,利用调度器控制从服务器本地读取文件分片的频率。
[0060] 所述利用调度器控制服务器读取文件分片的频率具体可以包括:
[0061] 服务器根据文件下载流量,从当前处于等待调度状态的链接中调度出若干个链接,为该若干个链接读取文件分片,其中,服务器将读取的文件分片发给请求文件下载的客户端后,如果该客户端请求下载的文件未下载完毕,则该客户端与服务器的链接进入等待调度状态。
[0062] 下面以在服务器后台采用分布式网络架构存储需要下载的文件为例,对客户端从服务器下载文件的方法的详细流程,以及调度器进行调度的具体方法进行介绍,具体请参见图6至图9。图6至图9的方法也适用于在服务器本地存储文件数据时的文件下载过程。
[0063] 图6是一个客户端从服务器下载文件的方法流程图。
[0064] 如图6所示,该流程包括:
[0065] 步骤601~步骤603,同步骤401~403。
[0066] 通过步骤601~步骤603,客户端向服务器发起下载文件的请求,服务器根据该请求读取相应的文件信息。
[0067] 步骤604,所述客户端与所述服务器的链接进入等待调度状态。
[0068] 步骤605,服务器监测到调度器触发该客户端下载文件的调度器事件后,向网络连接器推送从后台下载下一个文件分片的请求。
[0069] 步骤606,服务器监测到网络连接器回复分片数据的连接器事件后,进入得到分片数据的状态。
[0070] 步骤607,服务器通过网络接收器向客户端回复分片数据。
[0071] 步骤608,服务器监测到网络接收器向客户端回复完毕所述分片数据的接收器事件后,判断该客户端请求下载的文件是否已下载完毕,如果是,则下载任务完成,如果否,则返回步骤604。
[0072] 在图6所示下载流程中,每当服务器得到客户端请求下载的文件信息或者客户端下载完一个文件分片后,该客户端与服务器的链接即进入等待调度状态,对于并发下载的服务器,在同一时刻会有多个链接处于等待调度状态,服务器利用调度器对多个处于等待调度状态的链接进行调度,为被调度到的链接从后台下载下一个文件分片,进而将下载的下一个文件分片回复给相应的客户端,而其他没有被调度到的链接则继续处于等待调度状态。其中,一个链接对应一个状态机对象,该状态机保存该下载链接的运行状态和中间数据。
[0073] 可见,本发明通过控制文件分片的下载频率来解决文件下载流量控制的技术问题,具体由调度器触发服务器核心处理进程的状态机转换,由于由调度器触发核心处理进程的状态机转换是属于服务器自身的一种主动触发,与现有技术中仅仅根据接收器事件或连接器事件来触发核心处理进程的状态机转换相比,能够解决文件下载流量控制的技术问题。
[0074] 利用调度器从当前处于等待调度状态的链接中调度出若干个链接时,涉及到两个问题,其一是调度出的链接个数,其二是调度出哪些链接,下面对这两个问题分别予以说明:
[0075] 调度出的链接个数可以确定为服务器当前能够提供的文件下载流量的最大值除以最大文件分片的数据量大小。其中,可以预先确定最大文件分片的数据量大小,一般该数据量不宜太大,也不宜太小,太小导致读取次数高而引发IO瓶颈,太大容易浪费内存且影响处理时间,如已经实现范例从后台服务器中的读取的文件分片大小为128KB。。
[0076] 下面采用一个形象的例子对调度器从当前处于等待调度状态的链接中调度出若干个链接的方法进行介绍,具体请参见图7及其说明。
[0077] 图7是文件下载流量的水位关系示意图。
[0078] 图7示出的是用于模拟调度器进行文件下载流量控制的虚拟流量水缸,用以预测和计算文件下载流量的流逝以及需要调度出的链接个数。
[0079] 虚拟流量水缸中的水表示服务器能够提供的文件下载流量,当前水位与水平位之间的水差表示服务器当前能够提供的文件下载流量。在初始状态,即服务器提供下载的文件数据的起始时刻,当前水位处于水平位上,随着文件下载过程的进行,当前水位进行相应的变化。具体地,当前水位的变化服从下面两个规则:
[0080] 规则一,服务器的当前水位随着时间均匀增长,增长速度为允许的最大文件下载速度,例如,允许的最大文件下载速度为30MB/s,则当前水位每秒钟增加30MB。
[0081] 规则二,当服务器向客户端回复下载的数据,即服务器有数据吐出时,当前水位下降相应大小,例如,当服务器向客户端回复128KB的数据时,当前水位下降128KB。
[0082] 另外,为了避免水位无限制增长,设置有满水位,当前水位一般不得高出满水位。
[0083] 采用规则一和规则二计算当前水位的物理含义是:根据服务器允许的最大文件下载速度,可以计算出一定时间内服务器允许下载的最大文件流量,采用规则一计算出的当前水位在一定时间内增长的数值即相当于该最大文件流量;在该段时间内,服务器已经向客户端回复的文件数据量,相当于已经占用的文件流量,则服务器当前能够提供的文件流量应该等于在该段时间内能够提供的最大文件流量减去已经占用的文件流量,即相当于规则二中在根据规则一计算出的当前水位的基础上下降已经下载的数据量对应的水量。
[0084] 参照图7,在调度操作中,由于当前水位与水平水位之间的水差相当于服务器当前能够提供的文件下载流量,因此可以根据所述水差计算需要调度出的链接个数。
[0085] 具体地,所述水差小于或者等于0,表示当前已占用的文件下载流量已超过了该服务器能够提供的最大文件下载流量或者服务器当前能够提供的文件下载流量已全部被占用,则调度出的链接个数为0,相当于暂停调度。
[0086] 所述水差大于0时,该水差的值表示服务器当前能够提供的最大文件下载流量,则调度出的链接个数=水差/最大分片大小,其中,最大分片大小为固定值,例如可以为128KB,文件分片的数据量一般都等于该最大分片大小,不过文件尾部的最后一个文件分片的数据量一般小于该值。
[0087] 在调度器的每轮调度时都会计算当前水位,进而根据当前水位与水平位之间的水差确定需要调度出的链接个数。所述链接个数的计算原理可以简述为:由于一段时间内总共的文件下载流量被限制在一个固定值内,则可以根据该段时间的前一部分已经下载的数据量,确定该段时间的后一部分能够提供的文件下载数据量,进而控制文件下载流量。
[0088] 根据以上对图7的描述,可以看出,当前水位的变化有以下两种情景:
[0089] 情景一,当服务器的下载压力较小时,当前水位在满水位附近上下抖动。
[0090] 情景二,当服务器的下载压力较大时,当前水位在水平水位附近上下抖动。
[0091] 由于调度器的调度周期一般越小,因此当前水位上下抖动的幅度一般也较小,即服务器的下载带宽较为平滑。
[0092] 关于调度出哪些链接的问题,在调度过程中,可以按照各个链接进入调度状态的由先到后的顺序进行调度,从而保证调度的公平性,避免某些链接由于一直没有被调度而造成“饿死”的现象。
[0093] 具体地,可以在调度器重设置一个等待队列,例如可以是双端队列或者链表,当客户端与服务器的链接进入等待调度状态时,将该链接对应的状态机句柄或指针追加至等待队列的尾部,在退出等待调度状态时,则不必从所述等待队列中移除,而只需要将其状态转换为除等待调度状态以外的状态,或者通过标志位标识是否处于等待调度状态即可,将未处于等待调度状态的从等待队列中移除的操作可以在执行调度动作时再进行。调度器在调度时,从等待队列中处于等待调度状态的链接中,按照进入队列由头到尾的顺序(即进入该队列由先到后的顺序)依次调度出各个链接,直到调度出的链接个数满足等于根据所述水差计算出的链接个数或者所述队列已被遍历完毕为止。
[0094] 图8是调度器中的等待队列示意图。
[0095] 如图8所示的等待队列,阴影部分的当前状态机不是等待调度状态,该状态机不是有效的可触发状态机,需要从等待队列中移除。
[0096] 选取N个状态机(即N个链接,其中N根据图7的所述水差计算得到)的方法为:从等待队列的头部向尾部遍历,如果是处于等待调度状态的状态机,则选出,如果无效则移除,直到已经选出的状态机数量为N或者已遍历完毕。
[0097] 本发明还提出了进一步平滑文件下载流量的方法,具体请参见图9。
[0098] 在服务器有大量链接,且总体流量有限制的情况下,每个链接不会有太高的速度。由于服务器每次吐出的分片大小是固定的,而该大小相对客户端来说是比较大的,其结果是客户端每个时间间隔得到一个大分片,带宽上下波动。
[0099] 假如一个限速250mbps的服务器,同时有1500个有效链接,那个每个链接的平均速度是21KB/s,即客户端每6s收到一个128K的一个分片,则其带宽波动较大。
[0100] 图9是本发明提供的又一文件下载流程图。
[0101] 如图9所示,该流程包括:
[0102] 步骤901~904,同步骤601~604。
[0103] 步骤905,服务器监测到调度器主动触发该客户端下载文件的调度器事件后,判断当前即将下载的文件分片是否已存储在服务器本地,如果是,则执行步骤908,如果否,则执行步骤906。
[0104] 步骤906~907,同步骤605~606。
[0105] 步骤908,向客户端回复服务器从后台下载的分片数据的一部分。
[0106] 步骤909,同步骤608。
[0107] 图9所示方法可以概括为:服务器每次向后台下载一个较大的文件分片,然后存储在服务器本地,当服务器向客户端回复数据时,将从后台下载的较大的文件分片打散成小分片,然后每次被调度时向客户端回复一个小分片,从而能够平滑文件下载流量。图9所示方法首先由服务器从后台拉取一个较大的文件分片,然后缓存起来,之后再每次将该大的文件分片的一部分返回给客户端,既可以避免服务器频繁向后台拉取文件数据,又能够平滑客户端从服务器下载文件的流量。
[0108] 通过图9所示的方法,可以平滑文件下载流量,而且可以避免文件下载影响用户的网络使用质量。图9所示方法的一个代价是需要一定的服务器内存做为文件分片数据的缓存,针对一般配置的服务器,该代价完全可以接受。
[0109] 继续上面250mbps的服务器同时有1500个有效链接的例子,采用图9所示方法后,单个链接上每次接收到的数据量比较平滑,因而带宽抖动较小。
[0110] 当文件数据存储在所述服务器的本地时,根据文件下载流量和每次读取的文件分片大小,控制文件分片的读取频率,其具体流程参照图6和图9执行,与图6和图9的区别在于,将图6和图9中的服务器从后台下载分片数据替换成服务器从本地读取分片数据。
[0111] 图10是本发明提供的一种文件下载装置的结构图。
[0112] 如图10所示,该装置包括接收模块1001和下载模块1002。
[0113] 接收模块1001,用于接收文件下载请求。
[0114] 下载模块1002,用于控制读取文件数据的频率,将读取的文件数据发给请求文件下载的客户端。
[0115] 下载模块1002包括调度器和数据读取单元。
[0116] 所述调度器,用于控制读取文件分片的频率。
[0117] 所述数据读取单元,用于根据所述调度器的调度结果读取文件分片,将读取的文件分片发给请求文件下载的客户端。
[0118] 所述调度器,用于根据文件下载流量,从当前处于等待调度状态的链接中调度出若干个链接。
[0119] 所述数据读取单元,用于为所述调度器调度出的链接读取文件分片。
[0120] 其中,数据读取单元将读取的文件分片发给请求文件下载的客户端后,如果该客户端请求下载的文件未下载完毕,则该客户端与服务器的链接进入等待调度状态。
[0121] 所述调度器,用于利用服务器当前能够提供的文件下载流量的最大值除以最大文件分片的大小,将所得的商确定为调度出的链接的个数。
[0122] 所述调度器,用于按照各个链接进入等待调度状态的由先到后的顺序进行调度。
[0123] 所述数据读取单元,用于每次将服务器读取的文件分片的一部分发给请求文件下载的客户端。
[0124] 所述数据读取单元,用于从后台下载文件分片,或者从服务器本地读取文件分片。
[0125] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。