(元数据索引 + 对象存储)
这是现代云原生应用中非常常见的设计模式,特别适合 处理大文件和多媒体内容 。
以获取航线文件为例子
航线文件是如何获取的?
- 通过waylineId安全访问
-
- 部门权限隔离
- OSS预签名URL
- 重定向下载
- 数据库统一管理
首先数据库中存的有对应的oss前缀+filename,可以通过这个在OSS中找到对应的内容返回URL。数据库表中存了waylineId,客户端通过deptId+waylineId定位到对应的数据表信息,但实际数据库中并没有存真实的数据。只有通过ObjectKey到OSS获取URL,才能解析这个URL里边的kmz文件获取到航线文件信息。
航线文件获取流程
数据存储架构
数据库表 wayline_file :
主要字段
├── waylineId (航线ID,唯一标识)
├── deptId (部门ID,权限隔离)
├── objectKey (OSS对象键:前缀+filename)
├── 元数据 (name, droneModelKey, payloadModelKeys等)
└── 注意:不存储实际航线数据内容
获取流程
- 客户端请求
↓ - 通过 deptId + waylineId 查询数据库
↓ - 获取 objectKey (格式:drone-patrol/航线kmz文件_xxx.kmz) objectKey+filename
↓ - 使用 objectKey 从OSS生成预签名URL
↓ - 重定向到OSS URL,客户端下文件
↓ - 客户端解析文件获得实际航线数据
关键特点
- 分离存储:数据库只存储文件元数据和OSS引用,实际文件内容存储在OSS
- 间接访问:通过waylineId间接定位文件,不直接暴露OSS路径
- 权限隔离:通过deptId实现部门级别的访问控制
- 按需解析:文件内容只有在实际下载后才被解析获取航线数据
- 文件存储分离模式 (File Storage Separation Pattern)
- 元数据存储在数据库
- 实际文件内容存储在对象存储服务
- 引用存储模式 (Reference Storage Pattern)
- 数据库只存储文件的引用/指针
- 不存储实际文件内容
- 间接访问模式 (Indirect Access Pattern)
- 通过逻辑ID(waylineId)间接访问物理存储
- 不直接暴露物理存储路径
架构设计术语
- 混合存储架构 (Hybrid Storage Architecture)
结构化数据 → 关系数据库 (MySQL) 非结构化数据 → 对象存储 (OSS)
- 存储抽象层 (Storage Abstraction Layer)
- 数据库作为存储的抽象层
- OSS作为具体的存储实现层
- 元数据驱动设计 (Metadata-Driven Design)
- 数据库存储元数据和索引信息
- 外部存储承载实际数据内容
在分布式系统中的名称
- 内容寻址存储 (Content-Addressed Storage, CAS)
- 类似概念:通过地址/键值定位内容
- 存储代理模式 (Storage Proxy Pattern)
- 数据库作为存储的代理和索引
- 文件句柄模式 (File Handle Pattern)
- objectKey类似文件句柄,指向实际存储位置
用一句话概括
数据库存储文件索引和元数据,OSS存储实际KMZ文件内容,通过waylineId查找objectKey,再通过objectKey从OSS获取文件URL供客户端下载解析。这种设计的优势是存储成本低、访问安全可控、支持大文件存储。
可以参考[:] (如何使用STS临时访问凭证访问OSS使用STS临时访问凭证去访问阿里云OSS。可以使客户端直连OSS上传文件,而不需通过 - 掘金)