为了能到远方,脚下的每一步都不能少.|

奕帆卷卷

园龄:1年4个月粉丝:3关注:0

文件上传功能模块——对象存储

对象存储功能

在文件上传业务中,我们通常把这个功能将他拆分成对象存储微服务。这样前端发起请求,网关就会把请求路由到对应的对象存储微服务,这样就不需要再保险业务开发上传功能。

业务流程

在文件上传业务首先需要在oss平台获取AccessKey获取一个账号,然后对接手册调用对应API。在文件上传中根据文件大小主要分为简单上传和分片上传,简单上传就是直接将文件一次性传上去,分片上传就是按照前端切分的分片文件一个一个上传到oss上,然后将每个切片json记录分片信息返回给前端进行收集,然后收集完成之后返回给后端,请求服务合并文件。

注意问题

1.文件大的情况下,长时间占用带宽问题

OSS文件上传方式有很多,简单上传,分片上传,追加上传,断点续传上传等,在业务中,我们采用简单上传小文件,分片上传大文件。

  • 简单上传

前端发送请求数据和参数到网关断言路由到对象存储微服务,然后微服务发送文件数据到对象存储,返回一个文件存储信息,传输完毕后,微服务将文件记录存到数据库中,同时向前端返回文件记录

  • 分片文件

分片文件上传方式,主要有三步初始化,分片上传,最后合并文件。首先前端向后端发起初始化请求,网关路由到对象存储微服务,微服务向对象存储通知,对象存储会返回上传文件的标识,服务会将文件记录存储到数据库中,然后将文件标识放到文件记录对象返回给前端通知已经完成初始化。

前端将文件分片进行上传文件数据,每次都会带着上传标识,微服务将分片的文件上传到对象存储中,然后对象存储返回一个分片信息,将记录分片信息的json字符串返回给前端,并将分片记录到数据库中。

前端收集分片上传中后端返回的分片信息json数组,然后将其放到参数里请求后端合并分片,在对象存储微服务中通知对象存储合并分片,对象存储会返回一个是否合并成功,合并成功则删除数据库的文件分片记录。

2.由于各种原因没有提交业务,导致业务没有绑定数据库文件信息,如何处理垃圾文件?

处理垃圾文件主要有两种方案。

  • 定时清理:使用XXL-JOB组件定时轮询数据库信息,如果发现文件的创建时间是10分钟前,并且没有绑定业务id,则认为是垃圾文件进行删除
  • 延迟删除:主要使用rabbitMQ实现,文件上传后,发送延迟队列到rabbitmq中,10分钟后消费消息,检测此文件是否关联业务id,为空则认为是垃圾文件

3.如何排查OSS文件上传失败的问题?

  1. 检查本地和OSS网络是否正常,可以使用ping命令测试与OSS网络连通性。
  2. 检查上传文件的大小是否超过限制。在oss控制台中,简单上传,表单上传,追加上传等方式上传文件,文件的大小不能超过5GB。分片上传的方式上传的单个文件,大小不能超过48.8T
  3. 检查当前上传文件的账户是否有上传文件的权限
  4. 也可以检查OSS配置文件是否正确,地址等是否错误

4.分片上传失败的解决方式(断点上传)?

在上传大文件到文件存储的过程中,可能因为网络问题,程序异常退出等问题导致上传部分失败,甚至重复多次依旧无法完成上传,这个时候就需要断点续传的方式,某一分片上传失败,再次上传时就会从返回的文件记录的断点继续上传,无需重新上传所有文件。

5.访问OSS出现网络异常怎么解决?

网络异常问题可能是所处的网络环境在运营商网络边缘节点,多数网络异常是因为客户端网络不稳定导致的。

解决方案:

  • 开启CDN加速,利用CDN边缘加速节点,减少手机或PC网络对运营商网络的依赖
  • 采用分片断点上传,每个分片大小可以设置不超过1MB
  • 增大超时时间,并开启失败重传机制

6.秒传是什么?

在上传文件时,服务器会先做MD5校验,如果服务器上有,说明已经上传过了,就会直接给你一个新的地址,其实是指向原来已经上传的文件。

7.业务为什么要反向关联对应的文件记录

因为同一个业务可能对应多张图片,如果放在主业务表中,在表设计中无法确定字段多少个,所以我们将业务id和业务类型存到对应的附件表中,这样在查询业务时,可以通过业务id和业务类型,查询到文件记录。

本文作者:奕帆卷卷

本文链接:https://www.cnblogs.com/yifan0820/p/18067022

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   奕帆卷卷  阅读(349)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起