对象存储服务(Object Storage Service, 简称OSS),各大云厂商都有提供,阿里云OSS,腾讯云COS(Cloud Object Storage),七牛云等。
很多服务都有文件存储下载,或者图片访问等需求。根据所需要的文件数量和使用频率,常见的有以下几种方式用于文件存储:
一、后台服务直接处理
以Java为例
1 | // 上传 |
这种方式很简单,定义好一个目录,用于上传存储,然后返回一个地址给前端使用就行。
优点:简单方便,适合使用量不大的情况
缺点:
- 和主服务混合在一起,如果某些文件太大,或者访问频繁,会拉低可用带宽,造成qps和tps的下降
- 如果是多个服务,每个服务都写一遍上传下载的接口,文件管理会比较难以维护,迁移等。而只由一个服务处理,又会导致一旦该服务出现问题,其他人都不能访问的情况。
建议:有多个服务的情况下,可以考虑单独拆分出一个文件上传的服务,下载由nginx处理(nginx文件服务器的形式, 但要注意访问权限,只可访问具体文件,不可访问目录),该方式可提高性能,哪怕服务挂了,nginx还能提供继续访问已上传文件的能力。而对于某些需要权限访问控制的(只能上传者或登录用户访问等)文件,那还是得后台服务处理下载。
二、云厂商的存储
以阿里云为例,以下是官网介绍
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。
优点:
- 有各种语言的SDK包、API、调试工具,可快速接入开发
- 海量文件处理,无需运维,不需要担心容量,带宽等问题
- 运行稳定,高可用
缺点:得花钱(呃,哪有免费的午餐),当然,整体上相比自己搭建管理,还是很有性价比的。
主要坑点还在于它的收费项分类过多,官网上列出密密麻麻的选项,以下列出几个常见的:
- 预付费,后付费,
- 按地域、存储、流量、请求等分类
三、自建对象存储服务 - MinIO
MinIO 是一个高性能的对象存储原生支持 Kubernetes 部署的解决方案。 MinIO 提供了一个 Amazon Web Services S3 兼容 API 并支持所有核心 S3 功能。
优点:
- 因为对标的Amazon S3厂商,所以也有各种语言的SDK包、API、调试工具,可快速接入开发
- 个别甲方可能对数据保密性比较高,不能使用云厂商的服务,MinIO有云厂商的功能,方便自己实现大容量分布式存储
缺点:需要自己维护存储,带宽等使用
这是个Go编写的开源项目,完全兼容Amazon S3云存储服务(毕竟是国外的,不兼容国内云存储)。Go写的服务一般相比Java内存占用小很多了,而且MinIO支持单机,也支持分布式部署。哪怕使用量不多,也完全可以代替上面第一种自己写上传和下载的服务的方案,Docker部署内存占用只有70MB不到。而且为了后续扩容考虑,个人比较推荐使用MinIO作为自建存储的