El cliente de Java para el modo Datastore ofrece gRPC como opción de capa de transporte. Si usas agrupación de conexiones gRPC, puedes distribuir las llamadas RPC en varias conexiones, lo que puede mejorar el rendimiento.
Antes de empezar
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, añade setTransportOptions
a la instanciación del cliente:
Java
DatastoreOptions datastoreOptions = DatastoreOptions.newBuilder() .setProjectId("my-project") .setDatabaseId("my-database") .setTransportOptions(GrpcTransportOptions.newBuilder().build()) .build();
Si se definen las opciones de transporte explícitamente como GrpcTransportOptions
, se configura el cliente para que use gRPC en lugar de HTTP al hacer llamadas al servidor.
Desactivar el comportamiento de transporte de gRPC
Puedes desactivar el comportamiento de transporte de gRPC volviendo al comportamiento de transporte de HTTP. Para ello, elimina la línea de código .setTransportOptions
o sustituye GrpcTransportOptions
por HttpTransportOptions
.
También debes volver a compilar y reiniciar la 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();
Verificar 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 explica cómo determinar el tamaño óptimo del grupo de conexiones y cómo configurarlo en la biblioteca de cliente de Java.
Determinar el tamaño óptimo del grupo de conexiones
El tamaño predeterminado del grupo de conexiones es adecuado para la mayoría de las aplicaciones y, en la mayoría de los casos, no es necesario cambiarlo. Sin embargo, puede que quieras cambiar el tamaño del grupo de conexiones debido a un alto rendimiento o a solicitudes almacenadas en búfer.
Lo ideal es que un grupo de conexiones tenga aproximadamente el doble de conexiones de las que necesita para alcanzar la saturación máxima, de modo que haya margen para las fluctuaciones del tráfico. Como una conexión puede gestionar 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 flujos simultáneos por conexión gRPC, y este límite no se puede configurar. Para calcular el número óptimo de conexiones de tu grupo de conexiones, utilizando una estimación de QPS por cliente y los números de latencia media, haz lo siguiente:
A partir de las métricas del lado del cliente, recoge la siguiente información y haz los cálculos que se indican a continuación:
- Determina el número máximo de consultas por segundo (CPS) por cliente cuando tu aplicación ejecute una carga de trabajo.
- Determina la latencia media (el tiempo de respuesta de una sola solicitud) en milisegundos.
- Para determinar el número de solicitudes que puedes enviar en serie por segundo,divide 1000 entre el valor de latencia medio.
- Divide las consultas por segundo entre el número de solicitudes en serie por segundo.
- Divide el resultado entre 50 solicitudes por canal para determinar el tamaño mínimo óptimo del grupo de conexiones. Si el resultado es inferior a 2, utiliza al menos 2 canales para asegurar la redundancia.
- Divide el mismo resultado entre 10 solicitudes por canal para determinar el tamaño óptimo máximo del grupo de conexiones.
Para llevar a cabo estos pasos, utiliza 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 media es de 10 ms, divide 1000 entre 10 ms para determinar que puedes enviar 100 solicitudes en serie por segundo. Divide ese número entre 50.000 para obtener el paralelismo necesario para enviar 50.000 QPS: 500.
Cada canal puede tener un máximo de 100 solicitudes simultáneas y la utilización del canal objetivo debe estar 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 calcular el tamaño máximo del grupo de conexiones, divide 500 entre 10 para obtener 50.
Esto significa que el tamaño del grupo de conexiones de este ejemplo está entre 10 y 50 conexiones. También es importante monitorizar el tráfico después de hacer estos cambios y ajustar el número de conexiones de tu grupo según sea necesario.
Establecer el tamaño de la piscina
En el siguiente ejemplo de código se muestra cómo configurar el grupo de conexiones en las bibliotecas de cliente mediante 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();
Siguientes pasos
Para obtener más información sobre los grupos de conexiones y las prácticas recomendadas para mejorar el rendimiento, consulta los siguientes artículos: