混合存储架构

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

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

以获取航线文件为例子

航线文件是如何获取的?

  • 通过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上传文件,而不需通过 - 掘金)

相关推荐
汤姆yu18 分钟前
基于springboot的民间救援队救助系统
java·spring boot·后端·救援队
IT_陈寒31 分钟前
React性能优化实战:这5个Hooks技巧让我的应用快了40%
前端·人工智能·后端
韩立学长1 小时前
基于Springboot的智慧管网灌溉系统i1agupa7(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
一 乐1 小时前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·教务管理
August_._1 小时前
【MySQL】触发器、日志、锁机制 深度解析
java·大数据·数据库·人工智能·后端·mysql·青少年编程
BingoGo2 小时前
15 个 Eloquent 高级技巧,瞬间提升你的 Laravel 应用性能
后端·php
golang学习记2 小时前
用 Go + Redis + HTMX 手撸一个超快 URL 短链接服务 🚀
后端
codervibe2 小时前
Spring Boot 热启动配置实战:从手动重启到秒级反馈
spring boot·后端
skyeeeeee2 小时前
kubeadm安装k8s集群
后端·kubernetes
chxii3 小时前
Spring Boot 响应给客户端的常见返回类型
java·spring boot·后端