混合存储架构

(元数据索引 + 对象存储)

这是现代云原生应用中非常常见的设计模式,特别适合 处理大文件和多媒体内容

以获取航线文件为例子

航线文件是如何获取的?

  • 通过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等)

└── 注意:不存储实际航线数据内容

获取流程

  1. 客户端请求
  2. 通过 deptId + waylineId 查询数据库
  3. 获取 objectKey (格式:drone-patrol/航线kmz文件_xxx.kmz) objectKey+filename
  4. 使用 objectKey 从OSS生成预签名URL
  5. 重定向到OSS URL,客户端下文件
  6. 客户端解析文件获得实际航线数据

关键特点

  • 分离存储:数据库只存储文件元数据和OSS引用,实际文件内容存储在OSS
  • 间接访问:通过waylineId间接定位文件,不直接暴露OSS路径
  • 权限隔离:通过deptId实现部门级别的访问控制
  • 按需解析:文件内容只有在实际下载后才被解析获取航线数据
  1. 文件存储分离模式 (File Storage Separation Pattern)
  • 元数据存储在数据库
  • 实际文件内容存储在对象存储服务
  1. 引用存储模式 (Reference Storage Pattern)
  • 数据库只存储文件的引用/指针
  • 不存储实际文件内容
  1. 间接访问模式 (Indirect Access Pattern)
  • 通过逻辑ID(waylineId)间接访问物理存储
  • 不直接暴露物理存储路径

架构设计术语

  1. 混合存储架构 (Hybrid Storage Architecture)

结构化数据 → 关系数据库 (MySQL) 非结构化数据 → 对象存储 (OSS)

  1. 存储抽象层 (Storage Abstraction Layer)
  • 数据库作为存储的抽象层
  • OSS作为具体的存储实现层
  1. 元数据驱动设计 (Metadata-Driven Design)
  • 数据库存储元数据和索引信息
  • 外部存储承载实际数据内容

在分布式系统中的名称

  1. 内容寻址存储 (Content-Addressed Storage, CAS)
  • 类似概念:通过地址/键值定位内容
  1. 存储代理模式 (Storage Proxy Pattern)
  • 数据库作为存储的代理和索引
  1. 文件句柄模式 (File Handle Pattern)
  • objectKey类似文件句柄,指向实际存储位置

用一句话概括

数据库存储文件索引和元数据,OSS存储实际KMZ文件内容,通过waylineId查找objectKey,再通过objectKey从OSS获取文件URL供客户端下载解析。这种设计的优势是存储成本低、访问安全可控、支持大文件存储。

可以参考 (如何使用STS临时访问凭证访问OSS使用STS临时访问凭证去访问阿里云OSS。可以使客户端直连OSS上传文件,而不需通过 - 掘金)

相关推荐
小Ti客栈1 天前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
Ai拆代码的曹操1 天前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
IT_陈寒1 天前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端
颜酱1 天前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端
Wang's Blog1 天前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
Conan在掘金1 天前
鸿蒙报错速查:struct 里嵌 namespace 声明就炸,根因 + 真解法
后端
东方小月1 天前
从零开发一个 Coding Agent(三):EventStream 事件流通道设计与实现
前端·人工智能·后端
卫子miao1 天前
如何评价当前大语言模型的记忆机制?
后端·架构
神奇小汤圆1 天前
为什么 AQS 成为 Java 并发的基石?
后端
星栈1 天前
MCP 从 stdio 迁到 SSE,踩了 5 个传输层坑
人工智能·后端·架构