Melhore a velocidade de processamento de dados do OSS, reduza a latência e acelere as respostas dos aplicativos ao aproveitar a arquitetura distribuída do Alibaba Cloud OSS.
Substitua prefixos sequenciais por prefixos aleatórios
O OSS particiona os dados com base na ordem UTF-8 das chaves de objeto para suportar requisições de alta concorrência. Prefixos sequenciais (carimbos de data e hora ou strings ordenadas lexicograficamente) concentram os arquivos em poucas partições, sobrecarregando-as. Em vez disso, use prefixos aleatórios para distribuir a carga de forma uniforme.
Quando a taxa ultrapassa 2.000 requisições por segundo, podem ocorrer os seguintes problemas. Cada baixe, upload, exclua, cópia ou recuperação de metadados conta como uma operação. Uma exclua em lote ou a listagem de N arquivos conta como N operações.
Formação de partições de hotspot: requisições de alta frequência concentram-se em partições específicas, esgotando sua capacidade de I/O ou acionando a limitação automática.
-
Limitação da taxa de requisições: partições de hotspot acionam o rebalanceamento contínuo de dados, aumentando o tempo de processamento das requisições.
NotaO rebalanceamento baseia-se no status em tempo real do sistema e na análise da capacidade de processamento, não em regras fixas de sharding. Arquivos com prefixos sequenciais podem permanecer em uma partição de hotspot após o rebalanceamento.
Para resolver esses problemas, substitua o prefixo sequencial por um aleatório. Isso distribui o índice de objetos e a carga de I/O uniformemente entre as partições.
-
Adicione um prefixo de hash hexadecimal à chave do objeto
Ao usar datas e IDs de clientes para gerar chaves de objeto, elas contêm um prefixo sequencial de carimbo de data e hora:
sample-bucket-01/2024-07-19/customer-1/file1 sample-bucket-01/2024-07-19/customer-2/file2 sample-bucket-01/2024-07-19/customer-3/file3 ... sample-bucket-01/2024-07-20/customer-2/file4 sample-bucket-01/2024-07-20/customer-5/file5 sample-bucket-01/2024-07-20/customer-7/file6 ...Calcule um hash (como MD5) do ID do cliente e use alguns caracteres como prefixo da chave do objeto. Com um prefixo de hash de 4 caracteres, as chaves ficam assim:
sample-bucket-01/9b11/2024-07-19/customer-1/file1 sample-bucket-01/9fc2/2024-07-19/customer-2/file2 sample-bucket-01/d1b3/2024-07-19/customer-3/file3 ... sample-bucket-01/9fc2/2024-07-20/customer-2/file4 sample-bucket-01/f1ed/2024-07-20/customer-5/file5 sample-bucket-01/0ddc/2024-07-20/customer-7/file6 ...Um hash hexadecimal de 4 caracteres fornece 164 (65.536) combinações possíveis, permitindo até 65.536 partições. Avalie se essa quantidade é suficiente com base na sua taxa de requisições e no limite de 2.000 operações por segundo por partição.
Para listar objetos por data (por exemplo, todos os objetos de 2024-07-19 em
sample-bucket-01), liste todos os objetos no bucket ao chamar a API ListObject em lotes e, em seguida, mescle os resultados correspondentes à data desejada. -
Inverta a chave do objeto
Um carimbo de data e hora UNIX com precisão de milissegundos usado como chave do objeto também atua como um prefixo sequencial:
sample-bucket-02/1513160001245.log sample-bucket-02/1513160001722.log sample-bucket-02/1513160001836.log sample-bucket-02/1513160001956.log ... sample-bucket-02/1513160002153.log sample-bucket-02/1513160002556.log sample-bucket-02/1513160002859.log ...Inverta o carimbo de data e hora para evitar a ordenação sequencial. Resultado da inversão:
sample-bucket-02/5421000613151.log sample-bucket-02/2271000613151.log sample-bucket-02/6381000613151.log sample-bucket-02/6591000613151.log ... sample-bucket-02/3512000613151.log sample-bucket-02/6552000613151.log sample-bucket-02/9582000613151.log ...Os três primeiros dígitos representam milissegundos (1.000 valores possíveis), o quarto muda a cada segundo, e o quinto, a cada 10 segundos. A inversão aumenta significativamente a aleatoriedade do prefixo, distribuindo a carga de forma uniforme e evitando gargalos.
Reduza requisições para grandes volumes de arquivos pequenos
Ao fazer upload de grandes volumes de arquivos pequenos, compacte-os em um arquivo ZIP, TAR ou Parquet para mesclar várias requisições em uma única. Por exemplo, compactar 100 arquivos de 1 KB cada em um único arquivo ZIP reduz 100 requisições PUT para apenas 1.
Para listar grandes volumes de objetos, use o Bucket Inventory em vez do **ListObjects** para gerar uma lista de objetos no formato CSV ou Parquet. Para mais informações, consulte Bucket inventory.
Use a busca por intervalo de bytes
Ao baixar arquivos grandes (acima de 100 MB) do OSS, uma rede instável pode interromper a transferência. Use uma requisição HTTP Range para buscar partes específicas de um arquivo:
Get /ObjectName HTTP/1.1
Host:examplebucket.oss-cn-hangzhou.aliyuncs.com
Date:Fri, 19 Jul 2024 17:27:45 GMT
Authorization:SignatureValue
Range:bytes=[$ByteRange]
O cabeçalho Range especifica um intervalo de bytes de 0 a content-length - 1. How to obtain OSS resources in segments using HTTP Range requests.
Use o OSS Transfer Acceleration
O Transfer Acceleration acelera transferências de dados de longa distância para arquivos de grande porte (gigabytes ou terabytes) ou requisições entre a China continental e outras regiões. O serviço roteia as requisições para o ponto de acesso mais próximo usando roteamento inteligente, proporcionando aceleração de ponta a ponta. Access OSS using Transfer Acceleration.
Armazene em cache o conteúdo acessado com frequência
O Alibaba Cloud CDN armazena conteúdo estático em cache nos pontos de presença (POPs) em todo o mundo. Os usuários obtêm o conteúdo do POP mais próximo, melhorando a velocidade de acesso e reduzindo a carga na origem.
Quando um arquivo requisitado não é encontrado ou está expirado em um POP, o CDN o busca no bucket do OSS de origem e o armazena em cache. Quando o conteúdo da origem muda, o CDN atualiza automaticamente os caches dos POPs.
Isso é especialmente útil para empresas com uma base de usuários global. Accelerate access to OSS using CDN.
Use a versão mais recente do SDK do OSS
A versão mais recente do SDK do Alibaba Cloud OSS inclui otimizações de desempenho integradas:
Novos recursos: inclui as APIs mais recentes, algoritmos otimizados e codecs mais eficientes.
Tratamento de erros e tentativas: lida automaticamente com erros comuns (como HTTP 503) para reduzir falhas e aumentar as taxas de sucesso.
Gerenciamento de transferência: dimensiona conexões automaticamente e usa requisições de intervalo para alcançar alto throughput.
Suporte a multithreading: processa várias requisições em paralelo para aumentar a velocidade de processamento de dados.
Gerenciamento de memória otimizado: reduz a sobrecarga desnecessária de memória e melhora a eficiência de uso.
Compatibilidade aprimorada: corrige problemas legados e melhora a compatibilidade com bibliotecas de terceiros e sistemas operacionais.
Baixe o SDK mais recente em SDK overview.
Use o OSS e o ECS na mesma região
Implante instâncias do ECS e buckets do OSS na mesma região para reduzir a latência de transferência de dados e melhorar a velocidade de leitura. A comunicação dentro da mesma região usa endpoints internos e não gera taxas de tráfego, permitindo transferências de dados em grande escala sem custos de largura de banda. Access OSS resources from an ECS instance over an internal network.
Implemente tentativas por tempo limite para aplicativos sensíveis à latência
O OSS limita o QPS para APIs de gerenciamento (GetService, PutBucket, GetBucketLifecycle, etc.). Taxas altas de requisições podem acionar respostas de lentidão (HTTP 503). Se isso ocorrer, aguarde alguns segundos e tente novamente.
O QPS total para uma única conta do Alibaba Cloud é de 10.000. Para solicitar um limite maior, entre em contato com o Suporte Técnico. Mesmo abaixo desse limite, o servidor pode limitar a taxa e retornar erros 503 se as requisições se concentrarem em uma única partição e excederem sua capacidade. Ao aleatorizar os prefixos das suas requisições (consulte OSS performance and extensibility best practices), o OSS dimensiona as partições automaticamente para suportar um QPS maior. Basta aguardar e tentar novamente.
Para requisições grandes (acima de 128 MB), meça o throughput e repita a operação para os 5% mais lentos. Para requisições pequenas (abaixo de 512 KB) com latência típica na casa das dezenas de milissegundos, repita as operações GET ou PUT após 2 segundos. Use backoff exponencial para tentativas subsequentes (por exemplo, 2 segundos e, em seguida, 4 segundos).
Para requisições de tamanho fixo com tempos de resposta consistentes, identifique e repita a operação para o 1% mais lento. Uma única tentativa costuma reduzir a latência de forma eficaz.
Alcance alto throughput com dimensionamento horizontal e requisições paralelas
O OSS é um sistema distribuído de grande escala. Dimensione horizontalmente as requisições paralelas para distribuir a carga por vários caminhos de rede.
Faça upload e baixe de dados em paralelo em várias threads ou instâncias. A estratégia ideal de dimensionamento depende do seu aplicativo e da estrutura dos objetos.
Comece com uma única requisição para medir a largura de banda e o uso de recursos e, em seguida, determine o número máximo de requisições simultâneas. Por exemplo, se uma requisição usa 10% da CPU, é possível executar até 10 requisições simultâneas.
Dimensione horizontalmente as conexões de armazenamento
Trate o OSS como um sistema distribuído, e não como um único endpoint. Envie várias requisições simultâneas por diferentes conexões para maximizar a largura de banda disponível. O OSS não limita o número de conexões para um bucket.
Para fazer upload de grandes lotes de arquivos pequenos, use o ossutil com o parâmetro de simultaneidade -j 100~500, combinado com a estratégia de tentativas com backoff exponencial do SDK do OSS para lidar com limitações de taxa.
Aumente o número de tentativas
Se uma requisição estiver lenta, tente novamente. Configure os valores de tempo limite e de tentativas no SDK do OSS com base nos requisitos de tolerância a falhas do seu aplicativo.