文件任务中间件提案No.4
概要
由于悦库网盘中涉及文件上传、下载的业务越来越多,而不同的业务对于文件传输基础功能的依赖程度和使用方式不一样,比如:本地文件编辑功能要求在下载前判断是否锁定状态,并根据锁定状态决定下载后以只读还是读写方式打开。而下载文件功能则直接使用文件传输功能,下载完成后仅通知消息但不打开文件。文件同步下载功能则可能需要将多个文件合并为一个任务通知进度。这样文件业务和文件传输实现耦合度大大增加,造成业务逻辑混乱、业务扩展性差、开发低效问题。
我们期望这些上层业务都能够使用一致的底层文件传输接口,这样可以使文件传输逻辑的底层支撑更健壮,使上层业务逻辑忽略底层文件传输实现,使业务开发速度更快更稳健,基于文件传输的业务功能扩展性更强。
文件任务中间件是将文件业务和文件传输(传输/变更)解耦的组件,用于实现以文件任务模式支撑主要的文件相关业务,统一多端(WEB/PC/手机)、多平台(Windows/Mac/Linux/Android/IOS)实现机制。这样当业务层需要传输文件时,仅需要通过文件任务进行操作,忽略了传输底层的实现和状态,让业务层更关注于业务本身的实现而不是文件如何传输问题。
需要支撑的业务
不了解业务的设计师不是设计师,不了解用户的设计师也不会理解业务。
需要支持的业务功能包括:从系统资源管理器中分享文件、打开消息文件、拖拽和选择上传/下载文件、本地编辑、文件同步、任务操作、上传/下载审批、协同上传/下载任务、各种任务场景适配(本地编辑、消息文件)、Webhook。
-
在系统资源管理器中分享 是指从系统资源管理右键菜单中分享文件或文件夹,分享完成后通知我分享已完成。实现方法是先将文件上传到云端,然后将文件分享给指定的人。
-
打开消息文件 是指下载消息文件,然后使用本地程序打开。
-
拖拽和选择上传/下载文件 是最基础的文件上传下载操作,仅上传下载文件,没有任何其他附加操作。
-
本地编辑 是指先下载文件,下载完成后需判断文件是否被其他人锁定,如果被锁定则以只读本地打开,否则已读写方式本地打开,打开后监控文件修改,如果文件有修改则需自动上传,上传完成后通知我。
-
文件同步 分为上行同步和下行同步,上行同步开始的前提是本地已同步过。同步任务会包含多个文件。
-
上传审批 是指上传完成后,暂不进入仓库,其他人不可见。然后进入审批流程,审批流程完成后自动进入仓库,任务完成。如果审批失败则退回上传者,任务失败。
-
下载审批 是指下载任务创 建时,触发审批流程,审批流程完成后任务被允许执行,任务成功。如果审批失败,则任务被拒绝执行,任务失败。
-
协同上传 是指多人合作完成一个上传任务,这个上传任务中可以有一个或多个文件。例如协同上传任务要求每人至少修改一次,或每人必须按预先规定的文件名称格式上传一个文件。当所有人在预定的时间内完成操作后,任务成功,通知任务创建者。如果超时且操作没有完成则任务失败。
-
协同下载 是指多人合作完成一个查看/下载任务,这个下载任务中有一个或多个文件。例如协同下载任务要求每人至少查看/下载一次。当所有人在预定的时间内完成操作后,任务成功,通知任务创建者。如果超时且操作没有完成则任务失败。
-
Webhook 是指当文件上传前调用指定的Webhook接口并将文件数据传过去,接口返回处理后的文件数据,然后文件上传再继续下一步操作。Webhook的触发时机可能是:上传前、上传进度,上传完成后、下载前、下载进度、下载完成后。这样将允许用户自行截获文件数据并对其进一步处理,如: 加/解密、病毒扫描等。
任务的组成
文件任务中间件由任务基本信息、任务状态、任务处理器、任务控制、Webhook 、任务日志模块组成。
-
任务基本信息包括如任务ID、任务类型、任务参数等任务必须的基本信息。其中任务参数中包含任务的场景信息包括:本地编辑、消息文件、文件同步、手动下载等。
-
任务状态用于保存和通知任务的状态信息,如进度信息、当前执行阶段、任务状态处理程序。当任务的状态发生变更时,如果用户注册了状态处理程序则会调用匹配状态的任务处理程序。
例如,上传文件任务有如下阶段和状态:
阶段:'wait', 'loadLocalFileMeta', 'uploadFileMeta', 'uploadFileData', 'commitToStore'
状态:'wait', 'running', 'paused', 'error', 'done', 'cancelled'。
-
任务处理器是任务的核心执行模块,处理器可以是文件上传、文件下载、文件复制等。处理器在执行期间需要将状态信息记录的状态对象,状态对象负责执行通知和状态处理。处理器可在客户端实现和运行,如上传下载文件任务,也可能在服务端实现或运行,如复制移动文件任务。
-
任务控制 负责对任务进行暂停、继续、取消操作。
-
Webhook 在服务端根据任务的状态(上传前、上传完成、上传失败等)调用适当的Webhook API。
任务事件
任务事件基于云任务触发,当任务创建、开始、状态变化、完成时,云端会产生任务事件,业务模块可以根据自己的需求订阅具体类型的事件,这样容易实现更灵活的业务,这与文件事件驱动机制类似,只是事件发生的对象不同。
以在系统资源管理器中分享这个业务功能为例:业务模块创建上传任务,并订阅此任务的完成事件,这样当文件上传任务完成后,云端会发生完成事件,然 后业务模块可以在接收到完成事件后触发文件分享功能。
基于云任务的事件驱动机制在协同任务的业务实现是必须的,由于多人参与任务,每人都可能需要获取任务的事件状态,这样就可以从云端灵活的订阅自己感兴趣的任务事件。
最后
文件任务中间件的实现需要在客户端和服务端分别实施。服务端实现文件任务的云任务化,在云端永久保存任务信息和状态,并在适当时机发生任务事件,记录任务日志。客户端的文件任务是云端任务的本地运行时,并为前端提供功能支持,并不永久保存任务的信息和状态。