Resolva problemas de latência na biblioteca cliente Java

Introdução

Se a sua app tiver uma latência superior à habitual, um débito fraco ou tempos limite com o cliente Java Datastore, o problema pode ter origem na configuração gRPC do lado do cliente e não no back-end do Firestore/Datastore. Este guia ajuda a diagnosticar e resolver problemas comuns de limitação do lado do cliente, definições incorretas do conjunto de canais e rotatividade excessiva de canais.

Diagnóstico

Quando usar clientes Java, a ativação do registo detalhado do gRPC e do gax-java é fundamental para monitorizar a dinâmica do conjunto de canais, diagnosticar a limitação, os problemas de reutilização de ligações ou identificar a rotatividade excessiva de canais.

Ative o registo para clientes Java

Para ativar o registo detalhado, modifique o ficheiro logging.properties da seguinte forma:

## This tracks the lifecycle events of each grpc channel 
io.grpc.ChannelLogger.level=FINEST
## Tracks channel pool events(resizing, shrinking) from GAX level
com.google.api.gax.grpc.ChannelPool.level=FINEST

Além disso, atualize o nível de registo de saída em logging.properties para capturar estes registos:


# This could be changed to a file or other log output
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter

Aplique a configuração

logging.properties pode ser aplicado através de um de dois métodos:

1. Através de uma propriedade do sistema JVM

Adicione este argumento ao iniciar a aplicação Java:

-Djava.util.logging.config.file=/path/to/logging.properties

2. Carregue de forma programática

Este método é útil para testes de integração ou aplicações em que a configuração de registo é gerida no código. Certifique-se de que este código é executado no início do ciclo de vida da aplicação.

LogManager logManager = LogManager.getLogManager();
  try (final InputStream is = Main.class.getResourceAsStream("/logging.properties")) {
logManager.readConfiguration(is);
}

Exemplo de registo

Depois de ativar o registo detalhado, vê uma combinação de mensagens de com.google.api.gax.grpc.ChannelPool e io.grpc.ChannelLogger:

Canais com aprovisionamento insuficiente que acionaram a expansão do conjunto de canais:

09:15:30.123 [pool-1-thread-1] DEBUG com.google.api.gax.grpc.ChannelPool - Detected throughput peak of 40, expanding channel pool size: 4 -> 6. 
09:15:30.124 [grpc-nio-worker-ELG-1-5] DEBUG io.grpc.ChannelLogger - [Channel<5>: (datastore.googleapis.com:443)] Entering IDLE state 
09:15:30.124 [grpc-nio-worker-ELG-1-5] DEBUG io.grpc.ChannelLogger - [Channel<6>: (datastore.googleapis.com:443)] Entering IDLE state 
09:15:30.125 [grpc-nio-worker-ELG-1-5] TRACE io.grpc.ChannelLogger - [Channel<5>: (datastore.googleapis.com:443)] newCall() called 
09:15:30.126 [grpc-nio-worker-ELG-1-5] DEBUG io.grpc.ChannelLogger -