Zusammengesetzte Objekte und parallele Uploads

Zur Unterstützung paralleler Uploads und begrenzter Funktionen zum Anfügen und Bearbeiten bietet Cloud Storage Nutzern die Möglichkeit, bis zu 32 Objekte zu einem neuen Objekt zusammenzusetzen, ohne weitere Objektdaten zu übertragen.

Objekte zusammensetzen

Beim Zusammensetzen wird ein neues Objekt erstellt. Der Inhalt dieses Objekts ist eine Sequenz von bis zu 32 Quellobjekten, die verkettet werden. Die Quellobjekte müssen alle dieselbe Speicherklasse haben und in demselben Bucket gespeichert sein. Die Quellobjekte können selbst zusammengesetzte Objekte sein.

Die Quellobjekte bleiben von diesem Vorgang unberührt und die so erstellte Zusammensetzung ändert sich nicht, wenn ihre Quellobjekte ersetzt oder gelöscht werden.

Eigenschaft der Komponentenzahl

Jedes Objekt hat das Attribut Komponentenzahl. Es gibt die Zahl der ursprünglich hochgeladenen Objekte an, aus denen es erstellt wurde. Wenn Sie eine Sequenz von Objekten zusammensetzen, wird ein neues Objekt erzeugt. Seine Komponentenzahl ergibt sich aus der Summe der Komponentenzahlen seiner Quellobjekte. Das bedeutet bei zusammengesetzten Quellobjekten deren Komponentenzahl, bei nicht zusammengesetzten Quellobjekten 1. Wenn bei einer Zusammensetzung zum Beispiel die ersten zwei Komponenten keine zusammengesetzten Objekte sind und die dritte Komponente ein zusammengesetztes Objekt mit der Komponentenzahl 12 ist, beträgt die Gesamtkomponentenzahl dieser Zusammensetzung 14.

Die Anzahl der Komponenten, aus denen ein zusammengesetztes Objekt bestehen kann, ist nicht begrenzt. Allerdings kann das Metadaten-Attribut componentCount eines zusammengesetzten Objekts die Zahl 2.147.483.647 nicht überschreiten. Angenommen, Sie haben ein Objekt, das 3.000.000.000 Komponenten enthält. In diesem Fall hat die Property componentCount für das Objekt einen Wert von 2.147.483.647.

Integritätsprüfung zusammengesetzter Objekte

Cloud Storage verwendet CRC32C, um die Integrität jedes Objekts zum Zeitpunkt seines Uploads zu prüfen und um zu ermöglichen, dass beim Aufruf eine Integritätsprüfung des erstellten zusammengesetzten Objekts vorgenommen werden kann, wenn dieses heruntergeladen wird. CRC32C ist ein Fehlererkennungscode, der aus den CRC32C-Werten seiner Komponenten zuverlässig ermittelt werden kann. Ihre Anwendung sollte CRC32C wie folgt verwenden:

  • Berechnen Sie beim Hochladen von Komponentenobjekten den CRC32C für jedes Objekt. Verwenden Sie hierzu eine CRC32C-Bibliothek wie die unten angegebenen und fügen Sie diesen Wert in Ihre Anfrage ein.
  • Nehmen Sie bei der Zusammensetzung einen CRC32C in die Anfrage auf. Cloud Storage gibt dann als Antwort den CRC32C des zusammengesetzten Objekts aus. Cloud Storage berechnet keine MD5-Werte für zusammengesetzte Objekte.
  • Berechnen Sie zum Zeitpunkt des Downloads den CRC32C des heruntergeladenen Objekts und vergleichen Sie ihn mit dem in der Antwort enthaltenen Wert.
  • Wenn Ihre Anwendung zwischen dem Hochladen und dem Zusammensetzen dieser Objekte Komponenten ändern kann, geben Sie den Quellobjekten Generierungsnamen, um Race-Bedingungen zu vermeiden.

Zu den Bibliotheken für die Berechnung von CRC32C-Werten gehören unter anderem Boost für C++, GoogleCloudPlatform crc32c für Java, crcmod für Python und digest-crc für Ruby. Beachten Sie auch, dass CRC32C von der Hardware aktueller Intel-CPUs unterstützt wird.

In der Vergangenheit verwendete Cloud Storage MD5, um den ETag-Wert zu erstellen. Dies gilt nicht für zusammengesetzte Objekte. Im Clientcode sollte nicht von bestimmten ETags zusammengesetzter Objekte ausgegangen werden, sondern davon, dass diese sich ändern, wenn sich das zugrunde liegende Objekt gemäß der IETF-Spezifikation für HTTP/1.1 ändert.

Parallele Uploads

Die Objektzusammensetzung kann zum parallelen Hochladen eines Objekts verwendet werden. Teilen Sie hierzu einfach Ihre Daten auf und laden Sie die Teile parallel in ein jeweils anderes Objekt hoch. Dann setzen Sie das endgültige Objekt zusammen und löschen alle temporären Objekte.

