Elasticsearch en JavaScript de la manera correcta, parte II

Aprende sobre las mejores prácticas de producción y cómo ejecutar el cliente de Node.js de Elasticsearch en entornos sin servidor para reducir errores de código.

Experimenta con Elasticsearch: Sumérgete en nuestros cuadernos de muestra, inicia una prueba gratuita del cloud o prueba Elastic en tu máquina local ahora.

Esta es la segunda parte de nuestro serial Elasticsearch en JavaScript. En la primera parte, aprendimos a configurar correctamente nuestro entorno, configurar el cliente Node.js, indexar datos y buscar. En esta segunda parte, aprenderemos a implementar las mejores prácticas de producción y a ejecutar el cliente de Node.js Elasticsearch en entornos sin servidor.

Revisaremos:

Puedes consultar el código fuente con los ejemplos aquí.

Mejores prácticas de producción

Manejo de errores en Elasticsearch

Una característica útil del cliente Elasticsearch en Node.js es que expone objetos para los posibles errores en Elasticsearch, de modo que puedes validarlos y manejarlos de diferentes maneras.

Para verlos todos, pon esto: 

Volvamos al ejemplo de búsqueda y tratemos algunos de los posibles errores:

ResponseError en individuo, ocurrirá cuando la respuesta sea 4xx o 5xx, lo que significa que la solicitud es incorrecta o el servidor no está disponible.

Podemos probar este tipo de error generando consultas erróneas, como intentar hacer una consulta de términos en un campo de tipo texto:

Error por defecto:

Error personalizado:

También podemos capturar y manejar cada tipo de error de una manera determinada. Por ejemplo, podemos agregar lógica de reintentos en un TimeoutError.

Pruebas

Las pruebas son clave para garantizar la estabilidad de la aplicación. Para probar el código de forma aislada de Elasticsearch, podemos usar la biblioteca elasticsearch-js-mock al crear nuestro clúster.

Esta biblioteca nos permite instanciar un cliente muy similar al real, pero que responderá a nuestra configuración reemplazando solo la capa HTTP del cliente por una mock, manteniendo el resto igual que el original.

Instalaremos la biblioteca de simulacros y AVA para los exámenes automatizados.

npm install @elastic/elasticsearch-mock

npm install --save-dev ava

Configuraremos el archivo package.json para ejecutar las pruebas. Cerciórate de que se vea así:

Ahora creemos un archivo test.js e instalemos nuestro cliente simulado:

Ahora, agrega un simulacro para la búsqueda semántica:

Ahora podemos crear una prueba para nuestro código, cerciorándonos de que la parte de Elasticsearch siempre devolverá los mismos resultados:

Hagamos las pruebas.

npm run test

¡Hecho! A partir de ahora, podemos probar nuestra app centrándonos al 100% en el código y no en factores externos.

Entornos sin servidor

Cómo ejecutar el cliente en Elastic Serverless

Cubrimos la ejecución de Elasticsearch en la nube o local; sin embargo, el cliente Node.js también soporta conexiones a Elastic Cloud Serverless.

Elastic Cloud Serverless te permite crear un proyecto donde no tienes que preocuparte por la infraestructura, ya que Elastic se encarga de eso internamente, y solo tienes que preocuparte por los datos que quieres indexar y cuánto tiempo quieres tener acceso a ellos.

Desde la perspectiva del uso, los servidores sin servidor desacoplan el cálculo del almacenamiento, proporcionando funciones de escalado automático tanto para búsqueda como para indexación. Esto te permite solo hacer crecer los recursos que realmente necesitas.

El cliente realiza las siguientes adaptaciones para conectarse a Serverless:

  • Apaga el olfateo e ignora cualquier opción relacionada con el olfateo
  • Ignora todos los nodos que pasan en la configuración excepto el primero, e ignora cualquier filtrado de nodos y seleccionando opciones
  • Activa la compresión y el 'TLSv1_2_method' (igual que cuando se configura para Elastic Cloud)
  • Agrega un encabezado HTTP 'elastic-api-version' a todas las solicitudes
  • Emplea 'CloudConnectionPool' por defecto en lugar de 'WeightedConnectionPool'
  • Desactiva los encabezados 'content-type' y 'accept' que venden en favor de los tipos MIME estándar

Para conectar tu proyecto serverless, necesitas usar el parámetro serverMode: serverless.

Cómo ejecutar el cliente en un entorno de función como servicio

En el ejemplo, usamos un servidor Node.js, pero también puedes conectarte usando un entorno de función como servicio con funciones como AWS Lambda, GCP Run, etc.

Otro ejemplo es conectarse a servicios como Vercel, que también es sin servidor. Puedes consultar este ejemplo completo de cómo hacerlo, pero la parte más relevante del endpoint de búsqueda es la siguiente:

Este endpoint reside en la carpeta /api y se ejecuta desde el lado del servidor, de modo que el cliente solo tiene control sobre el parámetro "texto" que corresponde al término de búsqueda.

La participación de usar función como servicio es que, a diferencia de un servidor que funciona 24/7, las funciones solo activan la máquina que ejecuta la función y, una vez terminada, la máquina entra en modo reposo para consumir menos recursos.

Esta configuración puede ser conveniente si la aplicación no recibe demasiadas solicitudes; De lo contrario, los costos pueden ser elevados. También tienes que considerar el ciclo de vida de las funciones y los tiempos de ejecución (que en algunos casos pueden ser solo segundos).

Conclusión

En este artículo, aprendimos a manejar errores, algo crucial en entornos de producción. También cubrimos pruebas de nuestra aplicación simulando el servicio Elasticsearch, que proporciona pruebas fiables independientemente del estado del clúster y nos permite centrarnos en nuestro código.

Finalmente, demostramos cómo crear una pila totalmente serverless aprovisionando tanto Elastic Cloud Serverless como una aplicación Vercel.

Contenido relacionado

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo