複合物件和平行上傳

為了支援平行上傳和有限的附加/編輯功能,Cloud Storage 允許使用者將最多 32 個現有物件組合成一個新物件,無需移轉額外的物件資料。

組合作業

組合作業會建立一個新物件,物件內容是最多 32 個指定順序的來源物件內容串連結果。所有來源物件都必須擁有相同的儲存空間級別並儲存在相同的值區中。來源物件本身可以是複合物件。

來源物件不會受到組合處理的影響,產生的複合物件不會因來源物件遭到取代或刪除而變更。

元件計數屬性

每個物件都有一個「元件計數」屬性,這個屬性指定用來建立此物件的原始上傳物件數。將一連串的物件組合在一起會建立一個物件,其元件計數等於該物件序列中每個複合物件的元件數總和,序列中每個非複合物件則再加 1。例如,如果在您執行的組合作業中,前 2 個元件是非複合物件,第三個元件是元件計數 12 的複合物件,則組合作業的元件總數是 14。

雖然複合物件沒有組成元件的數量限制,但物件的 componentCount 中繼資料屬性上限為 2,147,483,647。例如,假設您的物件含有 3,000,000,000 個元件。在此情況下,物件的 componentCount 值為 2,147,483,647。

對複合物件執行完整性檢查

Cloud Storage 使用 CRC32C 對上傳時的每一個元件物件執行完整性檢查,並允許叫用者在產生的複合物件下載時進行完整性檢查。CRC32C 是一種錯誤偵測碼,可以依據其元件的 CRC32C 值有效計算。您的應用程式應依照下列指示使用 CRC32C:

  • 上傳元件物件時,您應使用 CRC32C 程式庫 (如下面列出的其中一項) 計算每個物件的 CRC32C,並在要求中納入該值。
  • 在組合作業中,您應在要求中加入 CRC32C。Cloud Storage 將會以複合物件的 CRC32C 進行回應。Cloud Storage 不會計算複合物件的 MD5 值。
  • 下載時,您應計算下載物件的 CRC32C,並與回應所含的值進行比較。
  • 如果應用程式可以在上傳和組合物件兩項作業之間變更元件物件,您應指定來源物件的產生版本專用名稱,以避免發生競爭狀況。

用來計算 CRC32C 值的程式庫包括 Boost for C++、GoogleCloudPlatform crc32c for Java、crcmod for Python 及 digest-crc for Ruby。另請注意,目前 Intel CPU 硬體支援 CRC32C。

在過去,Cloud Storage 使用 MD5 來建構 ETag 值。這不適用於複合物件;用戶端程式碼不應對複合物件 ETag 有任何假設,除非基礎物件依據 HTTP/1.1 的 IETF 規格變更時 Etag 也會變更。

平行上傳

物件組合可用於平行上傳物件,方法是將資料簡單分成多個區塊、將每個區塊平行上傳至不同物件、組合最終物件,然後刪除所有臨時物件。

為了防止在上傳和組合要求之間元件物件發生變更,使用者應提供每個元件的預期產生版本號碼。如要進一步瞭解物件產生,請參閱產生版本和先決條件相關頁面。

有限的附加和編輯

您可以使用組合作業來完成有限的物件附加和編輯作業。

附加作業是將資料上傳至臨時新物件,組合您要附加的物件以及這個新資料,您可以選擇是否要依照原始物件命名組合作業的輸出,然後刪除臨時物件。

您也可以使用組合來支援物件編輯的基本自行設定。例如,您可以依據「{Y1, Y2, Y3}」的順序組合物件「X」,取代「Y2」的內容,然後依據這些相同元件重新組合「X」。請注意,這需要「Y1」、「Y2」和「Y3」維持未刪除狀態,所以系統會向您收取這些元件及複合物件的費用。

使用 gsutil 執行物件組合

gsutil 支援使用 compose 指令執行物件組合。如需詳細資料,請執行下列指令以參閱內建的說明文件:

gsutil help compose

例如,若要將三個物件 (component-obj-1component-obj-2component-obj-3) 組合成一個物件 (composite-object),您可以使用下列指令:

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

如果您組合的物件是唯一具有 component-obj- 前置字串的物件,那麼也可以在 compose 指令中使用萬用字元,如下列範例所示:

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

組合作業完成後,您可以使用下列指令檢查元件計數:

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

在此範例中,元件計數為 3。

下面兩個指令會將 composite-object 複製到 new-object,然後將 new-object 移回以使用原始名稱。這兩個指令均使用 cp 指令的 -p 選項,以讓 gsutil 保留物件 ACL。

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

使用 XML API 執行物件組合

在 XML API 中,如要組合物件,請發出含有 compose 查詢參數的 PUT 物件要求,然後依照下列範例顯示的順序,納入列出元件物件名稱的 XML 主體。

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>

元件物件沒有指定的值區,因為如之前所述,來源和目的地物件必須都在同一值區中。

上面的要求範例還指定了 component-obj-2 的產生版本編號,所以此要求將組合物件的 1361471441094000 產生版本,即使該產生版本已不是最新版本。

系統會使用 IfGenerationMatch 要求元素在第三個元件中提供條件式產生版本;如果指定的產生版本編號不代表元件的當前產生版本,則這會造成要求失敗。

上述物件組合要求的回應如下所示:

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

x-goog-hash 標頭會報告物件的 CRC32C 值,如要驗證此值,您可以依據組合物件使用的 CRC32C 值來建構 CRC32C 值。

新複合物件的元件計數是 x-goog-component-count 回應標頭的值。

使用 JSON API 執行物件組合

使用 JSON API 時,如要組合物件,請發出組合要求,要求的 JSON 主體會依序列出元件物件名稱,如下列範例所示。

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

上述物件組合要求的回應會納入含有元件計數的物件資源

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

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Storage
需要協助嗎?請前往我們的支援網頁