- 上传完成后,文件服务器返回原始文件地址以及token 。业务系统在redis针对此token创建监听
- 文件服务器在转换完成后创建转换事件,转换事件监听对象监听到此事件后,向redis发送通知
- 业务系统接收到通知,更新URL
对于配置模块来说,配置可以分为两种:
- 文件服务自身需要的配置信息 。例如:上传文件目录 。这属于「静态配置」
- 各个调用系统需要的各自的配置 。例如:某些系统需要切100*100的图,而有些系统需要切200*200的图 。这属于「动态配置」
整体结构如下:
文章插图
流程调整基于上面的设计,流程需要进行相应的调整 。
- 上传流程
文章插图
【架构设计:文件服务的设计与实现】下载流程不变,多了一个获取转换后文件链接的流程:
文章插图
模块调整相应的模块也有调整,新增了一个消息模块,用于处理消息的发送与监听 。这个消息属于领域事件,所以也放在领域层 。
文章插图
架构验证业务流程验证上传流程:
- 客户端上传文件
- 通过「安全模块」验证 。如果验证失败,返回验证失败信息
- 如果验证成功,通过「上传模块」上传文件
- 「上传模块」构建「上传事件」,添加到消息总线中
- 上传完成,返回用户消息 。消息包含原始文件URL,如果需要转换的话,则包含转换对应的token
- 「转换模块」监听到「上传事件」,根据「配置模块」的配置,进行转换
- 「转换模块」构建转换消息,添加到消息总线中
- 对应「监听模块」监听到转换消息,进行后续处理 。例如信息入库或通知业务系统
- 客户端下载文件
- 通过「安全模块」验证 。如果验证失败,返回验证失败信息
- 如果验证成功,通过「下载模块」下载文件
- 客户端携带token获取真实链接
- 「下载模块」根据token查询文件是否转换成功
- 如果转换成功,则返回转换后的URL
- 否则返回未转换成功状态码
- 安全性:由「安全模块」保障
- 伸缩性:对于下载来说,可通过CDN处理 。对于上传来说,文件服务本身没有状态,可方便扩容
- 可用性:支持多点部署,常用故障转移手段都可使用
- 可配置性:由「配置模块」保障
- 扩展性:基于事件的处理方式,通过添加事件响应对象来进行功能扩展
- 新增存储逻辑,用于保存文件地址与文件hash的关系
- 新增一个检查文件hash的接口,如果hash已存在,返回文件URL,否则返回false
- 添加一个UploadEvent同步监听事件,当文件上传成功后,对文件取hash,将数据保存到上面创建的表中
技术选型
- 公司核心技术语言为JAVA,故优先选择使用Java语言开发
- 框架基于SpringBoot,基于如下考虑:
- SpringBoot是目前JavaEE开发事实上的标准框架
- 可独立部署,亦可以升级到基于SpringCloud的微服务,方便向微服务架构迁移
- 配置信息决定不使用数据库,而使用属性文件配置,基于如下考量:
- 静态配置配置后基本不需要修改
- 动态配置修改几率也不大,如果需要调整,SpringBoot本身支持实时刷新配置
- 微服务部署,可结合分布式配置服务器实现动态配置
- 不需要部署数据库,不需要设计表结构,节省部署与设计时间 。但是考虑到扩展性,配置逻辑需要抽象,以支持其他持久化方式
- 转换结果信息使用文件形式存储,基于如下考量:
推荐阅读
- 如何设计一个高并发系统?
- 大白话告诉你Hadoop架构原理
- 华为手机这些英文文件夹到底是啥?为什么我删完瞬间多出10个G
- 从微信小程序开发者工具源码看小程序架构设计实现原理
- 怎么把电脑文件无线批量传输到iphone,不压缩不用插线,很方便
- 普通家庭装修中走廊如何设计
- 电子杂志制作工具 电子杂志设计
- 如何一步步构建大型网站架构
- 架构图解:支付宝钱包系统架构内部剖析
- 数据库软件架构,到底要设计些什么?