Usa gRPC con la biblioteca cliente de Java

El cliente de Java para el modo Datastore ofrece gRPC como opción de capa de transporte. El uso de la agrupación de conexiones de gRPC permite distribuir RPCs en varias conexiones, lo que puede mejorar el rendimiento.

Antes de comenzar

Instala la versión más reciente de la biblioteca google-cloud-datastore.

Cómo habilitar el comportamiento de transporte de gRPC

Para habilitar el comportamiento de transporte de gRPC, agrega setTransportOptions a la instancia del cliente:

Java
DatastoreOptions datastoreOptions =
       DatastoreOptions.newBuilder()
               .setProjectId("my-project")
               .setDatabaseId("my-database")
               .setTransportOptions(GrpcTransportOptions.newBuilder().build())
               .build();

Si configuras las opciones de transporte de forma explícita en GrpcTransportOptions, el cliente usará gRPC en lugar de HTTP cuando realice llamadas al servidor.

Desactiva el comportamiento del transporte de gRPC

Puedes desactivar el comportamiento de transporte de gRPC si revierte al comportamiento de transporte de HTTP. Para ello, quita la línea de código .setTransportOptions o reemplaza GrpcTransportOptions por HttpTransportOptions. También debes volver a compilar y reiniciar tu aplicación.

Java
// Use this code to deactivate the gRPC transport behavior
// by reverting to the HTTP transport behavior.
DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder()
            .setProjectId("my-project")
            .setDatabaseId("my-database")
            .build();

// You can also use this code to revert to the HTTP transport behavior
DatastoreOptions datastoreOptions =
            DatastoreOptions.newBuilder()
                    .setProjectId("my-project")
                    .setDatabaseId("my-database")
                    .setTransportOptions(HttpTransportOptions.newBuilder()
                            .setConnectTimeout(1000)
                            .build())
                    .build();

Verifica las opciones de transporte

Para verificar qué tipo de TransportOptions usa el cliente, examina el tipo de opciones de transporte:

Java
// Compares datastore transport options type

boolean isGRPC = datastore.getOptions().getTransportOptions() instanceof GrpcTransportOptions;

boolean isHTTP = datastore.getOptions().getTransportOptions() instanceof HTTPTransportOptions;

Configuración del grupo de conexiones

Un grupo de conexiones, también conocido como grupo de canales, es una caché de conexiones de bases de datos que el cliente comparte y reutiliza para mejorar la latencia y el rendimiento de las conexiones. Para mejorar el rendimiento de tu aplicación, configura el grupo de conexiones.

En esta sección, se te ayuda a determinar el tamaño óptimo del grupo de conexiones y se muestra cómo configurarlo en la biblioteca cliente de Java.

Determina el mejor tamaño del grupo de conexiones

El tamaño predeterminado del grupo de conexiones es el adecuado para la mayoría de las aplicaciones y, en la mayoría de los casos, no es necesario cambiarlo. Sin embargo, es posible que desees cambiar el tamaño del grupo de conexiones debido a un alto rendimiento o a solicitudes almacenadas en búfer.

Lo ideal es dejar espacio para las fluctuaciones de tráfico; un grupo de conexiones tiene aproximadamente el doble de la cantidad de conexiones que se requiere para una saturación máxima. Debido a que una conexión puede manejar un máximo de 100 solicitudes simultáneas, te recomendamos que tengas entre 10 y 50 solicitudes pendientes por conexión. La capa de middleware aplica el límite de 100 transmisiones simultáneas por conexión de gRPC, y este límite no se puede configurar. Para calcular la cantidad óptima de conexiones en tu grupo de conexiones, con una cantidad estimada de QPS por cliente y números de latencia promedio, haz lo siguiente:

Desde las métricas del cliente, recopila la siguiente información y realiza los siguientes cálculos:

  1. Determina la cantidad máxima de consultas por segundo (QPS) por cliente cuando tu aplicación ejecuta una carga de trabajo.
  2. Determina la latencia promedio (el tiempo de respuesta de una sola solicitud) en ms.
  3. Determina la cantidad de solicitudes que puedes enviar en serie por segundo: divide 1,000 por el valor de latencia promedio.
  4. Divide las QPS en segundos por la cantidad de solicitudes en serie por segundo.
  5. Divide el resultado por 50 solicitudes por canal para determinar el tamaño mínimo de grupo de conexiones óptimo. (Si el cálculo es menor que 2, usa al menos 2 canales de todos modos para garantizar la redundancia).
  6. Divide el mismo resultado por 10 solicitudes por canal para determinar el tamaño máximo óptimo del grupo de conexiones.

Para realizar estos pasos, usa las siguientes ecuaciones:

(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 50 streams = Minimum optimal number of
connections

(QPS sec ÷ (1,000 ÷ latency ms)) ÷ 10 streams = Maximum optimal number of
connections

Por ejemplo, si tu aplicación suele enviar 50,000 solicitudes por segundo y la latencia promedio es de 10 ms, divide 1,000 por 10 ms para determinar que puedes enviar 100 solicitudes en serie por segundo. Divide ese número en 50,000 para obtener el paralelismo necesario a fin de enviar 50,000 QPS: 500.

Cada canal puede tener un máximo de 100 solicitudes simultáneas, y el uso de tu canal objetivo está entre 10 y 50 transmisiones simultáneas. Por lo tanto, para calcular el tamaño mínimo del grupo de conexiones, divide 500 entre 50 para obtener 10. Para encontrar el tamaño máximo del grupo de conexiones, divide 500 entre 10 para obtener 50.

Esto significa que el tamaño de tu grupo de conexiones para este ejemplo está entre 10 y 50 conexiones. También es importante supervisar tu tráfico después de realizar estos cambios y ajustar la cantidad de conexiones en tu grupo, según sea necesario.

Configura el tamaño del grupo

En la siguiente muestra de código, se indica cómo configurar el grupo de conexiones en las bibliotecas cliente con DatastoreOptions.

Java
InstantiatingGrpcChannelProvider channelProvider =
        DatastoreSettings.defaultGrpcTransportProviderBuilder()
                .setChannelPoolSettings(
                       ChannelPoolSettings.builder()
                                .setInitialChannelCount(MIN_VAL)
                                .setMaxChannelCount(MAX_VAL)
                                .build())
                .build();

DatastoreOptions options = DatastoreOptions.newBuilder()
         .setProjectId("my-project")
         .setChannelProvider(channelProvider)
         .setTransportOptions(GrpcTransportOptions.newBuilder().build())
         .build();

¿Qué sigue?

Para obtener más información sobre los grupos de conexiones y las prácticas recomendadas para el rendimiento, consulta los siguientes recursos: