2. 核心概念建模:Bucket、Object、Metadata、Object ID 的领域模型定义

对象存储的领域模型围绕四个核心概念展开:Bucket(存储桶)、Object(对象)、Metadata(元数据) 和 Object ID(对象标识符)。这四个概念构成了对象存储系统的数据平面骨架,决定了数据如何组织、寻址、描述和访问。本节将从领域驱动设计(DDD)的角度,对每个概念进行精确的模型定义,并揭示它们之间的静态关系与协作模式。

2.1 领域模型总览:四要素关系图

在深入每个概念之前,先通过一张领域模型关系图建立整体认知。下图展示了 Bucket、Object、Metadata 和 Object ID 之间的核心关联:Bucket 作为命名空间容器,持有多个 Object;每个 Object 拥有唯一的 Object ID 和独立的 Metadata 集合。

对象存储核心概念领域模型关系图 Bucket 存储桶 命名空间容器 Object 对象 数据 + 元数据 Object ID 对象标识符 全局唯一键 Metadata 元数据 描述性属性 关系说明 实线:强关联 虚线:可选关联
领域建模视角:在 DDD 中,Bucket 是一个聚合根(Aggregate Root),Object 是其下的实体(Entity),Metadata 是值对象(Value Object),Object ID 是实体的标识符(Identity)。这种分层保证了数据一致性和边界清晰。

2.2 Bucket(存储桶)领域模型

Bucket 是对象存储中最顶层的逻辑容器,相当于文件系统中的“根目录”或“驱动器”。它定义了对象的命名空间、访问策略和存储配置。

属性/行为 定义 领域约束
Bucket Name 全局唯一的字符串标识,通常由用户指定 长度 3-63 字符,仅含小写字母、数字、连字符
Region Bucket 所在的地理区域或可用区 创建后不可变更
ACL / Policy 访问控制列表或 IAM 策略 支持公共读、私有、条件访问
Versioning 是否启用对象版本控制 启用后不可关闭,可暂停
Lifecycle Rules 自动迁移或过期删除策略 按时间或前缀匹配
关键设计决策:Bucket 的扁平命名空间设计(非树形目录)是对象存储区别于文件系统的本质特征。所有 Object 都在 Bucket 下平铺,通过 Object ID 的前缀模拟“目录”效果,但实际不存在目录实体。

2.3 Object(对象)领域模型

Object 是对象存储中存储数据的基本单元,由数据内容(Data Payload)和元数据(Metadata)两部分组成。与文件系统的 inode 不同,Object 是不可变的——每次更新都会生成一个新版本。

// Object 领域模型(伪代码)
class Object {
    // 标识符
    objectId: ObjectId;          // 全局唯一
    bucketName: BucketName;      // 所属 Bucket
    
    // 数据
    data: ByteStream;            // 实际数据内容
    size: uint64;                // 数据大小(字节)
    
    // 元数据
    systemMetadata: SystemMetadata;   // 系统级元数据
    userMetadata: Map<string, string>; // 用户自定义元数据
    
    // 版本控制
    versionId: string;           // 版本标识
    isLatest: boolean;           // 是否为最新版本
    
    // 行为
    getData(): ByteStream;
    getMetadata(key: string): string;
    setUserMetadata(key: string, value: string): void;
}

2.4 Metadata(元数据)领域模型

Metadata 是描述 Object 属性的键值对集合,分为系统元数据和用户自定义元数据两类。系统元数据由存储系统自动维护,用户元数据由用户在上传时指定。

元数据类型 示例键 说明 可变性
系统元数据 Content-Type MIME 类型,如 image/png 不可变(上传时指定)
Content-Length 对象大小(字节) 系统自动计算
ETag 数据内容的 MD5 或 SHA256 哈希 系统自动生成
Last-Modified 最后修改时间戳 系统自动更新
Storage-Class 存储等级(标准、低频、归档) 可通过 Lifecycle 变更
用户元数据 x-amz-meta-* 用户自定义键值对,如 x-amz-meta-author 可变(通过 Copy 操作)
元数据规模约束:用户自定义元数据通常限制在 2KB 以内(AWS S3 为 2KB,含键名和值)。超出此限制的元数据应存储在外部数据库或作为单独对象存储,通过 Object ID 关联。

2.5 Object ID(对象标识符)领域模型

Object ID 是对象在存储系统中的全局唯一标识符,由 Bucket Name + Key 组合而成。Key 是用户在 Bucket 内指定的字符串,可以包含斜杠(/)来模拟路径层次,但系统不将其解析为目录结构。

// Object ID 组成结构
Object ID = Bucket Name + "/" + Key

// 示例
"my-photos" + "/" + "2024/event/photo001.jpg"
// 完整 Object ID: my-photos/2024/event/photo001.jpg

// 版本化场景下的 Object ID(含版本 ID)
Object ID with Version = Bucket Name + "/" + Key + "?versionId=" + VersionId

Object ID 的设计遵循以下领域规则:

  • 全局唯一性:在同一 Bucket 内,Key 必须唯一;不同 Bucket 间 Key 可以重复。
  • 不可变性:Object 创建后,其 Object ID 不可更改。如需重命名,只能通过 Copy + Delete 操作实现。
  • 前缀索引:系统通常按 Key 的字典序建立索引,支持前缀查询(如列出 2024/ 开头的所有对象)。
  • 版本化扩展:启用版本控制后,Object ID 需要附加 Version ID 才能唯一定位一个对象版本。

2.6 四要素协作流程:对象上传场景

通过一个完整的对象上传流程,可以直观理解四个核心概念如何协作:

对象上传流程中的四要素协作 1. 选择 Bucket 指定命名空间 2. 生成 Object ID Bucket + Key 组合 3. 附加 Metadata 系统 + 用户元数据 4. 存储 Object 数据 + 元数据持久化 上传流程中的领域概念协作 • Bucket 提供命名空间和访问策略上下文 • Object ID 在 Bucket 内唯一标识对象,支持版本化扩展 • Metadata 在对象创建时绑定,系统元数据自动生成,用户元数据由客户端传入 • Object 的数据和元数据通常分开存储(数据在存储节点,元数据在索引节点)
架构启示:在分布式实现中,Metadata 和 Object 数据通常分离存储。Metadata 存储在元数据服务(MDS)中,支持快速查询;Object 数据存储在数据节点(Datanode)中,支持高吞吐读写。这种分离架构是对象存储高性能的关键。

2.7 领域模型总结

四个核心概念的领域模型定义可以归纳为以下要点:

  • Bucket 是聚合根,负责对象的组织、隔离和策略管理,具有全局唯一的名称和不可变的区域属性。
  • Object 是实体,包含不可变的数据内容和可变的元数据,通过版本控制支持更新操作。
  • Metadata 是值对象,分为系统级和用户级,系统级元数据保证数据可管理性,用户级元数据提供业务扩展能力。
  • Object ID 是实体的标识符,由 Bucket Name 和 Key 组合而成,在 Bucket 内唯一且不可变。