Compartilhar via


Ajuste do desempenho de uploads e downloads com JavaScript

Quando um aplicativo transfere dados usando a biblioteca de clientes do Armazenamento do Microsoft Azure para JavaScript, há vários fatores que podem afetar a velocidade, o uso de memória e até mesmo o êxito ou a falha da solicitação. Para maximizar o desempenho e a confiabilidade das transferências de dados, é importante ser proativo na configuração das opções de transferência da biblioteca do cliente com base no ambiente em que seu aplicativo é executado.

Este artigo aborda várias considerações para ajustar as opções de transferência de dados. Quando ajustada corretamente, a biblioteca de clientes pode distribuir dados com eficiência entre várias solicitações, o que pode resultar em maior velocidade de operação, uso de memória e estabilidade de rede.

Ajuste de desempenho de uploads

Ajustar corretamente as opções de transferência de dados é fundamental para o desempenho confiável de uploads. As transferências de armazenamento são particionadas em várias subtransferências com base nos valores desses argumentos. O tamanho máximo de transferência com suporte varia de acordo com a operação e a versão do serviço. Portanto, verifique a documentação para determinar os limites. Para obter mais informações sobre limites de tamanho de transferência para o Armazenamento de Blobs, confira Dimensionar destinos para armazenamento de Blobs.

Definir opções de transferência de uploads

Você pode configurar as propriedades em BlockBlobParallelUploadOptions para melhorar o desempenho das operações de transferência de dados. A tabela a seguir lista as propriedades que você pode configurar, juntamente com uma descrição:

Propriedade Descrição
blockSize O tamanho máximo do bloco a ser transferido para cada solicitação como parte de uma operação de upload. Para saber mais, consulte blockSize.
maxSingleShotSize Se o tamanho dos dados for menor ou igual a esse valor, eles serão carregados em uma única entrada, em vez de divididos em partes. Se os dados forem carregados de uma só vez, o tamanho do bloco será ignorado. O valor padrão é 256 MB. Se você personalizar essa propriedade, deverá usar um valor menor ou igual a 256 MB. Para saber mais, confira maxSingleShotSize.
concurrency O número máximo de solicitações paralelas que são emitidas a qualquer momento como parte de uma única transferência paralela.

Observação

As bibliotecas de cliente usarão padrões para cada opção de transferência de dados, se não for fornecida. Esses padrões normalmente têm um bom desempenho em um ambiente de data center, mas provavelmente não são adequados para ambientes de consumidor doméstico. As opções de transferência de dados ajustadas de forma incorreta pode resultar em operações excessivamente longas e até mesmo tempos limite de solicitação. É melhor ser proativo ao testar esses valores e ajustá-los com base nas necessidades do seu aplicativo e ambiente.

maxSingleShotSize

O valor maxSingleShotSize é o tamanho máximo do blob em bytes para um upload de uma única solicitação.

Se o tamanho dos dados for menor ou igual a maxSingleShotSize, o blob será carregado com uma única solicitação Put Blob. Se o tamanho do blob for maior que maxSingleShotSize ou se o tamanho do blob for desconhecido, o blob será carregado em partes usando uma série de chamadas Put Block seguidas por Put Block List.

É importante observar que o valor especificado para blockSize não limita o valor definido para maxSingleShotSize. O argumento maxSingleShotSize define uma limitação de tamanho separada de uma solicitação para executar toda a operação de uma só vez, sem subtransferências. Muitas vezes, você deseja que maxSingleShotSize seja pelo menos tão grande quanto o valor definido para blockSize, se não maior. Dependendo do tamanho da transferência de dados, essa abordagem pode ter um desempenho melhor, pois a transferência é concluída com uma única solicitação e evita a sobrecarga de várias solicitações.

Se você não tiver certeza de qual valor é melhor para sua situação, uma opção segura é definir maxSingleShotSize como o mesmo valor usado para blockSize.

blockSize

O valor blockSize é o comprimento máximo de uma transferência em bytes ao carregar um blob de blocos em partes.

Conforme mencionado anteriormente, esse valor não limita maxSingleShotSize, que pode ser maior que blockSize.

Para manter os dados em movimento com eficiência, as bibliotecas de cliente nem sempre podem alcançar o valor blockSize para cada transferência. Dependendo da operação, o valor máximo com suporte para o tamanho da transferência pode variar. Para obter mais informações sobre limites de tamanho de transferência para o Armazenamento de Blobs, confira o gráfico em Dimensionar destinos para armazenamento de Blobs.

