Objetos compuestos y cargas paralelas

Para ser compatible con las cargas paralelas y la funcionalidad limitada de agregar y editar, Cloud Storage permite a los usuarios componer a partir de hasta 32 objetos existentes un objeto nuevo sin transferir datos de objetos adicionales.

Operación de composición

La operación de composición crea un objeto nuevo, cuyos contenidos son la concatenación de una secuencia dada de hasta 32 objetos de origen. Los objetos de origen deben ser todos de la misma clase de almacenamiento y deben estar todos en el mismo depósito. Los objetos de origen pueden ser objetos compuestos.

Los objetos de origen no se ven afectados por el proceso de composición y el objeto compuesto resultante no cambia si los objetos de origen se reemplazan o se borran.

Propiedad de recuento de componentes

Cada objeto mantiene una propiedad de recuento de componentes, que especifica el número de objetos subidos en un principio desde los que se creó. Componer una secuencia de objetos crea un objeto cuyo recuento de componentes es igual a la suma de recuentos de componentes de cada objeto compuesto en la secuencia más 1 por cada objeto no compuesto de la secuencia. Por ejemplo, si realizas una operación de composición en la que los primeros 2 componentes son objetos no compuestos y el tercer componente es un objeto compuesto con un recuento de componentes de 12, el recuento de componentes total para la operación de composición sería de 14.

A pesar de que no existe un límite en el número de componentes que un objeto compuesto puede contener, la propiedad de metadatos componentCount de un objeto se satura en 2,147,483,647. Por ejemplo, supongamos que tienes un objeto que contiene 3,000,000,000 de componentes. En este caso, el componentCount para el objeto tiene un valor de 2,147,483,647.

Verificación de integridad de los objetos compuestos

Cloud Storage usa CRC32C para verificar la integridad de cada objeto componente en el momento de la carga y permitir a la persona que llama realizar una verificación de integridad del objeto compuesto resultante cuando se descarga. CRC32C es un código de detección de error que se puede calcular con eficiencia desde los valores CRC32C de sus componentes. Tu aplicación debería usar CRC32C de la siguiente manera:

  • Cuando subes objetos componentes, deberías calcular el CRC32C para cada objeto con una biblioteca CRC32C como alguna de las indicadas debajo y también incluir ese valor en tu solicitud.
  • Para la operación de composición, tendrías que incluir un CRC32C en la solicitud. Cloud Storage responderá con el CRC32C del objeto compuesto. Cloud Storage no calculará los valores MD5 para los objetos compuestos.
  • En el momento de la descarga, tienes que calcular el CRC32C del objeto descargado y compararlo con el valor incluido en la respuesta.
  • Si tu aplicación puede cambiar los objetos componentes entre el momento de la carga y la composición de esos objetos, tendrías que especificar los nombres específicos de generación de los objetos de origen a fin de evitar condiciones de carrera.

Las bibliotecas que procesan valores CRC32C incluyen Boost para C++, GoogleCloudPlatform crc32c para Java, crcmod para Python y digest-crc para Ruby. También, ten en cuenta que CRC32C es compatible en hardware en las CPU Intel actuales.

Antes, Cloud Storage usaba MD5 para construir el valor ETag. Esto no es así para los objetos compuestos; el código del cliente no debería realizar suposiciones sobre las ETags del objeto compuesto, a menos que cambien cuando el objeto subyacente cambie por la especificación IETF para HTTP/1.1.

Cargas paralelas

La composición de objetos se puede usar para subir un objeto en paralelo: solo divide tus datos en varias partes, sube cada parte a un objeto en paralelo distinto, compone tu objeto final y borra cualquier objeto temporal.

Con el fin de estar protegidos de los cambios a los objetos componentes entre la carga y las solicitudes de composición, los usuarios deben proporcionar un número de generación esperado para cada componente. Para obtener más información sobre las generaciones de objetos, consulta Generaciones y criterios previos.

Ediciones y agregados limitados

También puedes usar la operación de composición para realizar ediciones y agregados limitados de objetos.

El agregado se lleva a cabo mediante la carga de datos a un objeto nuevo temporal, lo que compone al objeto que deseas agregar junto con estos datos nuevos, nombra de forma opcional al resultado de la operación de composición de la misma forma que el objeto original y borra el objeto temporal.

También puedes usar la composición para que sea compatible con una variante básica de edición de objetos. Por ejemplo, podrías componer un objeto X desde la secuencia {Y1, Y2, Y3}, reemplazar los contenidos de Y2 y volver a componer X desde esos mismos componentes. Ten en cuenta que esto requiere que Y1, Y2 y Y3 se dejen sin borrar, por lo que se facturarán esos componentes y el compuesto.

Realiza la composición de objetos con gsutil

gsutil es compatible con la composición de objetos con el comando compose. Si quieres obtener más información, consulta su documentación integrada; para eso, ejecuta lo siguiente:

gsutil help compose

Por ejemplo, para componer un objeto (composite-object) a partir de tres objetos (component-obj-1, component-obj-2, component-obj-3), puedes usar el siguiente comando:

gsutil compose gs://example-bucket/component-obj-1 gs://example-bucket/component-obj-2 gs://example-bucket/component-obj-3 gs://example-bucket/composite-object

O, si los objetos que compones son los únicos con el prefijo component-obj-, entonces también puedes usar un comodín en el comando de composición como se muestra en el ejemplo a continuación:

gsutil compose gs://example-bucket/component-obj-* gs://example-bucket/composite-object

Después de la operación de composición, puedes verificar el recuento de componentes con el siguiente comando:

gsutil stat gs://example-bucket/composite-object

En este ejemplo, el recuento de componentes es 3.

Los dos comandos a continuación copian composite-object a new-object y luego mueven de nuevo a new-object para que use el nombre original. Ambos comandos usan la opción -p del comando cp para que gsutil conserve las LCA de objeto.

gsutil cp -D -p gs://example-bucket/composite-object gs://example-bucket/new-object
gsutil mv -p gs://example-bucket/new-object gs://example-bucket/composite-object

Realiza la composición de objetos con la API de XML

Con la API de XML, compones objetos mediante la emisión de una solicitud de objeto PUT con el parámetro de consulta compose y con la inclusión de un cuerpo XML en el que se enumeren los nombres de objetos componentes como se muestra en el ejemplo debajo.

PUT /example-bucket/composite-object?compose HTTP/1.1
Host: storage.googleapis.com
Content-Length: 153
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

<ComposeRequest>
  <Component>
    <Name>component-obj-1</Name>
  </Component>
  <Component>
    <Name>component-obj-2</Name>
    <Generation>1361471441094000</Generation>
  </Component>
  <Component>
    <Name>component-obj-3</Name>
    <IfGenerationMatch>1361471441094000</IfGenerationMatch>
  </Component>
</ComposeRequest>

No se especifica ningún depósito para los objetos componentes porque, como se señaló antes, los objetos de origen y de destino deben estar todos en el mismo depósito.

En la solicitud de ejemplo de arriba también se especifica un número de generación para component-obj-2, por lo tanto, esta solicitud compondrá la generación 1361471441094000 del objeto incluso si la generación ya no es más actual.

El tercer componente se suministró con una generación condicional mediante el elemento de solicitud IfGenerationMatch; esto provocará que la solicitud falle si el número de generación dado no representa la generación actual del componente.

La respuesta a la solicitud de composición de objeto de arriba se vería de la siguiente forma:

Server: HTTP Upload Server Built on Mar 6 2013 16:24:27 (1362615867)
ETag: "-CKicn4fknbUCEAE="
x-goog-generation: 1362768951202000
x-goog-metageneration: 1
x-goog-hash: crc32c=fbWtZQ==
x-goog-component-count: 3
Vary: Origin
Date: Fri, 08 Mar 2013 18:55:51 GMT
Pragma: no-cache
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html; charset=UTF-8

El encabezado x-goog-hash informa el valor CRC32C del objeto, que se puede validar mediante la compilación de un valor CRC32C desde los valores CRC32C desde los que se compuso el objeto.

El recuento de componentes de un objeto compuesto nuevo es el valor del encabezado de respuesta x-goog-component-count.

Realiza la composición de objetos con la API de JSON

Con la API de JSON compones objetos mediante la emisión de una solicitud compose con un cuerpo de JSON que enumera en orden los nombres de los objetos componentes, como se muestra en el ejemplo debajo.

POST /storage/v1/b/example-bucket/o/composite-object/compose
Host: www.googleapis.com
Content-Length: 216
Content-Type: application/json
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

{
  "sourceObjects": [
    {
      "name": "component-obj-1"
    },
    { "name": "component-obj-2"
    },
    { "name": "component-obj-3"
    }
  ],
  "destination": {
   "contentType": "application/octet-stream"
 }
}

La respuesta a la solicitud de composición de objeto de arriba incluiría un recurso de objeto que incluye el recuento de componentes:

{
 "kind": "storage#object",
 "id": "bucket/composite-object/1388778813188000",
 "selfLink": "https://www.googleapis.com/storage/v1/b/example-bucket/o/composite-object",
 "name": "composite-object",
 "bucket": "bucket",
 "generation": "1388778813188000",
 "metageneration": "1",
 "contentType": "application/octet-stream",
 "updated": "2014-01-03T19:53:33.188Z",
 "size": "524052",
 "mediaLink": "https://www.googleapis.com/download/storage/v1/b/example-bucket/o/composite-object?generation=1388778813188000&alt=media",
 "crc32c": "V9kcXg==",
 "componentCount": 3,
 "etag": "CKDP057k4rsCEAE="
}

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.