复合对象

创建

本页面介绍了复合对象,您可以通过现有对象来创建复合对象,而无需传输其他对象数据。复合对象可用于对现有对象执行附加操作,以及重新创建作为多个组成部分并行上传的对象。

组合操作

组合操作会将给定源对象序列中的数据串联起来,创建一个名为“复合对象”的新对象。 所有源对象都必须满足以下条件:

  • 具有相同的存储类别
  • 存储在同一个 Cloud Storage 存储分区中。

在执行复合操作时:

  • 源对象不会受影响。
  • 您可以使用 1 到 32 个源对象。
  • 源对象本身可以是复合对象。

通过复合生成的复合对象:

  • 与源对象具有相同的存储类别。
  • 如果源对象随后被替换或删除,则不会发生更改。

使用 gcloud storage 执行对象复合时,生成的对象的 Content-Type 设置为与第一个源的 Content-Type 匹配对象。

复合对象元数据

复合对象的元数据与其他对象的元数据之间有几点不同:

  • 复合对象没有 MD5 哈希值元数据字段。

  • 复合对象的 ETag 值并非基于 MD5 哈希值,客户端代码不应对复合对象 ETag 做任何假设,除了这些值会随着基础对象的更改而变化(请参阅面向 HTTP/1.1 的 IETF 规范)。

  • 每个复合对象都有一个“组件计数”元数据字段,用于计算复合对象中包含的非复合对象的数量。

    • 如果将一个复合对象重写到其他位置和/或重写为不同存储类别,则结果为一个组件计数为 1 的复合对象。

复合对象完整性检查

Cloud Storage 采用 CRC32C 对每个源对象执行完整性检查,不仅在上传时使用,还可让调用者在下载生成的复合对象时对其执行完整性检查。CRC32C 是一种错误检测代码,可根据各个组件的 CRC32C 值进行高效计算。您的应用在使用 CRC32C 时应遵循以下几点:

  • 上传源对象时,您应使用 CRC32C 库(如“哈希和 ETag”页面中列出的其中一个库)计算每个对象的 CRC32C 值,并将该值包含在请求。Cloud Storage 会根据您提供的值验证每次上传
  • 组合操作会自动检查源对象是否已正确组合,并忽略您在组合请求中提供的任何 CRC32C 值。生成的复合对象的 CRC32C 将在响应中返回。
  • 如果您的应用可能会在源对象的上传到组合这段时间内更改这些对象,则应为源对象指定有特定世代的名称,以避免出现争用情况。 或者,您可以从预期源对象的 CRC32C 值构建 CRC32C 值,并将其与组合操作返回的 CRC32C 值进行比较。
  • 下载时,您应计算所下载对象的 CRC32C 值,并将所得结果与响应中包含的值进行比较。

有限的附加和修改功能

您可以通过组合操作来执行有限的对象附加和修改操作。

附加操作的实现方式是,将数据上传至一个新的临时对象,对要执行附加操作的对象以及此临时对象进行组合,(可选)按照与原始对象相同的名称来命名组合操作的输出,然后删除此临时对象。

例如,在 gcloud CLI 中,将字符串 new data 附加到现有 Cloud Storage 对象的一系列命令如下:

$ echo 'new data' | gcloud storage cp - gs://bucket/temporary_object
$ gcloud storage objects compose gs://bucket/object_to_append gs://bucket/temporary_object \
    gs://bucket/object_to_append
$ gcloud storage rm gs://bucket/temporary_object

您还可以使用组合功能来为基本的对象修改操作提供支持。 例如,您可以从序列 {Y1, Y2, Y3} 组合对象 X,替换 Y2 的内容,并从这些相同组件重新组合 X。请注意,这要求不删除 Y1、Y2 和 Y3,因此您需要为这些组件和组合付费。

后续步骤