Elasticsearch en JavaScript dans les règles de l'art, partie II

Passer en revue les meilleures pratiques de production et expliquer comment exécuter le client Elasticsearch Node.js dans les environnements Serverless.

Passez à la pratique avec Elasticsearch : explorez nos notebooks d’exemples, lancez un essai gratuit sur le cloud ou testez Elastic dès maintenant sur votre machine locale.

Voici la deuxième partie de notre série Elasticsearch en JavaScript. Dans la première partie, nous avons appris à mettre en place notre environnement correctement, à configurer le client Node.js, à indexer les données et à effectuer des recherches. Dans cette deuxième partie, nous allons apprendre à mettre en œuvre les meilleures pratiques de production et à exécuter le client Elasticsearch Node.js dans des environnements Serverless.

Nous ferons le point :

Vous pouvez consulter le code source avec les exemples ici.

Meilleures pratiques de production

Gestion des erreurs

Une caractéristique utile du client Elasticsearch dans Node.js est qu'il expose des objets pour les erreurs possibles dans Elasticsearch afin que vous puissiez les valider et les traiter de différentes manières.

Pour les voir tous, cliquez ici : 

Revenons à l'exemple de la recherche et traitons certaines des erreurs possibles :

ResponseError en particulier, se produit lorsque la réponse est 4xx ou 5xx, ce qui signifie que la demande est incorrecte ou que le serveur n'est pas disponible.

Nous pouvons tester ce type d'erreur en générant des requêtes erronées, par exemple en essayant d'effectuer une recherche de terme sur un champ de type texte :

Erreur par défaut :

Erreur personnalisée :

Nous pouvons également capturer et traiter chaque type d'erreur d'une certaine manière. Par exemple, nous pouvons ajouter une logique de réessai dans un site TimeoutError.

Tests

Les tests sont essentiels pour garantir la stabilité de l'application. Pour tester le code d'une manière isolée d'Elasticsearch, nous pouvons utiliser la bibliothèque elasticsearch-js-mock lors de la création de notre cluster.

Cette bibliothèque nous permet d'instancier un client qui est très similaire au vrai client mais qui répondra à notre configuration en remplaçant seulement la couche HTTP du client par une couche fictive tout en gardant le reste identique à l'original.

Nous installerons la bibliothèque mocks et AVA pour les tests automatisés.

npm install @elastic/elasticsearch-mock

npm install --save-dev ava

Nous allons configurer le fichier package.json pour exécuter les tests. Veillez à ce qu'il en soit ainsi :

Créons maintenant un fichier test.js et installons notre client fictif :

Maintenant, ajoutez un simulacre de recherche sémantique :

Nous pouvons maintenant créer un test pour notre code, en nous assurant que la partie Elasticsearch renvoie toujours les mêmes résultats :

Exécutons les tests.

npm run test

C'est fait ! Désormais, nous pouvons tester notre application en nous concentrant à 100 % sur le code et non sur des facteurs externes.

Environnements sans serveur

Exécuter le client sur Elastic Serverless

Nous avons abordé l'exécution d'Elasticsearch sur le Cloud ou sur site ; cependant, le client Node.js prend également en charge les connexions à Elastic Cloud Serverless.

Elastic Cloud Serverless vous permet de créer un projet dans lequel vous n'avez pas besoin de vous préoccuper de l'infrastructure puisqu'Elastic s'en charge en interne, et vous n'avez qu'à vous préoccuper des données que vous souhaitez indexer et de la durée pendant laquelle vous souhaitez y avoir accès.

Du point de vue de l'utilisation, Serverless découple le calcul du stockage, offrant des fonctionnalités d'autoscaling pour la recherche et l'indexation. Cela vous permet de n'augmenter que les ressources dont vous avez réellement besoin.

Le client effectue les adaptations suivantes pour se connecter à Serverless :

  • Désactive le sniffing et ignore toutes les options liées au sniffing.
  • Ignore tous les nœuds passés dans la configuration sauf le premier, et ignore toutes les options de filtrage et de sélection des nœuds.
  • Active la compression et `TLSv1_2_method` (identique à la configuration pour Elastic Cloud)
  • Ajoute un en-tête HTTP `elastic-api-version` à toutes les requêtes
  • Utilise `CloudConnectionPool` par défaut au lieu de `WeightedConnectionPool`.
  • Désactive les en-têtes `content-type` et `accept` en faveur des types MIME standard.

Pour connecter votre projet serverless, vous devez utiliser le paramètre serverMode : serverless.

Exécution du client dans un environnement de services fonctionnels (function-as-a-service)

Dans l'exemple, nous avons utilisé un serveur Node.js, mais vous pouvez également vous connecter en utilisant un environnement de fonction en tant que service avec des fonctions telles que AWS lambda, GCP Run, etc.

Un autre exemple consiste à se connecter à des services comme Vercel, qui est également sans serveur. Vous pouvez consulter cet exemple complet de la manière de procéder, mais la partie la plus pertinente du point de terminaison de la recherche ressemble à ceci :

Ce point d'accès se trouve dans le dossier /api et est exécuté du côté du serveur, de sorte que le client ne contrôle que le paramètre "text" qui correspond au terme de la recherche.

L'utilisation de la fonction en tant que service implique que, contrairement à un serveur fonctionnant 24 heures sur 24 et 7 jours sur 7, les fonctions ne font appel qu'à la machine qui exécute la fonction et, une fois celle-ci terminée, la machine passe en mode repos afin de consommer moins de ressources.

Cette configuration peut être pratique si l'application ne reçoit pas trop de demandes ; dans le cas contraire, les coûts peuvent être élevés. Vous devez également tenir compte du cycle de vie des fonctions et des durées d'exécution (qui ne peuvent être que de quelques secondes dans certains cas).

Conclusion

Dans cet article, nous avons appris à gérer les erreurs, ce qui est crucial dans les environnements de production. Nous avons également abordé le test de notre application en simulant le service Elasticsearch, ce qui permet d'obtenir des tests fiables quel que soit l'état du cluster et de se concentrer sur notre code.

Enfin, nous avons montré comment mettre en place une pile entièrement sans serveur en provisionnant à la fois Elastic Cloud Serverless et une application Vercel.

Pour aller plus loin

Prêt à créer des expériences de recherche d'exception ?

Une recherche suffisamment avancée ne se fait pas avec les efforts d'une seule personne. Elasticsearch est alimenté par des data scientists, des ML ops, des ingénieurs et bien d'autres qui sont tout aussi passionnés par la recherche que vous. Mettons-nous en relation et travaillons ensemble pour construire l'expérience de recherche magique qui vous permettra d'obtenir les résultats que vous souhaitez.

Jugez-en par vous-même