文件操作任务化
越来越多的企业开始使用悦库企业网盘,其中部分大型企业中存储的文件数量已经达到数千万,容量超过300TB, 对海量文件处理能力的要求也越来越高。
海量文件操作的特点是文件数量多、持续时间长、对服务器资源占用量大。对于上传/下载操作我们已经有较好的任务化实现,用于监控任务的执行过程,但对于像复制、移动、删除、还原等文件夹操作目前任务化支持较弱,因此如果这些操作一次处理的文件数量非常巨大,比如几十万、甚至百万的数量,则可能会出现一些不稳定因素。
我们提出将文件操作任务化,例如将文件夹的复制、移动等操作任务化后,使其人机交互形式就像上传和下载文件任务一样,这样便于实时监控海量文件操作任务的进度和状态,如下 [图1] :
图1 [ 文件操作任务化]
对于主要的文件操作,例如复制、移动、删除、上传、下载、还原等,需要抽象出基础任务对象,这其中应该包括任务的创建、暂停、继续、取消、重试等方法,这样可以在客户端中对上述多种文件操作进行统一的任务管理,就像图1所展示的那样。另外,任务运行过程中应该记录错误日志,当任 务出错时可以直接在任务中查看错误详情。
任务定义
当一个任务被创建时,会在数据库表中记录任务的基本信息,包括,任务ID、文件ID、文件名称、大小、目的位置、进度状态和日志信息等,后续任务运行过程中会根据情况不断更新进度和日志信息。任务的类定义,如下图:
任务实现
任务状态
任务的状态包括:等待、加载中、运行中、暂停、继续、取消、错误。大文件夹的复制、移动和还原都需要预先加载文件夹的节点信息,因此"加载中"状态可能耗时较长,需要独立计算进度。
暂停和继续
大任务运行通常比较耗时,因为一些意外情况造成的错误或中止,在处理后,我们希望可以仍然继续运行任务,而不是重新开始,这就像文件传输中的续传操作一样,但续传通常只支持上传和下载任务,如果大型文件夹的复制、移动、删除等操作也能像文件传输续传一样可以暂停和继续则在一些特定场景中可以大幅度提高工作效率。
受文件夹下载任务实现原理启发,我们同样可以在复制大文件夹时,先将文件夹节点的部分主要信息复制到中间缓存表中,并标明复制状态,这可能是一个耗时的过程,因此需要额外的任务状态表示,比如"正在加载"状态。然后再分批复制到目的位置,这需要先复制子文件夹节点,以保证结构完整性,并在每批次完成后更新复制状态,这样当任务暂停或异常中止时,下次可以根据复制状态继续运行任务。
需要额外说明的是,文件夹的移动、删除、还原其实现原理都是先将文件夹内容复制到目的位置,然后再对原文件夹执行彻底删除操作。比如,删除文件夹操作实际是先将文件夹复制到回收站,然后再彻底删除原文件夹。
互斥保护
除了复制任务以外,其他任务如移动和删除文件夹任务,如果在任务执行过程中变更源文件夹的内容可能会造成数据丢失的严重后果,以移动文件夹举例:如果在移动文件夹任务运行过程中,在源文件夹中上传了文件,则因为文件夹移动完成后会将其彻底删除,因此新上传的文件将直接丢失,造成严重后果。
为了避免这种情况,我们引入任务的互斥保护机制,当用户尝试修改文件时(包括编辑、重命名、上传、删除),会检查该文件是否在其他互斥的文件任务中,如果是,则给与任务冲突提示,并拒绝修改文件,直到任务运行完成。
取消
当任务在运行过程中被取消时,任务可能以及完成了一部分,这时取消后用户不想保留已完成的部分,则可能需要进行任务的清理操作,清理操作将已完成的部分,并删除任务的缓存状态信息。对于已完成的部分清理必须同步完成,不能有残留,而对于缓存状态信息,由于对用户不可见,可以后续空闲时清理。
最后
通过本方案的实施,可以对海量文件夹操作任务,主要是复制、移动、删除、还原等高耗时任务的执行过程状态可视化,提高用户体验。