Objetos compostos e uploads paralelos

Para fins de compatibilidade com uploads paralelos e funcionalidade limitada de anexação/edição, o Cloud Storage permite que os usuários componham até 32 objetos atuais em um novo objeto sem transferir dados extras.

Operação de composição

A operação de composição cria um novo objeto com a concatenação de uma determinada sequência de até 32 objetos de origem. Os objetos de origem precisam ser todos da mesma classe de armazenamento e todos armazenados no mesmo intervalo. Os objetos de origem podem ser compostos.

Os objetos de origem não são afetados pelo processo de composição, e o objeto composto resultante não será alterado se os objetos de origem forem substituídos ou excluídos.

Propriedade de contagem de componentes

Cada objeto mantém uma propriedade de contagem de componentes, que especifica o número de objetos carregados originalmente de que foi criada. Compor uma sequência de objetos cria um objeto que tem uma contagem de componentes igual à soma das contagens de componentes de cada objeto composto na sequência mais 1 para cada objeto não composto na sequência. Por exemplo, se você executar uma operação de composição em que os primeiros 2 componentes são objetos não compostos e o terceiro componente for um objeto composto com uma contagem de componentes de 12, o total de contagem de componentes para a operação de composição será 14.

Mesmo que não haja limite para o número de componentes que um objeto composto pode conter, a propriedade de metadados componentCount de um objeto é saturada em 2.147.483.647. Por exemplo, digamos que você tenha um objeto que contenha 3.000.000.000 componentes. Nesse caso, o componentCount para o objeto tem um valor de 2.147.483.647.

Como fazer verificação de integridade de objetos compostos

O Cloud Storage usa o CRC32C (em inglês) para verificar a integridade de cada objeto componente no momento do upload e para permitir que o chamador execute uma verificação de integridade do objeto composto resultante quando o download dele é feito. O CRC32C é um código de detecção de erros que pode ser calculado com eficiência dos valores CRC32C dos componentes dele. Seu aplicativo usará o CRC32C da maneira a seguir:

  • Ao fazer o upload de objetos de componente, calcule o CRC32C para cada objeto usando uma biblioteca CRC32C, como uma das listadas abaixo, e inclua esse valor em sua solicitação.
  • Para a operação de composição, inclua um CRC32C na solicitação. O Cloud Storage responderá com o CRC32C do objeto composto. O Cloud Storage não calculará valores MD5 para objetos compostos.
  • No momento do download, calcule o CRC32C do objeto que você fez download e o compare com o valor incluído na resposta.
  • Se seu aplicativo puder alterar objetos de componente entre o momento de fazer o upload e compor esses objetos, defina nomes específicos de geração para os objetos de origem para evitar condições de corrida.

As bibliotecas para calcular os valores de CRC32C incluem Boost para C++, GoogleCloudPlatform crc32c para Java, crcmod para Python e digest-crc para Ruby. Observe também que o CRC32C é compatível com hardware nas CPUs da Intel atuais.

No passado, o Cloud Storage usava o MD5 para construir o valor de ETag. Isso não se aplica a objetos compostos. O código do cliente não fará suposições sobre ETags de objetos compostos, exceto que eles serão alterados sempre que o objeto subjacente for alterado de acordo com a especificação IETF para HTTP/1.1 (em inglês).

Uploads paralelos

A composição de objetos pode ser usada para fazer o upload de um objeto em paralelo: basta dividir seus dados em vários fragmentos, fazer o upload de cada um deles em um objeto distinto em paralelo, compor seu objeto final e excluir quaisquer objetos temporários.

Para proteger contra alterações em objetos de componentes entre as solicitações de upload e de composição, os usuários precisam fornecer um número de geração esperado para cada componente. Para mais informações sobre as gerações de objetos, consulte Gerações e condições prévias.

Anexação e edição limitadas

Você também pode usar a operação de composição para realizar anexações e edições de objetos limitados.

A anexação é realizada por meio do upload de dados para um novo objeto temporário, compondo o objeto que você quer anexar junto com esses novos dados, nomeando opcionalmente a saída da operação de composição da mesma forma que o objeto original e excluindo o objeto temporário.

Você também pode usar composição para dar suporte a uma versão básica de edição de objetos. Por exemplo, você poderia compor um objeto X da sequência {Y1, Y2, Y3}, substituir o conteúdo de Y2 e recompor X desses mesmos componentes. Observe que isso exige que Y1, Y2 e Y3 não sejam excluídos, portanto, você será cobrado por esses componentes, bem como pelo composto.

Como executar a composição de objetos com o gsutil

O gsutil é compatível com a composição de objetos com o comando de composição. Para mais detalhes, consulte a documentação integrada executando:

gsutil help compose

Por exemplo, para compor três objetos (component-obj-1, component-obj-2, component-obj-3) em um objeto (composite-object), você pode usar o comando a seguir:

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

Ou, se os objetos que você está compondo forem os únicos com o prefixo component-obj-, você também poderá usar um curinga no comando de composição, conforme mostrado no exemplo a seguir:

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

Após a operação de composição, você pode verificar a contagem de componentes com o comando abaixo:

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

Neste exemplo, a contagem de componentes é 3.

Os dois comandos a seguir copiam composite-object para new-object e, em seguida, movem o new-object volta para usar o nome original. Ambos os comandos usam a opção -p do comando cp para que o gsutil preserve ACLs 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

Como executar a composição de objetos com a API XML

Com a API XML, você compõe objetos emitindo uma solicitação de objeto PUT com o parâmetro de consulta de composição e incluindo um corpo XML listando os nomes de objetos de componente na ordem mostrada no exemplo abaixo.

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>

Nenhum intervalo é especificado para os objetos de componente porque, como observado anteriormente, os objetos de origem e de destino precisam estar todos no mesmo intervalo.

A solicitação de exemplo acima também especifica um número de geração para component-obj-2, portanto, essa solicitação vai compor a geração 1361471441094000 do objeto, mesmo que essa geração não esteja mais em atividade.

O terceiro componente foi fornecido com uma geração condicional usando o elemento de solicitação IfGenerationMatch. Isso fará com que a solicitação apresente falha se o número de geração fornecido não representar a geração atual do componente.

A resposta à solicitação de composição de objeto acima seria semelhante a:

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

O cabeçalho x-goog-hash reporta o valor CRC32C do objeto, que pode ser validado criando um valor CRC32C dos valores CRC32C dos quais o objeto foi composto.

A contagem de componentes do novo objeto composto é o valor do cabeçalho de resposta x-goog-component-count.

Como executar a composição de objetos com a API JSON

Com a API JSON, você compõe objetos emitindo uma solicitação de composição com um corpo JSON listando os nomes de objetos do componente em ordem, conforme mostrado no exemplo abaixo.

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

A resposta à solicitação de composição de objeto acima incluiria um recurso de objeto que inclui a contagem 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="
}

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.