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 集合。
2.2 Bucket(存储桶)领域模型
Bucket 是对象存储中最顶层的逻辑容器,相当于文件系统中的“根目录”或“驱动器”。它定义了对象的命名空间、访问策略和存储配置。
| 属性/行为 | 定义 | 领域约束 |
|---|---|---|
| Bucket Name | 全局唯一的字符串标识,通常由用户指定 | 长度 3-63 字符,仅含小写字母、数字、连字符 |
| Region | Bucket 所在的地理区域或可用区 | 创建后不可变更 |
| ACL / Policy | 访问控制列表或 IAM 策略 | 支持公共读、私有、条件访问 |
| Versioning | 是否启用对象版本控制 | 启用后不可关闭,可暂停 |
| Lifecycle Rules | 自动迁移或过期删除策略 | 按时间或前缀匹配 |
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 操作) |
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 四要素协作流程:对象上传场景
通过一个完整的对象上传流程,可以直观理解四个核心概念如何协作:
2.7 领域模型总结
四个核心概念的领域模型定义可以归纳为以下要点:
- Bucket 是聚合根,负责对象的组织、隔离和策略管理,具有全局唯一的名称和不可变的区域属性。
- Object 是实体,包含不可变的数据内容和可变的元数据,通过版本控制支持更新操作。
- Metadata 是值对象,分为系统级和用户级,系统级元数据保证数据可管理性,用户级元数据提供业务扩展能力。
- Object ID 是实体的标识符,由 Bucket Name 和 Key 组合而成,在 Bucket 内唯一且不可变。