Exemplo de código

O exemplo de código a seguir mostra como definir valores para BlockBlobParallelUploadOptions e incluir as opções como parte de uma chamada de método de upload. Os valores fornecidos nestes exemplos têm a intenção de ser uma recomendação. Para ajustar adequadamente esses valores, você precisa considerar as necessidades específicas do seu aplicativo.

// Specify data transfer options
const uploadOptions = {
  blockSize: 4 * 1024 * 1024, // 4 MiB max block size
  concurrency: 2, // maximum number of parallel transfer workers
  maxSingleShotSize: 8 * 1024 * 1024, // 8 MiB initial transfer size
} 

// Create blob client from container client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);

// Upload blob with transfer options
await blockBlobClient.uploadFile(localFilePath, uploadOptions);

Neste exemplo, definimos o número máximo de trabalhos de transferência paralela como 2, usando a propriedade concurrency. Também definimos maxSingleShotSize como 8 MiB. Se o tamanho do blob for menor que 8 MiB, apenas uma única solicitação será necessária para concluir a operação de upload. Se o tamanho do blob for maior que 8 MiB, o blob será carregado em partes com um tamanho máximo de parte de 4 MiB, que definimos usando a propriedade blockSize.

Considerações de desempenho para uploads

Durante um upload, as bibliotecas do cliente de armazenamento dividem um determinado fluxo de upload em vários subuploads com base nas opções de configuração definidas por BlockBlobParallelUploadOptions. Cada subupload tem sua própria chamada dedicada para a operação REST. Neste exemplo, a operação é Put Block. A biblioteca de clientes de armazenamento gerencia essas operações REST paralelamente (dependendo das opções de transferência) para concluir o upload completo.

Observação

Os blobs de blocos têm uma contagem máxima de blocos de 50.000 blocos. Então, o tamanho máximo do blob de blocos é 50.000 vezes block_size.

Buffer durante os uploads

A camada REST de Armazenamento não dá suporte à coleta de uma operação de upload REST de onde você parou. As transferências individuais são concluídas ou perdidas. Para garantir a resiliência de uploads de fluxos, as bibliotecas de clientes de armazenamento colocam os dados em buffer para cada chamada REST individual antes de iniciar o upload. Além das limitações de velocidade de rede, esse comportamento de buffer é motivo para considerar um valor menor para blockSize, mesmo ao carregar em sequência. Diminuir o valor de blockSize diminui a quantidade máxima de dados armazenados em buffer em cada solicitação e em cada nova tentativa de uma solicitação com falha. Se você estiver enfrentando tempos limite frequentes durante as transferências de dados de um determinado tamanho, a redução do valor de blockSize reduz o tempo de armazenamento em buffer e pode resultar em um melhor desempenho.

Ajuste de desempenho de downloads

As opções de ajuste de transferência de dados para downloads só estão disponíveis ao usar o método downloadToBuffer. Esse método baixa um blob em paralelo a um buffer com base nos valores definidos em BlobDownloadToBufferOptions. Outros métodos de download não dão suporte a opções de ajuste de transferência de dados.

Definir opções de transferência de downloads

Os seguintes valores podem ser ajustados para downloads ao usar o método downloadToBuffer:

  • blockSize: o tamanho máximo do bloco a ser transferido para cada solicitação.
  • concurrency: o número máximo de solicitações paralelas emitidas a qualquer momento como parte de uma única transferência paralela.

Considerações de desempenho para downloads

Durante um download usando downloadToBuffer, as bibliotecas do cliente do Armazenamento dividem uma determinada solicitação de download em vários sub-downloads com base nas opções de configuração definidas por BlobDownloadToBufferOptions. Cada subdownload tem sua própria chamada dedicada para a operação REST. Dependendo das opções de transferência, as bibliotecas de clientes gerenciarão essas operações REST paralelamente para concluir o download completo.

Exemplo de código

O exemplo de código a seguir mostra como definir valores para BlobDownloadToBufferOptions e incluir as opções como parte de uma chamada de método downloadToBuffer. Os valores fornecidos nestes exemplos têm a intenção de ser uma recomendação. Para ajustar adequadamente esses valores, você precisa considerar as necessidades específicas do seu aplicativo.

// Specify data transfer options
    const downloadToBufferOptions = {
        blockSize: 4 * 1024 * 1024, // 4 MiB max block size
        concurrency: 2, // maximum number of parallel transfer workers
    }

    // Download data to buffer
    const result = await client.downloadToBuffer(offset, count, downloadToBufferOptions);