架构设计:文件服务的设计与实现( 二 )


  • 上传完成后,文件服务器返回原始文件地址以及token 。业务系统在redis针对此token创建监听
  • 文件服务器在转换完成后创建转换事件,转换事件监听对象监听到此事件后,向redis发送通知
  • 业务系统接收到通知,更新URL
另外对于下载来说,实际直接通过Nginx这样的web服务器就可以了,所以下载模块可以直接独立 。
对于配置模块来说,配置可以分为两种:
  • 文件服务自身需要的配置信息 。例如:上传文件目录 。这属于「静态配置」
  • 各个调用系统需要的各自的配置 。例如:某些系统需要切100*100的图,而有些系统需要切200*200的图 。这属于「动态配置」
「静态配置」可以使用属性文件进行配置即可 。「动态配置」需要根据不同的系统进行相应的配置,故针对图片和视频等资源配置,创建对应的配置类,根据参数通过Respository动态构建 。
整体结构如下:
架构设计:文件服务的设计与实现

文章插图
 
流程调整基于上面的设计,流程需要进行相应的调整 。
  • 上传流程

架构设计:文件服务的设计与实现

文章插图
 
【架构设计:文件服务的设计与实现】下载流程不变,多了一个获取转换后文件链接的流程:
架构设计:文件服务的设计与实现

文章插图
 
模块调整相应的模块也有调整,新增了一个消息模块,用于处理消息的发送与监听 。这个消息属于领域事件,所以也放在领域层 。
架构设计:文件服务的设计与实现

文章插图
 
架构验证业务流程验证上传流程:
  • 客户端上传文件
  • 通过「安全模块」验证 。如果验证失败,返回验证失败信息
  • 如果验证成功,通过「上传模块」上传文件
  • 「上传模块」构建「上传事件」,添加到消息总线中
  • 上传完成,返回用户消息 。消息包含原始文件URL,如果需要转换的话,则包含转换对应的token
  • 「转换模块」监听到「上传事件」,根据「配置模块」的配置,进行转换
  • 「转换模块」构建转换消息,添加到消息总线中
  • 对应「监听模块」监听到转换消息,进行后续处理 。例如信息入库或通知业务系统
下载流程:
  • 客户端下载文件
  • 通过「安全模块」验证 。如果验证失败,返回验证失败信息
  • 如果验证成功,通过「下载模块」下载文件
获取真实链接流程:
  • 客户端携带token获取真实链接
  • 「下载模块」根据token查询文件是否转换成功
  • 如果转换成功,则返回转换后的URL
  • 否则返回未转换成功状态码
非功能性约束验证
  • 安全性:由「安全模块」保障
  • 伸缩性:对于下载来说,可通过CDN处理 。对于上传来说,文件服务本身没有状态,可方便扩容
  • 可用性:支持多点部署,常用故障转移手段都可使用
  • 可配置性:由「配置模块」保障
  • 扩展性:基于事件的处理方式,通过添加事件响应对象来进行功能扩展
例如,现在要新增一个「秒传功能」,即对于服务器已经存在的文件,不再进行上传操作,直接返回文件URL!那么需要做如下扩展:
  • 新增存储逻辑,用于保存文件地址与文件hash的关系
  • 新增一个检查文件hash的接口,如果hash已存在,返回文件URL,否则返回false
  • 添加一个UploadEvent同步监听事件,当文件上传成功后,对文件取hash,将数据保存到上面创建的表中
上面的修改不需要对现有流程做任何改动 。
技术选型