Objets composites et importations parallèles

Pour permettre les importations parallèles, et proposer des fonctionnalités d'ajout et de modification limitées, Cloud Storage autorise les utilisateurs à composer un nouvel objet en utilisant jusqu'à 32 objets existants sans transférer de données d'objets supplémentaires.

Opération de composition

L'opération de composition crée un objet dont le contenu est la concaténation d'une séquence donnée d'objets sources (jusqu'à 32). Les objets sources doivent tous appartenir à la même classe de stockage et être stockés dans le même bucket. Ils peuvent eux-mêmes être des objets composites.

Le processus de composition n'a pas d'incidence sur les objets sources. L'objet composite obtenu ne change pas si les objets sources sont remplacés ou supprimés.

Propriété relative au nombre de composants

Chaque objet dispose d'une propriété relative au nombre de composants, qui spécifie le nombre d'objets initialement importés à partir desquels il a été créé. La composition d'une séquence d'objets a pour effet de créer un objet dont le nombre de composants est égal à la somme des composants de chaque objet composite de la séquence, plus 1 pour chaque objet non composite de la séquence. Imaginons que vous procédiez à une opération de composition dans laquelle les deux premiers composants sont des objets non composites. Si le troisième composant est un objet composite doté de 12 composants, le nombre total de composants pour cette opération de composition est de 14.

Bien que le nombre de composants pouvant être inclus dans un objet composite ne soit pas limité, la propriété de métadonnées componentCount d'un objet sature si ce nombre atteint 2 147 483 647. Par exemple, supposons que vous disposiez d'un objet contenant 3 000 000 000 de composants. Dans ce cas, la propriété componentCount de l'objet a la valeur 2 147 483 647.

Contrôle de l'intégrité des objets composites

Cloud Storage utilise CRC32C pour contrôler l'intégrité de chaque objet composant lors de l'importation et pour permettre à l'utilisateur à l'origine de l'appel d'effectuer le même type de contrôle sur l'objet composite obtenu lors de son téléchargement. CRC32C est un code de détection d'erreur pouvant être calculé efficacement à partir des valeurs CRC32C de ses composants. Votre application doit utiliser CRC32C comme suit :

  • Lorsque vous importez des objets composants, calculez le code CRC32C pour chaque objet à l'aide d'une bibliothèque CRC32C (telle que l'une de celles répertoriées ci-dessous) et inclure cette valeur dans votre requête.
  • Pour l'opération de composition, incluez un code CRC32C dans la requête. Cloud Storage répond avec le code CRC32C de l'objet composite. Il ne calcule pas les valeurs MD5 pour les objets composites.
  • Lors du téléchargement, calculez le code CRC32C de l'objet téléchargé et comparez-le à la valeur incluse dans la réponse.
  • Si votre application peut modifier les objets composants entre le moment où ils sont importés et le moment où ils sont composés, spécifiez des noms propres aux générations pour les objets sources afin d'éviter les conditions de concurrence.

Les bibliothèques permettant de calculer les valeurs CRC32C incluent Boost pour C++, GoogleCloudPlatform crc32c pour Java, crcmod pour Python et digest-crc pour Ruby. Notez également que le code CRC32C est compatible avec les composants matériels des processeurs Intel actuels.

Auparavant, Cloud Storage utilisait MD5 pour générer la valeur ETag. Ce comportement ne s'applique pas aux objets composites. Le code client ne doit faire aucune hypothèse concernant les ETags des objets composites, si ce n'est qu'ils changent chaque fois que l'objet sous-jacent est modifié conformément à la spécification IETF pour HTTP/1.1.

Importations parallèles

La composition d'objets peut être utilisée pour importer un objet en parallèle. Il suffit de scinder vos données en plusieurs fragments, d'importer chaque fragment dans un objet distinct en parallèle, de composer votre objet final et de supprimer tous les objets temporaires.

Afin d'empêcher les modifications d'objets composants entre les requêtes d'importation et de composition, les utilisateurs doivent fournir un numéro de génération attendu pour chaque composant. Pour en savoir plus sur les générations d'objets, consultez la page Numéros de génération et conditions préalables.

Ajouts et modifications limités

Vous pouvez également utiliser l'opération de composition pour procéder à des ajouts et à des modifications d'objets limités.

Pour effectuer un ajout, importez des données dans un nouvel objet temporaire, composez l'objet à ajouter avec ces nouvelles données, attribuez éventuellement le nom de l'objet initial au résultat de l'opération de composition et supprimez l'objet temporaire.

Vous pouvez également utiliser la composition pour apporter des modifications élémentaires aux objets. Par exemple, vous avez la possibilité de composer un objet X à partir de la séquence {Y1, Y2, Y3}, de remplacer le contenu de Y2 et de recomposer X à partir des mêmes composants. Notez que cette opération requiert que Y1, Y2 et Y3 ne soient pas supprimés. Ces composants ainsi que l'objet composite vous seront donc facturés.

Composer des objets avec gsutil

gsutil permet de composer des objets avec la commande compose. Pour en savoir plus, consultez la documentation intégrée de l'outil en exécutant la commande suivante :

gsutil help compose

Par exemple, pour composer un seul objet (composite-object) à partir de trois objets (component-obj-1, component-obj-2 et component-obj-3), vous pouvez utiliser la commande suivante :

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

Si les objets utilisés pour la composition sont les seuls à inclure le préfixe component-obj-, vous pouvez utiliser un caractère générique dans la commande de composition, comme illustré dans l'exemple suivant :

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

Après l'opération de composition, vous pouvez vérifier le nombre de composants à l'aide de la commande suivante :

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

Dans cet exemple, le nombre de composants est égal à trois.

Les deux commandes ci-dessous copient composite-object dans new-object, puis retransfèrent new-object afin d'utiliser le nom initial. Elles utilisent l'option -p de la commande cp afin que gsutil conserve les LCA des objets.

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

Composer des objets avec l'API XML

Avec l'API XML, vous pouvez composer des objets via une requête d'objet PUT incluant le paramètre de requête compose et un corps XML qui répertorie le nom des objets composants selon un certain ordre, comme illustré dans l'exemple ci-dessous.

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>

Aucun bucket n'est spécifié pour les objets composants. En effet, comme indiqué précédemment, les objets sources et de destination doivent tous se trouver dans le même bucket.

L'exemple de requête ci-dessus spécifie également un numéro de génération pour component-obj-2. Par conséquent, cette requête compose la génération 1361471441094000 de l'objet, même s'il ne s'agit pas de la génération actuelle.

Le troisième composant a été fourni avec une génération conditionnelle à l'aide de l'élément de requête IfGenerationMatch. La requête échoue si le numéro de génération indiqué ne correspond pas à la génération actuelle du composant.

La réponse à la requête de composition d'objet ci-dessus doit se présenter comme suit :

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

L'en-tête x-goog-hash indique la valeur CRC32C de l'objet, que vous pouvez valider en créant une valeur CRC32C au moyen des valeurs CRC32C à partir desquelles l'objet a été composé.

Le nombre de composants du nouvel objet composite correspond à la valeur de l'en-tête de réponse x-goog-component-count.

Composer des objets avec l'API JSON

Avec l'API JSON, vous pouvez composer des objets via une requête compose incluant un corps JSON qui répertorie le nom des objets composants selon un certain ordre, comme illustré dans l'exemple ci-dessous.

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 réponse à la requête de composition d'objet ci-dessus comporte une ressource d'objet qui inclut le nombre de composants.

{
 "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="
}

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Besoin d'aide ? Consultez notre page d'assistance.