Résolution des problèmes de java.util.concurrent.TimeoutException - Amazon Neptune

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Résolution des problèmes de java.util.concurrent.TimeoutException

Le client Java Gremlin envoie au client lui-même un message indiquant java.util.concurrent.TimeoutException quand une requête Gremlin expire en attendant qu'un emplacement soit disponible dans l'une des WebSocket connexions. Ce délai d'expiration est contrôlé par le paramètre configurable maxWaitForConnection côté client.

Note

Comme les demandes qui expirent sur le client ne sont jamais envoyées au serveur, elles ne sont reflétées dans aucune des métriques capturées sur le serveur, telles que GremlinRequestsPerSec.

Ce type de délai d'expiration est généralement causé de l'une des deux manières suivantes :

  • Le serveur a atteint sa capacité maximale. Dans ce cas, la file d'attente du serveur se remplit, ce que vous pouvez détecter en surveillant la MainRequestQueuePendingRequests CloudWatch métrique. Le nombre de requêtes parallèles que le serveur peut traiter dépend de la taille de son instance.

    Si la métrique MainRequestQueuePendingRequests n'indique pas une accumulation des demandes en attente sur le serveur, le serveur peut traiter un plus grand nombre de demandes, et l'expiration est donc due à une limitation côté client.

  • Limitation des demandes côté client. Ce problème peut généralement être résolu en modifiant les paramètres de configuration du client.

    Le nombre maximal de demandes parallèles que le client peut envoyer peut être estimé approximativement comme suit :

    maxParallelQueries = maxConnectionPoolSize * Max( maxSimultaneousUsagePerConnection, maxInProcessPerConnection )

    L'envoi d'un nombre de demandes supérieur à maxParallelQueries au client entraîne des exceptions java.util.concurrent.TimeoutException. Vous pouvez généralement résoudre ce problème de plusieurs manières :

    • Augmentez le délai d'expiration de la connexion. Si la latence n'est pas cruciale pour votre application, augmentez la valeur du paramètre maxWaitForConnection du client. Le client attendra plus longtemps avant l'expiration du délai, ce qui contribue à accroître la latence.

    • Augmentez le nombre maximum de demandes par connexion. Cela permet d'envoyer un plus grand nombre de demandes via la même WebSocket connexion. Pour ce faire, augmentez la valeur des paramètres maxSimultaneousUsagePerConnection et maxInProcessPerConnection du client. Ces paramètres doivent généralement avoir la même valeur.

    • Augmentez le nombre de connexions dans le groupe de connexions. Pour ce faire, augmentez la valeur du paramètre maxConnectionPoolSize du client. Le coût est une augmentation de la consommation de ressources, car chaque connexion utilise de la mémoire et un descripteur de fichier du système d'exploitation, et nécessite une SSL poignée de main lors de l'initialisation. WebSocket