Um zu verhindern, dass Komponentenobjekte in der Zeit zwischen dem Hochladen und der Anfrage zur Zusammensetzung geändert werden, sollten allen Komponenten plausible Generierungsnummern zugewiesen werden. Weitere Informationen über die Objektgenerierung finden Sie unter Generierungen und Bedingungen.

Begrenztes Anhängen und Bearbeiten

Sie können den Vorgang der Zusammensetzung in begrenztem Umfang auch zum Anhängen und Bearbeiten nutzen.

Zum Anhängen laden Sie die Daten in ein temporäres neues Objekt und setzen das anzuhängende Objekt einschließlich der neuen Daten zusammen. Sie können für die Ausgabe der Zusammensetzung optional denselben Namen festlegen. Danach löschen Sie dann das temporäre Objekt.

Sie können die Objektzusammensetzung auch nutzen, um grundlegende Vorgänge der Objektbearbeitung zu unterstützen. Zum Beispiel können Sie ein Objekt X aus der Sequenz {Y1, Y2, Y3} zusammensetzen, den Inhalt von Y2 ersetzen und X aus denselben Komponenten neu zusammensetzen. Beachten Sie, dass hierbei Y1, Y2 und Y3 nicht gelöscht werden dürfen. Das bedeutet, dass Ihnen außer dem zusammengesetzten Objekt auch die einzelnen Komponenten berechnet werden.

Objekte mit gsutil zusammensetzen

gsutil unterstützt die Objektzusammensetzung mit dem Befehl compose. Weitere Informationen finden Sie in der internen Dokumentation. Führen Sie hierzu folgenden Befehl aus:

gsutil help compose

Um beispielsweise drei Objekte (component-obj-1, component-obj-2 und component-obj-3) zu einem Objekt (composite-object) zusammenzusetzen, können Sie den folgenden Befehl ausführen:

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

Wenn die Objekte, die Sie zusammensetzen, die einzigen mit dem Präfix component-obj- sind, können Sie in dem Befehl zur Zusammensetzung auch einen Platzhalter verwenden, wie im nachstehenden Beispiel gezeigt:

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

Nach der Zusammensetzung können Sie mit dem folgenden Befehl die Komponentenzahl ermitteln:

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

In diesem Beispiel ist die Anzahl der Komponenten 3.

Mit den folgenden zwei Befehlen kopieren Sie ein composite-object in ein new-object und verschieben das new-object dann zurück, um den ursprünglichen Namen zu verwenden. Bei beiden Befehlen wird der Befehl cp mit der Option -p verwendet, sodass die Zugriffssteuerungslisten des Objekts erhalten bleiben.

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

Objekte mit der XML API zusammensetzen

Mit der XML API können Sie Objekte zusammensetzen, indem Sie eine PUT-Objekt-Anfrage mit dem Abfrageparameter compose senden und einen XML-Text einfügen, der die Objektnamen in der korrekten Reihenfolge auflistet, wie im folgenden Beispiel gezeigt.

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>

Für die Komponentenobjekte ist kein Bucket angegeben, weil sich, wie zuvor erwähnt, die Quell- und Zielobjekte im gleichen Bucket befinden müssen.

In der vorstehenden Beispielanfrage wurde für component-obj-2 auch eine Generierungsnummer angegeben, sodass mit dieser Anfrage die Generation 1361471441094000 des Objekts zusammengesetzt wird, selbst wenn sie nicht mehr aktuell ist.

Die dritte Komponente wurde mithilfe des Anfrageelements IfGenerationMatch mit einer bedingten Generation angegeben. Dies bewirkt, dass die Anfrage fehlschlägt, wenn die Generierungsnummer nicht der aktuellen Generation der Komponente entspricht.

Die Antwort auf die oben stehende Anfrage zur Objektzusammensetzung sieht folgendermaßen aus:

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

Der Header x-goog-hash meldet den CRC32C-Wert des Objekts. Dieser kann validiert werden, indem ein CRC32C-Wert aus den CRC32C-Werten erstellt wird, aus denen sich das Objekt zusammensetzt.

Die Komponentenzahl des neuen zusammengesetzten Objekts entspricht dem Wert des Antwortheaders x-goog-component-count.

Objekte mit der JSON-API zusammensetzen

Mit der JSON API können Sie Objekte zusammensetzen, indem Sie eine compose-Anfrage mit einem XML-Text senden, der die Objektnamen in der korrekten Reihenfolge auflistet, wie im folgenden Beispiel gezeigt.

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

Die Antwort auf die vorstehende Anfrage zur Objektzusammensetzung enthält eine Objektressource, die die Komponentenzahl enthält:

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

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...