Práticas recomendadas para o SDK Java do Azure Cosmos DB
APLICA-SE A: NoSQL
Este artigo apresenta as práticas recomendadas para usar o SDK Java do Azure Cosmos DB. Seguir essas práticas ajudará a melhorar sua latência, disponibilidade e aumentar o desempenho geral.
Lista de Verificação
Selecionado | Tópico | Detalhes/Links |
---|---|---|
Versão do SDK | Sempre usando a versão mais recente do SDK do Azure Cosmos DB disponível para um desempenho ideal. | |
Cliente Singleton | Use uma única instância do CosmosClient durante o tempo de vida do seu aplicativo para obter um melhor desempenho. |
|
Regiões | Certifique-se de executar seu aplicativo na mesma região do Azure que sua conta do Azure Cosmos DB, sempre que possível para reduzir a latência. Habilite de 2 a 4 regiões e replique suas contas em várias regiões para obter a melhor disponibilidade. Para cargas de trabalho de produção, habilite o failover gerenciado pelo serviço. Na ausência dessa configuração, a conta sofrerá perda de disponibilidade de gravação durante toda a duração da interrupção da região de gravação, pois o failover manual não terá êxito devido à falta de conectividade da região. Para saber como adicionar várias regiões usando o Java SDK , visite aqui | |
Disponibilidade e failovers | Defina as preferredRegions no SDK v4. Durante os failovers, as operações de gravação são enviadas para a região de gravação atual e todas as leituras são enviadas para a primeira região da sua lista de regiões preferidas. Para obter mais informações sobre a mecânica de failover regional, consulte o guia de solução de problemas de disponibilidade. | |
CPU | Você pode ter problemas de conectividade/disponibilidade devido à falta de recursos na máquina cliente. Monitore a utilização da CPU em nós que executam o cliente do Azure Cosmos DB e aumente ou diminua a escala se o uso for muito alto. | |
Alojamento | Para os casos mais comuns de cargas de trabalho de produção, é altamente recomendável usar pelo menos VMs de memória de 4 núcleos e 8 GB sempre que possível. | |
Modos de conectividade | Use o modo Direto para obter o melhor desempenho. Para obter instruções sobre como fazer isso, consulte a documentação do SDK V4. | |
Rede | Se estiver usando uma máquina virtual para executar seu aplicativo, habilite a Rede Acelerada em sua VM para ajudar com gargalos devido ao alto tráfego e reduzir a latência ou o desvio da CPU. Você também pode considerar o uso de uma máquina virtual mais avançada onde o uso máximo da CPU é inferior a 70%. | |
Exaustão Efémera do Porto | Para conexões esparsas ou esporádicas, recomendamos definir o idleEndpointTimeout para um valor mais alto. A idleEndpointTimeout propriedade em DirectConnectionConfig ajuda que controlar o tempo que as conexões não utilizadas são fechadas. Isso reduzirá o número de conexões não utilizadas. Por padrão, as conexões ociosas com um ponto de extremidade são mantidas abertas por 1 hora. Se não houver solicitações para um ponto de extremidade específico para a duração do tempo limite do ponto de extremidade ocioso, o cliente direto fechará todas as conexões com esse ponto de extremidade para economizar recursos e custo de E/S. |
|
Use o Agendador Apropriado (Evite roubar threads do Event loop IO Netty) | Evite bloquear chamadas: .block() . Toda a pilha de chamadas é assíncrona para se beneficiar de padrões de API assíncronos e do uso de threading e agendadores apropriados |
|
Tempos limite de ponta a ponta | Para obter tempos limite de ponta a ponta, implemente a política de tempo limite de ponta a ponta no Java SDK. Para obter mais detalhes sobre tempos limite com o Azure Cosmos DB , visite aqui | |
Repetir a Lógica | Um erro transitório é um erro que tem uma causa subjacente que logo se resolve. As aplicações que se ligam à base de dados devem ser criadas para esperar estes erros transitórios. Para manipulá-los, implemente a lógica de repetição em seu código em vez de apresentá-los aos usuários como erros de aplicativo. O SDK tem lógica interna para lidar com essas falhas transitórias em solicitações que podem ser repetidas, como operações de leitura ou consulta. O SDK não tentará novamente em gravações para falhas transitórias, pois as gravações não são idempotentes. O SDK permite que os usuários configurem a lógica de repetição para limitações. Para obter detalhes sobre quais erros repetir em visite aqui | |
Armazenamento em cache de nomes de banco de dados/coleção | Recupere os nomes de seus bancos de dados e contêineres da configuração ou armazene-os em cache na inicialização. Chamadas como CosmosAsyncDatabase#read() ou CosmosAsyncContainer#read() resultarão em chamadas de metadados para o serviço, que consomem a partir do limite de RU reservado pelo sistema. createDatabaseIfNotExists() também só deve ser usado uma vez para configurar o banco de dados. De um modo geral, estas operações devem ser realizadas com pouca frequência. |
|
Consultas paralelas | O SDK do Azure Cosmos DB dá suporte à execução de consultas em paralelo para melhor latência e taxa de transferência em suas consultas. Recomendamos definir a maxDegreeOfParallelism propriedade dentro do CosmosQueryRequestsOptions para o número de partições que você tem. Se você não estiver ciente do número de partições, defina o valor para -1 que lhe dará a melhor latência. Além disso, defina o maxBufferedItemCount número esperado de resultados retornados para limitar o número de resultados pré-buscados. |
|
Backoffs de testes de desempenho | Ao executar testes em seu aplicativo, você deve implementar backoffs em RetryAfter intervalos. Respeitar o backoff ajuda a garantir que você gastará uma quantidade mínima de tempo esperando entre as tentativas. |
|
Indexação | A política de indexação do Azure Cosmos DB também permite especificar quais caminhos de documento devem ser incluídos ou excluídos da indexação usando caminhos IndexingPolicy#getIncludedPaths() de indexação e IndexingPolicy#getExcludedPaths() . Certifique-se de excluir caminhos não utilizados da indexação para gravações mais rápidas. Para obter um exemplo sobre como criar índices usando o SDK , visite aqui |
|
Tamanho do documento | A cobrança de solicitação de uma operação especificada está diretamente correlacionada ao tamanho do documento. Recomendamos reduzir o tamanho de seus documentos, pois as operações em documentos grandes custam mais do que as operações em documentos menores. | |
Tamanho da Página | Por padrão, os resultados da consulta são retornados em blocos de 100 itens ou 4 MB, o limite atingido primeiro. Se uma consulta retornar mais de 100 itens, aumente o tamanho da página para reduzir o número de viagens de ida e volta necessárias. O consumo de memória aumentará à medida que o tamanho da página aumentar. | |
Habilitando métricas de consulta | Para registro adicional de suas execuções de consulta de back-end, siga as instruções sobre como capturar métricas de consulta SQL usando Java SDK | |
Registro em log do SDK | Use o log do SDK para capturar informações adicionais de diagnóstico e solucionar problemas de latência. Registre o CosmosDiagnostics no Java SDK para obter informações de diagnóstico mais detalhadas do Azure Cosmos DB para a solicitação atual ao serviço. Como exemplo de caso de uso, capture Diagnósticos em qualquer exceção e em operações concluídas se o CosmosDiagnostics#getDuration() for maior que um valor limite designado (ou seja, se você tiver um SLA de 10 segundos, capture diagnósticos quando getDuration() > 10 segundos). É aconselhável usar esses diagnósticos apenas durante os testes de desempenho. Para obter mais informações, siga o diagnóstico de captura no Java SDK |
|
Evite usar caracteres especiais em identificadores | Alguns caracteres são restritos e não podem ser usados em alguns identificadores: '/', '\', '?', '#'. A recomendação geral é não usar caracteres especiais em identificadores como nome do banco de dados, nome da coleção, ID do item ou chave de partição para evitar qualquer comportamento inesperado. |
Práticas recomendadas ao usar o modo Gateway
As solicitações do Azure Cosmos DB são feitas por HTTPS/REST quando você usa o modo Gateway. Eles estão sujeitos ao limite de conexão padrão por nome de host ou endereço IP. Talvez seja necessário ajustar maxConnectionPoolSize para um valor diferente (de 100 a 1.000) para que a biblioteca de cliente possa usar várias conexões simultâneas com o Azure Cosmos DB. No Java v4 SDK, o valor padrão para GatewayConnectionConfig#maxConnectionPoolSize
é 1000. Para alterar o valor, você pode definir GatewayConnectionConfig#maxConnectionPoolSize
como um valor diferente.
Práticas recomendadas para cargas de trabalho com muita gravação
Para cargas de trabalho com cargas úteis de criação pesadas, defina a CosmosClientBuilder#contentResponseOnWriteEnabled()
opção de solicitação como false
. O serviço não retornará mais o recurso criado ou atualizado para o SDK. Normalmente, como o aplicativo tem o objeto que está sendo criado, ele não precisa do serviço para retorná-lo. Os valores de cabeçalho ainda estão acessíveis, como uma taxa de solicitação. Desabilitar a resposta de conteúdo pode ajudar a melhorar o desempenho, porque o SDK não precisa mais alocar memória ou serializar o corpo da resposta. Ele também reduz o uso da largura de banda da rede para ajudar ainda mais o desempenho.
Próximos passos
Para saber mais sobre dicas de desempenho para Java SDK, consulte Dicas de desempenho para o Azure Cosmos DB Java SDK v4.
Para saber mais sobre como projetar seu aplicativo para dimensionamento e alto desempenho, consulte Particionamento e dimensionamento no Azure Cosmos DB.
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