Melhore a velocidade de processamento de dados do OSS, reduza a latência e acelere as respostas das aplicações aproveitando a arquitetura distribuída do Alibaba Cloud OSS.
Altere prefixos sequenciais para prefixos aleatórios
O OSS particiona dados com base na ordem UTF-8 das chaves de objeto para suportar alta concorrência de solicitações. Prefixos sequenciais (timestamps ou strings ordenadas lexicograficamente) concentram arquivos em poucas partições, sobrecarregando-as. Use prefixos aleatórios para distribuir a carga de forma uniforme.
Quando a taxa de solicitações excede 2.000 solicitações por segundo, os seguintes problemas podem ocorrer. Cada download, upload, exclusão, cópia ou recuperação de metadados conta como uma operação. Uma exclusão em lote ou listagem de N arquivos conta como N operações.
-
Formação de hot spots em partições: solicitações de alta frequência se concentram em partições específicas, esgotando a capacidade de I/O ou acionando o throttling automático.
-
Taxa de solicitações limitada: hot spots em partições acionam rebalanceamento contínuo de dados, o que aumenta o tempo de processamento das solicitações.
nullO rebalanceamento se baseia na análise em tempo real do status do sistema e da capacidade de processamento, não em regras fixas de sharding. Arquivos com prefixos sequenciais podem permanecer em uma partição com hot spot após o rebalanceamento.
Para resolver esses problemas, altere o prefixo sequencial para um aleatório. Isso distribui o índice de objetos e a carga de I/O de forma uniforme entre as partições.
-
Adicione um prefixo hash hexadecimal à chave do objeto
Se você usa datas e IDs de cliente para gerar chaves de objeto, elas contêm um prefixo sequencial de timestamp:
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 de objeto. Com um prefixo 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 oferece 164 (65.536) combinações possíveis, permitindo até 65.536 partições. Avalie se esse número é suficiente com base na sua taxa de solicitaçõ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 19/07/2024 no `sample-bucket-01`), liste todos os objetos no bucket chamando a API ListObject em lotes e depois mescle os resultados correspondentes à data desejada.
-
Inverta a chave de objeto
Um timestamp UNIX com precisão de milissegundos como chave de objeto também é 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 timestamp para evitar a ordenação sequencial. O resultado invertido:
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.
Use 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 solicitaçã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 entre 0 e content-length - 1. Como obter recursos do OSS em segmentos usando solicitações HTTP Range.
Use o Transfer Acceleration do OSS
O Transfer Acceleration acelera transferências de dados em longas distâncias para arquivos na escala de gigabytes ou terabytes, ou solicitações entre regiões do continente chinês e outras regiões. As solicitações são roteadas para o ponto de acesso mais próximo por meio de roteamento inteligente, proporcionando aceleração de ponta a ponta. Acesse o OSS usando o Transfer Acceleration.
Armazene em cache o conteúdo acessado com frequência
O Alibaba Cloud CDN armazena em cache conteúdo estático em pontos de presença (POPs) ao redor do mundo. Os usuários buscam conteúdo do POP mais próximo, o que melhora a velocidade de acesso e reduz a carga na origem.
Quando um arquivo solicitado está ausente ou expirado em um POP, o CDN busca o arquivo no bucket OSS de origem e o armazena em cache. Quando o conteúdo de origem muda, o CDN atualiza automaticamente os caches dos POPs.
Esse recurso é especialmente útil para empresas com base de usuários global. Acelere o acesso ao OSS usando o 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 retentativas: trata automaticamente erros comuns (como HTTP 503) para reduzir falhas e aumentar as taxas de sucesso.
-
Gerenciamento de transferências: escala conexões automaticamente e usa solicitações de intervalo para alcançar alto throughput.
-
Suporte a múltiplas threads: processa múltiplas solicitaçõ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 Visão geral do SDK.
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 na transferência de dados e melhorar a velocidade de leitura. A comunicação na mesma região usa endpoints internos e não gera custos de tráfego, permitindo transferências de dados em larga escala sem custos de largura de banda. Acesse recursos do OSS a partir de uma instância do ECS pela rede interna.
Implemente retentativas com timeout para aplicações sensíveis à latência
O OSS limita o QPS para APIs de gerenciamento (GetService, PutBucket, GetBucketLifecycle, etc.). Taxas de solicitação elevadas podem acionar respostas HTTP 503 de redução de velocidade. Se isso ocorrer, aguarde alguns segundos e tente novamente.
O QPS total para uma única conta Alibaba Cloud é de 10.000. Para solicitar um limite maior, entre em contato com Suporte Técnico. Mesmo abaixo desse limiar, o servidor pode aplicar throttling e retornar erros 503 se as solicitações se concentrarem em uma única partição e excederem sua capacidade. Ao utilizar prefixos aleatórios nas solicitações (consulte Práticas recomendadas de desempenho e extensibilidade do OSS), o OSS escala automaticamente as partições para suportar um QPS mais alto. Basta aguardar e tentar novamente.
Para solicitações grandes (acima de 128 MB), meça o throughput e tente novamente com os 5% mais lentos. Para solicitações pequenas (abaixo de 512 KB) com latência típica na casa de dezenas de milissegundos, tente novamente as operações GET ou PUT após 2 segundos. Use backoff exponencial para as retentativas subsequentes (por exemplo, 2 segundos, depois 4 segundos).
Para solicitações de tamanho fixo com tempos de resposta consistentes, identifique e repita as 1% mais lentas. Uma única retentativa geralmente reduz a latência de forma eficaz.
Alcance alto throughput com escalabilidade horizontal e solicitações paralelas
O OSS é um sistema distribuído de grande escala. Escale horizontalmente as solicitações paralelas para distribuir a carga entre múltiplos caminhos de rede.
Faça upload e download de dados em paralelo usando múltiplas threads ou instâncias. A estratégia ideal de escalabilidade depende da sua aplicação e da estrutura dos objetos.
Comece com uma única solicitação para medir a largura de banda e o uso de recursos, depois determine o número máximo de solicitações concorrentes. Por exemplo, se uma solicitação usa 10% da CPU, é possível suportar até 10 solicitações concorrentes.
Escale horizontalmente as conexões de armazenamento
Trate o OSS como um sistema distribuído, não como um endpoint único. Envie múltiplas solicitações concorrentes em diferentes conexões para maximizar a largura de banda disponível. O OSS não limita o número de conexões a um bucket.
Aumente o número de retentativas
Se uma solicitação estiver lenta, envie uma retentativa. Configure os valores de timeout e retentativa no SDK do OSS com base nos requisitos de tolerância a falhas da sua aplicação.