Otimizar o desempenho da escrita no Azure Cosmos DB for MongoDB
APLICA-SE A: MongoDB
A otimização do desempenho de gravação ajuda você a aproveitar ao máximo o Azure Cosmos DB para a escala ilimitada do MongoDB. Ao contrário de outros serviços gerenciados do MongoDB, a API para MongoDB fragmenta suas coleções de forma automática e transparente para que você (ao usar coleções fragmentadas) seja dimensionado infinitamente.
A maneira como você escreve dados precisa estar ciente disso, paralelizando e espalhando dados entre fragmentos para obter o máximo de gravações de seus bancos de dados e coleções. Este artigo explica as práticas recomendadas para otimizar o desempenho de gravação.
Espalhe a carga pelos estilhaços
Ao gravar dados em uma API fragmentada para a coleção do MongoDB, seus dados são divididos (fragmentados) em fatias minúsculas e gravados em cada fragmento com base no valor do campo de chave de estilhaço. Você pode pensar em cada fatia como uma pequena parte de uma máquina virtual que armazena apenas os documentos que contêm um valor de chave de estilhaço exclusivo.
Se seu aplicativo gravar uma grande quantidade de dados em um único fragmento, isso não será eficiente porque o aplicativo estaria maximizando a taxa de transferência de apenas um fragmento em vez de distribuir a carga por todos os fragmentos. Sua carga de gravação será distribuída uniformemente por toda a sua coleção, escrevendo em paralelo a muitos documentos com valores de chave de estilhaços exclusivos.
Um exemplo de fazer isso seria um aplicativo de catálogo de produtos que é fragmentado no campo de categoria. Em vez de escrever em uma categoria (fragmento) de cada vez, é melhor gravar em todas as categorias simultaneamente para atingir a taxa de transferência máxima de gravação.
Reduzir o número de índices
A indexação é um ótimo recurso para reduzir drasticamente o tempo necessário para consultar seus dados. Para a experiência de consulta mais flexível, a API para MongoDB permite um índice curinga em seus dados por padrão para fazer consultas em todos os campos extremamente rápidas. No entanto, todos os índices, que incluem índices curinga, introduzem carga adicional ao gravar dados porque as gravações alteram a coleção e os índices.
Reduzir o número de índices para apenas os índices necessários para suportar as suas consultas tornará as suas gravações mais rápidas e baratas. Como regra geral, recomendamos o seguinte:
- Qualquer campo que você filtrar deve ter um índice de campo único correspondente para ele. Esta opção também permite a filtragem de vários campos.
- Qualquer grupo de campos que você classificar deve ter um índice composto para esse grupo.
Definir ordenado como falso nos drivers MongoDB
Por padrão, os drivers do MongoDB definem a opção ordenada como "true" ao gravar dados, que grava cada documento em ordem, um a um. Essa opção reduz o desempenho de gravação, uma vez que cada solicitação de gravação tem que aguardar a conclusão da anterior. Ao gravar dados, defina essa opção como false para melhorar o desempenho.
db.collection.insertMany(
[ <doc1> , <doc2>, ... ],
{
ordered: false
}
)
Ajuste para o tamanho de lote ideal e a contagem de threads
A paralelização de operações de gravação em muitos threads/processos é fundamental para dimensionar gravações. A API para MongoDB aceita gravações em lotes de até 1.000 documentos para cada processo/thread.
Se você estiver escrevendo mais de 1.000 documentos ao mesmo tempo por processo/thread, as funções do cliente devem insertMany()
ser limitadas a cerca de 1.000 documentos. Caso contrário, o cliente aguardará a confirmação de cada lote antes de passar para o próximo lote. Em alguns casos, dividir os lotes com menos ou pouco mais de 1.000 documentos será mais rápido.
Próximos passos
- Saiba mais sobre indexação na API para MongoDB.
- Saiba mais sobre a fragmentação/particionamento do Azure Cosmos DB.
- Saiba mais sobre como solucionar problemas comuns.
- Tentando fazer o planejamento de capacidade para uma migração para o Azure Cosmos DB? Você pode usar informações sobre seu cluster de banco de dados existente para planejamento de capacidade.
- Se tudo o que você sabe é o número de vcores e servidores em seu cluster de banco de dados existente, leia sobre como estimar unidades de solicitação usando vCores ou vCPUs
- Se você souber as taxas de solicitação típicas para sua carga de trabalho de banco de dados atual, leia sobre como estimar unidades de solicitação usando o planejador de capacidade do Azure Cosmos DB