Resolución de problemas de java.util.concurrent.TimeoutException - Amazon Neptune

Resolución de problemas de java.util.concurrent.TimeoutException

El cliente Gremlin de Java emite una java.util.concurrent.TimeoutException cuando se agota el tiempo de espera de una solicitud de Gremlin en el propio cliente mientras espera a que esté disponible un espacio en una de las conexiones de WebSocket. Este tiempo de espera se controla mediante el parámetro configurable del lado del cliente maxWaitForConnection.

nota

Como las solicitudes cuyo tiempo de espera se agota en el cliente nunca se envían al servidor, no se reflejan en ninguna de las métricas recopiladas en el servidor, por ejemplo GremlinRequestsPerSec.

Este tipo de tiempo de espera se produce generalmente de una de estas dos formas:

  • El servidor ha alcanzado su capacidad máxima. Si es así, la cola del servidor se llena, lo que se puede detectar monitorizando la métrica de CloudWatch MainRequestQueuePendingRequests. La cantidad de consultas paralelas que el servidor puede gestionar depende del tamaño de la instancia.

    Si la métrica MainRequestQueuePendingRequests no muestra una acumulación de solicitudes pendientes en el servidor, el servidor puede gestionar más solicitudes y el tiempo de espera se debe a una limitación del lado del cliente.

  • Limitación de las solicitudes por parte del cliente. Por lo general, esto se puede solucionar cambiando los ajustes de la configuración del cliente.

    El número máximo de solicitudes paralelas que puede enviar el cliente se puede calcular de manera aproximada de la siguiente forma:

    maxParallelQueries = maxConnectionPoolSize * Max( maxSimultaneousUsagePerConnection, maxInProcessPerConnection )

    Si se envía al cliente una cantidad superior a la especificada en maxParallelQueries, se producen excepciones java.util.concurrent.TimeoutException. Por lo general, hay varias maneras de solucionar esto:

    • Aumente la duración del tiempo de espera de la conexión. Si la latencia no es crucial para su aplicación, aumente la configuración de maxWaitForConnection del cliente. Por tanto, el cliente espera más antes de agotar el tiempo de espera, lo que a su vez puede aumentar la latencia.

    • Aumente el número máximo de solicitudes por conexión. Esto permite enviar más solicitudes utilizando la misma conexión de WebSocket. Para ello, aumente los ajustes de maxSimultaneousUsagePerConnection y maxInProcessPerConnection del cliente. Por lo general, estos ajustes deben tener el mismo valor.

    • Aumente el número de conexiones en el grupo de conexiones. Para ello, aumente el ajuste de maxConnectionPoolSize del cliente. El costo se incrementa debido a un mayor consumo de recursos, ya que cada conexión usa memoria y un descriptor de archivos del sistema operativo, y requiere un protocolo de enlace SSL y WebSocket durante la inicialización.