静态资源存储
图片、视频、文档等类似的数据是互联网应用非常基本的组成元素,这些数据都是典 型的非结构化数据,不便在关系型数据库中存放。由于这些数据往往都是在运行时不变的, 不是由应用程序生成的,也不需要被修改,可以无差别地投递给所有的用户终端,因此又 称之为静态资源。本节将如何介绍对这类数据进行存储及管理。
与应用程序一起打包
如果静态资源的量不大,比如可能就是简单页面中的几张图片,在这种场景下,一般 说来应用程序打包的时候,直接打包到应用程序的发布包中。比如对于 Java Web 应用,可 以直接将 Web 网站中用到的图片,一起打包到 WAR 包中。当用户请求的时候,由应用服 务器下发即可。这种方式部署简单,但是大量的静态资源的请求,会拖累到应用服务器的 性能。因此,仅仅在资源访问比较少,业务比较简单的时候,可以使用这样的方式。
独立的静态资源存储
为了不拖累应用服务器的性能,当资源不太多的时候,我们可以将资源存储到本地服 务器,然后使用 Nginx 搭建一个静态托管。如下所示的一个 Nginx 配置,可以完成相应静 态资源文件的下发。
如果此类静态资源非常多,由于本地服务器无论是存储容量还是存储可靠性方面的限 制,传统的 IT 公司往往会使用 NAS(Network Attached Storage)或者 SAN(Storage Area Network)这样的传统存储方案来解决大规模的图片、视频存储问题。在规模较小的情况下, 购买普通 NAS 设备成本往往相对比较低,大概需要几千元人民币;但是规模大到上百 TB 或者 PB 级别就需要采购几十万甚至百万级别的集群 NAS 或者 SAN。
云环境下的静态资源存储
云计算存储服务的推出,特别是对象存储服务的推出,大大方便了图片、视频等静态 资源数据的存储、处理和访问。
国内外绝大部分云计算服务厂商都提供对象存储服务,比如 AWS S3、网易 NOS、阿 里 OSS 等,国内厂商除了提供了海量、高可用、高可靠的云存储基础服务外,还会提供丰富的图片、多媒体在线处理服务,所有服务由平台无关的 HTTP RESTful API 接口提供。一 站式解决互联网时代图片、视频、文档等非结构化数据管理难题,助力产品实现最佳用户 体验。使用云服务提供商提供的对象存储服务相比传统的 NAS 或者 SAN 方案有无可比拟 的优势。
按需服务:对象存储服务平台提供海量的存储空间和横向的扩张能力,时刻满足 用户不断增长的存储空间和访问需求,再也不用一次性购买昂贵的存储设备,不 用考虑下次扩容该购买多少设备等烦琐的事情。
便捷服务:传统的 NAS 设备一般通过本地文件系统 POSIX API 的方式提供访问, 要构架对外的存储和数据访问能力,用户还要搭建一整套上传下载的程序才能够 对外提供服务。对象存储系统提供全方位的 SDK,方便开发者使用各种语言进行 快速接入。并且使用 HTTP RESTful API 接口对外提供访问操作存储资源的能力, 使得外部用户只要有网络,就可以直接通过对象存储服务访问图片、视频等资源。 直接把大流量的访问旁路到对象存储服务,再也不用担心对外的带宽不够用或者 被大流量的 DDoS 攻击。
安全稳定:数据多重备份,用户文件多重备份保障,任何一台服务器或硬盘有故 障时,将立即进行数据恢复,确保数据安全毫无隐患。通过完善的权限控制体系、 身份验证机制确保数据安全,杜绝未授权访问。支持 HTTPS 方式上传和下载文件, 确保数据传输安全可靠。
增值服务:针对图片、视频等资源,我们往往需要对外提供丰富的处理服务。构 建这些服务需要使用很多的图片处理音视频处理软件,比如 ImageMagick、 FFmpeg 等,玩转这些开源组件并对外提供稳定可靠的服务体系不是一件容易的 事情。网易对象存储服务 NOS 提供了非常完善的图片处理,支持图片的缩略、裁 剪、图文水印、旋转、质量参数、模糊化、类型转换、渐进显示等功能。同时也 支持丰富的音视频处理,支持音视频的元数据获取、音频转码、视频定位拖拽、 视频帧截图、截图去黑边、黑帧智能判断等功能。
总而言之,非结构化的静态资源存储服务的选型与具体的业务类型关系紧密。如果是对象存储密集型的,比如视频或者文档分享这样的应用,或者电商这种需要存储大量商品图片 的应用,推荐使用专业的云对象存储服务。对于静态资源不会很多,而且相对固定的应用, 可以考虑自己通过 Nginx 搭建一个静态资源托管服务,甚至直接与应用程序一起打包。
文章节选自《云原生应用架构实践》 网易云基础服务架构团队 著
参考文档:https://sq.163yun.com/blog/article/220969820445536256