对象存储功能
在文件上传业务中,我们通常把这个功能将他拆分成对象存储微服务。这样前端发起请求,网关就会把请求路由到对应的对象存储微服务,这样就不需要再保险业务开发上传功能。
业务流程
前端的请求通过网关路由到对象存储微服务中,对象存储将提供的文件上传到阿里云中,并返回文件记录对象,和保存的主业务建立关联,完成业务,大体流程是这样的,在这其中还有很多问题产生。
注意问题
1.文件大的情况下,长时间占用带宽问题
OSS文件上传方式有很多,简单上传,分片上传,追加上传,断点续传上传等,在业务中,我们采用简单上传小文件,分片上传大文件。
- 简单上传
前端发送请求数据和参数到网关断言路由到对象存储微服务,然后微服务发送文件数据到对象存储,返回一个文件存储信息,传输完毕后,微服务将文件记录存到数据库中,同时向前端返回文件记录
- 分片文件
分片文件上传方式,主要有三步初始化,分片上传,最后合并文件。首先前端向后端发起初始化请求,网关路由到对象存储微服务,微服务向对象存储通知,对象存储会返回上传文件的标识,服务会将文件记录存储到数据库中,然后将文件标识放到文件记录对象返回给前端通知已经完成初始化。
前端将文件分片进行上传文件数据,每次都会带着上传标识,微服务将分片的文件上传到对象存储中,然后对象存储返回一个分片信息,将记录分片信息的json字符串返回给前端,并将分片记录到数据库中。
前端收集分片上传中后端返回的分片信息json数组,然后将其放到参数里请求后端合并分片,在对象存储微服务中通知对象存储合并分片,对象存储会返回一个是否合并成功,合并成功则删除数据库的文件分片记录。
2.由于各种原因没有提交业务,导致业务没有绑定数据库文件信息,如何处理垃圾文件?
处理垃圾文件主要有两种方案。
- 定时清理:使用XXL-JOB组件定时轮询数据库信息,如果发现文件的创建时间是10分钟前,并且没有绑定业务id,则认为是垃圾文件进行删除
- 延迟删除:主要使用rabbitMQ实现,文件上传后,发送延迟队列到rabbitmq中,10分钟后消费消息,检测此文件是否关联业务id,为空则认为是垃圾文件
3.如何排查OSS文件上传失败的问题?
- 检查本地和OSS网络是否正常,可以使用ping命令测试与OSS网络连通性。
- 检查上传文件的大小是否超过限制。在oss控制台中,简单上传,表单上传,追加上传等方式上传文件,文件的大小不能超过5GB。分片上传的方式上传的单个文件,大小不能超过48.8T
- 检查当前上传文件的账户是否有上传文件的权限
- 也可以检查OSS配置文件是否正确,地址等是否错误
4.分片上传失败的解决方式?
在上传大文件到文件存储的过程中,可能因为网络问题,程序异常退出等问题导致上传部分失败,甚至重复多次依旧无法完成上传,这个时候就需要断点续传的方式,某一分片上传失败,再次上传时就会从返回的文件记录的断点继续上传,无需重新上传所有分片。
5.访问OSS出现网络异常怎么解决?
网络异常问题可能是所处的网络环境在运营商网络边缘节点,多数网络异常是因为客户端网络不稳定导致的。
解决方案:
- 开启CDN加速,利用CDN边缘加速节点,减少手机或PC网络对运营商网络的依赖
- 采用分片断点上传,每个分片大小可以设置不超过1MB
- 增大超时时间,并开启失败重传机制