Cosas que aprendí al escribir aplicaciones JavaScript de alto rendimiento

Rate this content
Bookmark

En los últimos meses, desarrollé Lyra, un motor de búsqueda de texto completo increíblemente rápido completamente escrito en TypeScript. Me sorprendió ver cómo podía competir con soluciones escritas en Rust, Java y Golang, todos lenguajes conocidos por ser típicamente "más rápidos que JavaScript"... pero ¿es eso realmente cierto? En esta charla, compartiré algunas lecciones que aprendí mientras desarrollaba aplicaciones complejas y críticas para el rendimiento en JavaScript.

31 min
14 Apr, 2023

Video Summary and Transcription

Esta charla explora la creación de un motor de búsqueda de texto completo en JavaScript, resaltando los desafíos con los motores de búsqueda existentes como Algolia y las ventajas de usar JavaScript. El orador enfatiza la importancia de la optimización de código y las técnicas de mejora de rendimiento en JavaScript. La charla también discute la evolución del motor de búsqueda Lyra en el proyecto de código abierto Orama, que ofrece un motor de búsqueda de texto completo rico en funciones y altamente eficiente para JavaScript. El orador aborda preguntas sobre la elección del lenguaje, la escalabilidad y la implementación, y muestra los beneficios de implementar una base de datos inmutable en una CDN.

Available in English

1. Introduction to Full-Text Search

Short description:

Bienvenidos a mi charla sobre Disrupting Full-Text Search con JavaScript. Me encanta Elasticsearch por su rendimiento y escalabilidad. Elasticsearch está construido sobre Apache Lucene, una poderosa biblioteca de búsqueda de texto completo. Sin embargo, también me encantan otros motores de búsqueda como Algolia, MeliSearch y MiniSearch. Decidí recrear un motor de búsqueda con mi equipo para aprender más y abordar problemas personales que tenía con el software existente, como dificultades de implementación, actualizaciones, uso de memoria y altos costos.

Bienvenidos a todos a mi charla, Disrupting Full-Text Search con JavaScript. Ya me han presentado, así que no voy a seguir adelante con eso. Y estoy aquí para hablar sobre la búsqueda de texto completo porque es un dominio que amo y algo que realmente me mantiene despierto por la noche porque me gusta tanto que no puedo dejar de pensar en ello. Y hay una buena razón por la que me gusta tanto, y es principalmente por Elasticsearch. ¿Cuántos de ustedes conocen Elasticsearch? Todos. ¿Cuántos de ustedes han usado Elasticsearch? Nuevamente, casi todos. Y debo decir que me introduje al software de código abierto principalmente por Elasticsearch. Así que tengo una relación muy apasionada con él y tuve el placer y el honor de trabajar en Apache You Know Me, que es una plataforma de datos de clientes que utiliza Elasticsearch como base de datos líder en su infraestructura. Y cuando era un poco más joven, no sé, casi hace 10 años ahora, me impresionaron las actuaciones de un sistema tan complejo y distribuido. Me impresionó ver que podía lanzar millones y millones de registros contra él y no degradaría tanto las actuaciones. Eso me impresionó seriamente, y aquí es donde decidí entrar en el software de código abierto e intentar entender cómo funciona Elasticsearch. Así que mi primera pregunta como un ingeniero junior curioso fue ¿cómo es eso posible? Quiero decir, ¿cómo puede un software mantener tan buenas actuaciones incluso con mil millones de registros?

Más tarde descubrí que Elasticsearch en realidad no es un motor de búsqueda de texto completo, sino que Apache Lucene lo es. Entonces Apache Lucene es la biblioteca de búsqueda de texto completo, que Elasticsearch envuelve al proporcionar una interfaz RESTful, capacidades de sistema de discapacidad, fragmentación, consistencia de datos, monitoreo, gestión de clústeres, etc. Así que un gran saludo a Elasticsearch.

Y antes de seguir adelante, permítanme aclarar una vez más que amo Elasticsearch y amo Algolia. Amo MeliSearch. Amo MiniSearch. Amo cada motor de búsqueda que existe. Y la razón por la que, por supuesto, estaré hablando de algo que recreé con mi equipo. La razón por la que hice eso en primer lugar es porque quería aprender más y, por supuesto, quería resolver algunos problemas muy personales que tenía con dicho software. Nada personal. Por favor, si estás usando Elasticsearch, simplemente continúa usándolo, si te sientes cómodo con él. No hay problema con eso, por supuesto. Estaba hablando de que tenía algunos problemas personales con Elasticsearch. Mi primer problema personal fue que es bastante difícil de implementar, en mi opinión. Podría simplificarse. Difícil de actualizar. Tiene una gran huella de memoria. El consumo de CPU se vuelve terrible tan pronto como

2. Challenges with Java and Algolia

Short description:

No me gusta Java. Prefiero JavaScript. Algolia es costoso y difícil de extender. Hacer software simple es extremadamente difícil, pero como ingenieros, tenemos que intentarlo.

agregar más data. Es realmente costoso de gestionar y ejecutar. Difícil de extender y personalizar. Pero lo más importante, Java. Sabía que la gente se reiría de esto. Pero es una preocupación real, en realidad. Como, no me gusta Java. He estado programando en Java por un tiempo. Prefiero JavaScript para siempre. También probé diferentes soluciones, como Algolia, que es, nuevamente, un software extremadamente extraordinario. Y no estoy exagerando aquí. Los problemas que tuve con Algolia es que es increíblemente costoso a gran escala. Es una gran caja negra, ¿verdad? Es de código cerrado. Y por lo tanto, es difícil de extender y tratar de entender qué está pasando con él. Pero nuevamente, como dije, estos son mis problemas personales con ellos. Y tal vez cuando tuve estos problemas en primer lugar, era un poco demasiado inexperto en ese dominio. Elasticsearch y Algolia eran un poco demasiado para mí. Tal vez valga la pena tener tales problemas, ¿verdad? Porque la gente los está usando. Entonces debe haber una razón por qué. Y también entiendo ahora que tengo un poco más de experiencia, que hacer software simple es extremadamente difícil. Pero siento que, como ingenieros,

3. Learning by Doing and Choosing a Language

Short description:

Quería aprender haciendo, así que me propuse el objetivo de dar una charla sobre cómo funcionan los motores de búsqueda de texto completo y crear uno nuevo. Tuve que estudiar algoritmos y estructuras de datos en profundidad. Elegir un lenguaje de programación fue un desafío, pero terminé reimplementándolo en JavaScript y descubrí que era eficiente.

tenemos que intentarlo. Así que me propuse algunos objetivos porque quería aprender más nuevamente. Y la única forma en que realmente puedo aprender es siguiendo una cita de Richard Feynman. Es decir, lo que no puedo crear, no lo entiendo. Así que quería aprender haciendo. Y me propuse un objetivo. Quería dar una charla sobre cómo funciona un motor de búsqueda de texto completo. Y quiero crear un nuevo tipo de motor de búsqueda de texto completo. Y quería que fuera fácil de escalar masivamente y fácil de extender. Así que tres objetivos fáciles, ¿verdad?

Y por supuesto, cuando comienzas a tratar de entender cómo funciona un motor de búsqueda de texto completo, tienes que lidiar con la teoría detrás de la búsqueda de texto completo. Así que árboles, grafos, n-gramas, similitud de coseno, BN25, TF-ADF, tokenización, stemming y más y más y más. Así que te encuentras en esa situación típicamente, ¿verdad? Sí, todo está bien. Estoy entendiendo en el teclado y con suerte algo bueno saldrá. Spoiler, no lo hace. Pero aún así, la dura verdad, cuando decides que quieres aprender algo así, es que necesitas estudiar algoritmos y estructuras de datos, y necesitas estudiar mucho.

Y por supuesto, en cierto punto tienes que encontrar o elegir un lenguaje de programación para implementarlos, ¿verdad? Y quería ser un chico genial, así que elegí, oh no, eso es incorrecto. Y vi a la gente en la audiencia así cuando mostré el logo de Haskell, ¿verdad? Por supuesto que no elegí Haskell, aunque me encanta. Intenté implementarlo en Rust en primer lugar. Fue demasiado complejo, tengo que decirlo. Empecé a decir, oh sí, extraño el recolector de basura, así que tal vez pueda intentar Golang, ¿verdad? Probé Golang durante un tiempo, y aún así era decente, pero aún bastante complejo de implementar. Y luego recordé a Lou, el Lou Atwood. ¿Sabes quién era Atwood? Es el fundador de Stack Overflow. Cualquier aplicación que se pueda escribir en JavaScript eventualmente se escribirá en JavaScript. Y no hay nada más cierto que eso. Así que JavaScript es el rey de los lenguajes de programación. Todos sabemos eso. Por favor, un gran aplauso para JavaScript. Sí, vale la pena. Así que, sí, comencé a reimplementar cosas en JavaScript traduciendo el código fuente con el que comencé a trabajar en Rust y luego en Golang. Y sorprendentemente, descubrí que, wow, era muy eficiente cuando empecé a implementar data estructuras de manera adecuada.

4. Enhancing Performance and Code Optimization

Short description:

No hay un lenguaje de programación lento que sean solo algoritmos en diseño de estructuras de datos. Veremos pruebas de rendimiento para demostrar este punto. Quiero darte ejemplos de cómo mejorar el rendimiento en JavaScript. Al escribir un motor de búsqueda de texto completo, debes lidiar con consultas booleanas y calcular las intersecciones de matrices. El uso de MapReduce es útil pero no es el más eficiente. Optimizar el algoritmo eliminando MapReduce y utilizando bucles simples puede resultar en un aumento del rendimiento del 13%. Conocer tu lenguaje y tiempo de ejecución es crucial para la optimización del código. Comprender la diferencia entre monomorfismo y polimorfismo es importante.

Y este es el primer punto que me gustaría que te lleves de esta charla. En mi opinión, nuevamente, es una opinión muy personal, no hay un lenguaje de programación lento que sean solo algoritmos en diseño de estructuras de datos. Más adelante veremos algunas pruebas de rendimiento para demostrar este punto. Pero, por favor, realmente quiero que esto sea un punto clave de esta charla. Estamos en una conferencia de Node, ¿verdad? Así que, con suerte, esto nos puede dar esperanza.

Entonces, sí, también quiero darte algunos ejemplos de cómo mejorar realmente tu rendimiento en JavaScript, Node, Deno, lo que sea. Entonces, cuando estás escribiendo un motor de búsqueda de texto completo, en cierto punto, debes lidiar con consultas booleanas, ¿verdad? Y, o, etc. Y en cierto punto, debes calcular las intersecciones de matrices. Entonces, tienes múltiples matrices y debes determinar los elementos que aparecen en cada una de ellas y devolver eso. Este es un ejemplo que utiliza el paradigma de MapReduce. Y como antiguo, y quiero destacar, antiguo programador funcional, solía amar esto mucho. Y sí, básicamente, veo a Matteo allí, se está dando una palmada en la cara y eres la razón por la que ya no programo de forma funcional. Espero que lo sepas. Llegaremos a eso más tarde. Pero de todos modos, el uso de MapReduce es muy útil, en mi opinión, pero no es la forma más eficiente de lidiar con ese tipo de algoritmos. Entonces, esto es, llamémoslo versión uno. Podemos optimizarlo, eliminando todo el código de MapReduce y utilizando iteraciones simples. Y luego tenemos que entender cómo funciona JavaScript y cómo funcionan los algoritmos. Y tal vez podamos tener la versión dos, optimizarla aún más y llegar a la versión tres. Entonces, no se trata de igualdad, se trata de algoritmos. Aquí, básicamente, estamos agregando una sola línea que básicamente comienza la intersección desde la matriz más pequeña. Es un ajuste de rendimiento muy simple que se puede aplicar en este tipo de algoritmos. Cuando ejecutas las pruebas de rendimiento, y hay una referencia para las pruebas, por lo que puedes ejecutarlas tú mismo, verás que tienes aproximadamente un 13% de mejoras de rendimiento simplemente eliminando el código de MapReduce y utilizando bucles simples, porque así es como, al final del día, las computadoras tienden a funcionar. Quiero darte otros ejemplos, pero antes de hacerlo, como dije, construí un motor de búsqueda de texto completo, y solo con esta solicitud de extracción, incrementamos el rendimiento en un 50%, cinco cero, el 50% del rendimiento general del motor de búsqueda de texto completo se dedica solo a cómo se calculan las intersecciones. Por eso quería traer este ejemplo a la mesa. Pero otra cosa en la que me gustaría que pienses es, por favor, debes conocer tu lenguaje, tu tiempo de ejecución, y cómo optimizar tu código para el tiempo de ejecución en el que lo estás ejecutando. Y puedo darte un par de ejemplos de eso. En primer lugar, ¿quién conoce la diferencia entre monomorfismo y polimorfismo? Estoy seguro de que hay más personas que eso. Básicamente, el polimorfismo es cuando creas una función que toma múltiples argumentos, uno a infinitos argumentos, y básicamente llamas a la misma función con los mismos tipos de argumentos. Entonces, si tienes una función de suma donde calculas la suma de dos números,

5. Polymorphic Functions and Performance Optimization

Short description:

En JavaScript, el uso del mismo operador para concatenar cadenas y calcular números hace que las funciones sean polimórficas. Las funciones polimórficas dentro de los bucles disminuyen el rendimiento. Echa un vistazo al repositorio Optimization Killers en GitHub para obtener un código más eficiente. La biblioteca 2-Fast Properties garantiza que las modificaciones en la forma de los objetos no afecten el rendimiento. Al llamar a la función fast object dentro de un bucle, se optimiza en línea el motor Db8Engine. JavaScript puede ser altamente eficiente con la optimización. He creado un motor de búsqueda de texto completo autocontenido.

siempre pasarás números a esa función. Por lo tanto, es monomórfica. Solo hay una forma para los data que pasas como argumentos a la función. Pero, por supuesto, en JavaScript, como la concatenación de cadenas y el cálculo de la suma de números, se utiliza el mismo operador, como el signo más. Por lo tanto, podrías usar fácilmente el operador de suma para concatenar cadenas. Esto es lo que hace que la función sea polimórfica. Pronto descubrirás que si usas funciones polimórficas dentro de bucles, estás disminuyendo el rendimiento por muchas razones diferentes que mostraremos en un momento. Hay un repositorio impresionante en GitHub que tiene una increíble wiki llamada Optimization Killers. Se trata principalmente del turbofan. Básicamente, es una lista de cosas que me encantaría que explores si quieres aprender más sobre cómo realmente crear un código más eficiente para Node.js, específicamente. Hay un enlace allí arriba, así que puedes tomar una foto y mirarlo más tarde. Hay una biblioteca específica que expone una API que realmente me parece increíble. Cuando mi colega Paolo me lo mostró, pensé: `Dios mío, no, por favor, no me estás tomando el pelo`. La biblioteca se llama 2-Fast Properties. Si tienes un objeto y estás modificando la forma del objeto original, esto ralentiza todo. Esta biblioteca se asegura de que cada vez que edites la forma de un objeto, siga siendo eficiente, ¿verdad? ¿Cómo lo hace? Debe ser algo así como una locura de metaprogramación y reflexión, ¿verdad? En realidad, no. Son 31 líneas de código con varios comentarios. ¿Puedes ver cómo lo hace? ¿Y si te mintiera desde la línea 24 hasta la 27? ¿Qué está pasando aquí? Básicamente, solo estamos llamando a la función fast object dentro de un bucle, y eso optimiza en línea el motor Db8Engine. Y eso es increíble. Quiero decir, esto no funciona en JavaScript Core. Por lo tanto, si estás haciendo algo para Safari, por ejemplo, o para BUN, esto no funciona muy bien. Pero para Node.js o Dino, esto es excepcional. Aquí hay una mejora seria de rendimiento. Una vez que sabes cómo optimizarlo, JavaScript es muy, muy eficiente. Y ahora te traigo algunos benchmarks. En solo un segundo. Puedes hacer que tu código funcione en el área de los microsegundos. Lo veremos en un minuto. Pero antes de hacer eso, estaba hablando de cómo quería crear un motor de búsqueda de texto completo desde el principio. Así que bajemos aquí por un segundo. Tuve el honor de hablar en We Are Developers for Congress en Berlín el año pasado.

6. Lyra: From Open Source Project to Company

Short description:

Esto fue realmente malo. Fue muy malo, pero tiene potencial. Lo limpiamos un poco y lanzamos Lyra, un motor de búsqueda de texto completo para JavaScript. El proyecto ganó popularidad en GitHub, lo que nos llevó a crear una empresa llamada Orama, enfocada en la búsqueda de texto completo de código abierto. Orama es la siguiente evolución de Lyra y es completamente gratuito para su uso.

y yo dimos esta charla. Y creé un motor de búsqueda de texto completo muy pequeño y autocontenido. Esto fue realmente malo. Fue muy malo, pero tiene potencial. Así que lo limpiamos un poco. Estaba trabajando en un equipo en Nearform liderado por Mateo. Estaba muy feliz y orgulloso de ser parte de este equipo. Tenía a Paolo, que es un colaborador de Node.js, a Rafael Silva, ahora THC de Node.js, y a Cody Zuchlag, que además de ser un desarrollador increíble, también es profesor en la Universidad NSU.

Y trabajando con ellos, decidimos optimizarlo un poco, hacerlo un poco más bonito, y lanzarlo como código abierto. Así que lanzamos Lyra. Lyra era un motor de búsqueda de texto completo destinado a ejecutar lo que sea que ejecute JavaScript. Y veremos cómo funciona en solo un segundo. Algo bueno que sucedió, y me gustaría que fuera una especie de historia inspiradora, si quieres. Alguien tomó el enlace del proyecto Lyra y lo publicó en Hacker News, sin decírmelo. Y al día siguiente descubrí que teníamos como 3,000 estrellas en GitHub, lo cual fue increíble para mí. Nunca había tenido un repositorio que creciera tan rápido en GitHub. Y decidimos que tal vez era el momento de crear algo en torno a eso. Así que hablé con mi antiguo jefe en NearForm, y decidimos que sí, teníamos que crear una empresa en torno a eso. Y llegaré a eso en solo un segundo. Tuve la oportunidad de llevarme a dos profesionales increíbles de NearForm, Paolo, que habló hoy en este mismo escenario, y que ahora trabaja conmigo como arquitecto principal. Angela, que es la mejor diseñadora con la que podrías soñar. Y yo, por supuesto. Pero aún así, necesitábamos a alguien con conocimiento del dominio, con conocimiento de cómo funciona el negocio. Y preguntando por ahí, nos recomendaron hablar con una persona que ahora se ha unido a la empresa como CEO y cofundador, una persona que fue una de las primeras personas en trabajar con Node.js y que creó OpenShift, Strongloop, Scalar, muchas startups exitosas y que ha trabajado como CTO en IBM. Y ahora es nuestro, estoy orgulloso de decirlo, cofundador y CEO, Sir Isaac Roth. Y estoy muy orgulloso de decir que juntos fundamos Orama. Así que Orama es la siguiente evolución de Lyra. Y aquí queremos llevar la búsqueda de texto completo, que es de código abierto y gratuita. Sé que cuando digo empresas, la gente puede pensar: oh no, ahora estás comercializando algo. En realidad no. Esto es de código abierto. Tú

7. Introducción a Orama

Short description:

Orama es un motor de búsqueda de texto completo de código abierto y gratuito para JavaScript. Está licenciado bajo Apache 2.0 y se puede descargar utilizando NPM. Con Orama, puedes crear una base de datos de películas con tipos de datos fuertemente tipados, insertar datos y realizar búsquedas basadas en propiedades seleccionadas o en todas las propiedades. Orama se destaca entre otras bibliotecas de búsqueda de texto completo como mini-search, FUSE.js y FlexiSearch, que también son excelentes opciones para los desarrolladores.

puedes usarlo. Es gratuito. Y queremos llevar un nuevo paradigma a la búsqueda de texto completo. Y voy a mostrarte cómo. Primero que nada, usar Orama es bastante simple. Es de código abierto. Es gratuito para su uso. Está licenciado bajo la licencia Apache 2.0. Y puedes descargarlo utilizando NPM.

Una vez que lo importas, digamos que creas una base de datos de películas. Entonces debes tener un esquema, que es de tipos de datos fuertemente tipados. Y puedes tener un título, un nombre de director, algunos metadatos, como la calificación, que es un número, ha ganado un Oscar, que es un booleano. Y luego tienes que insertar cosas, como mi película favorita de todos los tiempos, El Prestigio. ¿Hay alguien más compartiendo esta pasión por esta película? Wow, increíble. No, no. ¿Por qué dices que no? Necesitamos discutir esto más tarde, ya sabes. De acuerdo. De todos modos, de todos modos, esta es la mejor película de todas, en mi opinión. Y sí, de todos modos, no es por eso que estamos aquí. Discutiremos esto más tarde. Insertamos cosas y luego buscamos cosas. Así que busquemos Prestigio. Y seleccionamos las propiedades en las que queremos buscar. O podemos usar el operador de estrella para buscar en todas las propiedades. Y eso es realmente todo. Así es como funciona. Pero ahora puedes estar pensando, ¿qué hace que Orama sea tan especial, verdad? Tenemos múltiples bibliotecas de búsqueda de texto completo construidas en JavaScript. Tenemos mini-search, tenemos FUSE.js, tenemos FlexiSearch. Y déjame decirte, estas son todas bibliotecas excepcionales. Si ya las estás usando en este momento,

8. Conjunto de funciones y ventajas de Orama

Short description:

Tenemos un conjunto de funciones muy amplio en Orama, que incluye soporte para conjuntos de caras, filtrado, aumento de campo y más. Puedes personalizar Orama utilizando hooks y componentes. Orama funciona en cualquier entorno de ejecución de JavaScript, excepto Rhino. Es extensible en JavaScript puro y ofrece tiempos de búsqueda increíblemente rápidos medidos en microsegundos.

y si te están funcionando bien, simplemente sigue usándolos. Son fantásticos. De verdad. Y me dieron mucha inspiración para construir lo que creamos hoy. Así que, no hay nada malo en ellos. Solo quiero aprender más y crear algo diferente. Eso es todo.

Pero dije que queremos crear algo diferente. Así que creamos un conjunto de funciones muy amplio. Y esto ni siquiera es todo lo que cubrimos. Pero creo que esto es lo más importante que cubrimos. Como, tenemos soporte para conjuntos de caras, filtrado, tipo de tolerancia, aumento de campo, stemming, 26 idiomas listos para usar, soporte para palabras de detención, complementos, componentes y hooks, que no están relacionados con React. Me refiero a que los hooks significan, por ejemplo, antes de insertar algo, haz algo después de insertar algo, haz algo después de tokenizar antes de tokenizar. Hay mucho que puedes personalizar en Orama. Y lo mismo se aplica a los componentes. Por ejemplo, si indexas números, por convención, hicimos algunas pruebas y descubrimos que los árboles AVL son la estructura de datos más optimizada para números en nuestro caso. Pero tal vez tengas un caso de uso diferente. Por lo tanto, exportamos una interfaz opaca. Por lo tanto, puedes usar tu propia estructura de datos lo que también significa que si quieres poner a prueba tus habilidades y crear nuevas estructuras de datos, puedes usar nuestra suite de pruebas para probar tus algoritmos y estructuras de datos. Es fácil y divertido hacerlo, supongo. Lo bueno de Orama es que funciona en cualquier entorno donde se ejecute JavaScript. Funciona en trabajadores de Cloud 5.0. No tenemos dependencias y lo hemos hecho compatible con prácticamente todos los entornos de ejecución existentes, excepto Rhino. ¿Alguien aquí conoce Rhino? Oh, Dios mío, me da tanta pena por ti. He estado trabajando con él durante cinco años. No tienes idea. No, tal vez sí la tienes. Tal vez sí. Aparte de eso, siento que la mayor ventaja de usar Orama, si necesitas búsqueda de texto completo en tu aplicación, es que es extensible en JavaScript puro. Tenemos los hooks y sistemas de componentes integrados, pero no es solo eso. Es increíblemente rápido y medimos el tiempo, el tiempo de búsqueda, en microsegundos. ¿No me crees? Tal vez sea hora de una pequeña demostración.

9. Database Indexing and Querying

Short description:

Permíteme darte un ejemplo. Tenemos una base de datos con 20,000 productos que indexaremos en el navegador y realizaremos consultas en ella. También hemos implementado la misma base de datos en nuestra propia CDN para hacer una comparación. Los tiempos de consulta son increíblemente rápidos, con resultados devueltos en milisegundos e incluso microsegundos. Al ejecutarse en una CDN, se te cobra por cada microsegundo que se ejecute tu CPU, a diferencia de AWS donde el cargo mínimo es de 1 milisegundo. Además, hay algunas imágenes faltantes debido a datos corruptos, pero aún pagas por la transferencia de datos desde tu CDN.

Vamos a ver. Wow. Desapareció. Oh, aquí está. De acuerdo. Permíteme darte un ejemplo. Así que tengo una base de datos que obtuve de keggle.com. Básicamente, son 20,000 productos con título, descripción, precios, enlaces a imágenes, reseñas, lo que sea. Vamos a indexar 20,000 productos en el navegador ahora mismo y realizaremos algunas consultas en ellos. Para ser honesto, también implementé la misma base de datos en nuestra propia CDN. Hablaremos de eso más adelante para poder hacer una comparación. Bien. ¿Estás listo? Vamos a poblar 20,000 productos en la base de datos. Debería tomar alrededor de tres segundos. Sí, lo hizo. Y ahora estamos listos para hacer algunas consultas. Así que hagamos una consulta. De acuerdo. Wow. 17 milisegundos. Eso es bueno. Intentemos con, no sé, caballo. 175 microsegundos. ¿Por qué estoy resaltando esto? Porque estás ejecutándote en una CDN, en un worker, y te están cobrando por cada microsegundo que se ejecute tu CPU. Entonces, esto es cuánto te están cobrando por ejecutar esto, ¿verdad? En AWS, por ejemplo, eso no es cierto. El mínimo es 1 milisegundo. Pero aún así, estamos ejecutándonos en una CDN. Una cosa a tener en cuenta es que, ahora tenemos 10 imágenes en esta página, ¿verdad? Algunas imágenes realmente faltan debido a datos corruptos. Pero estás pagando por la transferencia desde tu CDN, ¿verdad? Así que estás pagando como 1 megabyte y

10. Orama: Más barato, mejor, más rápido

Short description:

Orama es una búsqueda empresarial más barata, mejor y más rápida. Se ejecuta en nuestra propia CDN, eliminando la necesidad de administración de clústeres, aprovisionamiento de servidores y degradación del rendimiento. Es tan fácil de usar como una biblioteca de JavaScript. Puedes integrar tu modelo de lenguaje completo en él y dejar que Orama haga su magia. Estamos contratando un ingeniero de personal que trabaje principalmente en Node.js y Rust. ¡Gracias por estar aquí!

1.8. Lo siento, 1.8 megabytes para tu transferencia de datos. Y estás pagando 12 kilobytes por la carga útil de Orama, que básicamente es gratis, ¿verdad? Pero si tu conjunto de datos es lo suficientemente pequeño, como 20,000 productos, en mi opinión, es lo suficientemente pequeño, puedes hacer clic aquí. Tarda 100 microsegundos y no estás pagando nada porque se ejecuta en el navegador, gracias. Y por supuesto, como dije, tenemos un conjunto de funciones agradable. Así que solo para darte un ejemplo, si la palabra `caballo`, no sé por qué escribí `caballo`, pero puedo multiplicarlo por, no sé, 1.8 si aparece en la descripción. Cero nanosegundos, sí, eso es básicamente, no podemos ni siquiera medirlo debido a lo rápido que es. Y si no me crees, es de código abierto. La forma en que medimos el rendimiento está en nuestro repositorio de GitHub. A veces no confío en mí mismo y voy a leer este código, y realmente funciona. Pregunté a varias personas, así que tengo que creerlo, supongo. No sé, puedes filtrar por precio, puedes crear conjuntos de caras en torno a eso. Déjame ver. De acuerdo, no hay datos, pero básicamente está todo entre uno y 50, lo que sea. Pero esto es solo para mostrarte las capacidades básicas de ejecutar algo en el borde, básicamente de forma gratuita. Eso es lo que quería compartir contigo. Tal vez ahora puedas creerme que puede ejecutarse en algunos microsegundos, ¿verdad? En su núcleo, Orama es una búsqueda empresarial más barata, mejor y más rápida. Y lo bueno de esto es que, dado que se ejecuta en nuestra propia CDN, tal vez la tuya, deberíamos discutir esto, ¿verdad? No tienes administración de clústeres, no hay aprovisionamiento de servidores, no hay degradación del rendimiento, porque la CDN lo escala por ti, ¿verdad? Y es tan fácil de usar como una biblioteca de JavaScript. Pero eso no es todo. Puedes integrar tu modelo de lenguaje completo en él y dejar que Orama, o dejar que Orama haga su magia por ti. Eso es solo GPT, por ejemplo, ¿verdad? Para que todos estemos en la misma página. Supongo que estoy terminando mi tiempo. Así que si quieres obtener más información, por favor danos una estrella en GitHub, suscríbete a nuestro boletín en el sitio web de oramasearch.com y puedes encontrar todo lo que necesitas aquí. Y por supuesto, estaré disponible si tienes un caso de uso específico para compartir con nosotros para que podamos recopilar comentarios. No tengo nada más que decirte en este momento. Solo quiero recopilar comentarios. Y también estamos contratando. Así que si estás interesado, estamos contratando un ingeniero de personal que trabaje principalmente en Node.js y Rust. Y si estás interesado, somos completamente remotos, con tiempo libre limitado, un generoso plan de acciones, y eso es todo. Así que gracias.

QnA

Preguntas y Elección de Lenguaje

Short description:

Excelente charla. Gracias. La primera parte de la charla me dio una fuerte impresión de JSPerf. Java, ese fue el primero. ¿Por qué no elegiste Haskell? Una pregunta seria... Quiero decir, ¿una respuesta seria? Tú decides. Si quieres ejecutarlo en un navegador, no quieres usar un script puro. Simplemente usa JavaScript o TypeScript de manera que puedas eliminar los tipos y obtener JavaScript puro. Así es como sugiero escribir JavaScript en general. Siguiente pregunta, ¿cómo escala realmente? ¡Ups! Sí, se fue...

Gracias. Y tenemos algunas preguntas para ti. Y por cierto, la primera parte de la charla... Sí, la primera no fue realmente una pregunta, pero se trataba de Java. Alberto, te veo en la audiencia. Veo la segunda. Oh, no puedo creerlo. Lo siento. Desahogo personal. Oh, no. La primera parte de la charla me dio una fuerte impresión de JSPerf. No sé si alguien más se sintió así. Supongo que es algo bueno. Sí.

Java, ese fue el primero. ¿Por qué no elegiste Haskell? Una pregunta seria... Quiero decir, ¿una respuesta seria? Tú decides. En realidad solía programar en Haskell por un tiempo. No era bueno en eso. El problema es que si quieres ejecutarlo en un navegador, no quieres usar un script puro. Sabes que puedes compilar Haskell a JavaScript. No vale la pena, en mi opinión. No vale la pena compilar cualquier lenguaje a JavaScript. Simplemente usa JavaScript o TypeScript de manera que puedas eliminar los tipos y obtener JavaScript puro. Así es como sugiero escribir JavaScript en general. No uses ningún otro lenguaje en él. Sí, entendido.

Siguiente pregunta, ¿cómo escala realmente? ¡Ups! Sí, se fue...

Búsqueda de texto completo en PubMed con Orama

Short description:

Podemos realizar una búsqueda de texto completo en PubMed con Orama, un motor de búsqueda de texto completo en memoria. Proporciona una solución altamente escalable para conjuntos de datos grandes, lo que te permite implementarlo según tus preferencias. Desplegar esa cantidad de datos en una CDN es peligroso y difícil de lograr, pero encontramos una forma de hacerlo funcionar. Discutámoslo más a fondo, aunque aún no puedo revelar los detalles públicamente.

Sí, lo revertiré en un segundo. ¿Cómo escala realmente? ¿Podríamos hacer una búsqueda de texto completo en PubMed? 35 millones de artículos descargables de forma gratuita. 50 gigabytes gratuitos de artículos en el campo médico. Claro que puedes. De la misma manera que puedes hacerlo... Por supuesto, no estás haciendo eso en un navegador porque no tienes tanta memoria RAM. Este es un motor de búsqueda de texto completo en memoria. La mejor manera de hacerlo, en mi opinión, es... Lamento mucho decir esto, pero esto es... ¿Cómo queremos comercializar la RAM, de acuerdo? Proporcionando una solución altamente escalable para tus conjuntos de datos grandes. Por supuesto, puedes usar proyectos de código abierto y desplegarlo según tus preferencias. Puedes desplegarlo en una CDN, pero esa cantidad de data en una CDN es bastante peligroso y difícil de lograr. Encontramos una forma de lograrlo. Así que definitivamente debemos discutir esto. Lamento mucho no poder revelar esto públicamente aún. Lamento mucho, esa es una respuesta muy mala.

Pruebas de búsqueda de texto en Orama

Short description:

Para garantizar la corrección de la búsqueda de texto, tenemos varias pruebas unitarias y pruebas generativas. Sin embargo, determinar si la búsqueda funciona correctamente puede ser un desafío debido a factores como el contexto y el stemming. Mientras que Algolia y Elastic pueden arrojar resultados diferentes, Orama te permite inyectar tu código y personalizar la búsqueda según tus preferencias utilizando hooks y componentes.

Muy bien. ¿Cómo pruebas que la búsqueda de texto funciona? Bueno, en primer lugar, tenemos varias pruebas unitarias. Tenemos varias pruebas generativas y nos aseguramos de generar aún más pruebas unitarias en datos reales para garantizar su corrección. El mayor problema es determinar si la búsqueda funciona correctamente o no porque el contexto importa, el stemming importa y si ejecutas la misma búsqueda en Algolia y Elastic es muy poco probable que obtengas los mismos resultados exactos por varias razones. Entonces, ¿cómo determinas si funciona o no? Un dato interesante sobre Orama es que en realidad puedes inyectar tu código y hacer que funcione y buscar como prefieras. Solo puedo asegurarte que funciona bien porque tenemos una adopción de la comunidad que lo demuestra, tenemos pruebas unitarias y pruebas de integración que lo demuestran pero si no funciona como quieres siempre puedes usar los hooks y componentes para hacer que funcione como prefieras.

Rebranding de Orama y significado del nombre

Short description:

Orama es una versión rebrandeada de Lyra debido a conflictos de nombres. El nombre Orama significa 'ver' en griego y es un nombre divertido de usar en inglés. La decisión de rebrandear fue principalmente para evitar confusiones e incorporar la empresa bajo un nombre único.

Genial, el siguiente creo que este irá. Sí, ¿será Orama diferente de Lyra? Hablando de características. Oh, para nada. Solo tuvimos que rebrandear el nombre básicamente porque Lyra era un códec de Google y tuvimos algunos problemas con el nombre. Además, hay muchas empresas llamadas Lyra donde incorporamos la empresa. Así que decidimos ir con Orama que en griego significa 'ver' y siento que Orama también es un nombre divertido, ¿verdad? Para usar en inglés. Eso es lo que me dijeron, soy italiano. Siento que no sé. Tengo buenos sentimientos sobre el nombre pero eso es solo un rebranding de nombre en realidad. No es más que eso.

Garbage Collector Penalty and Deployment

Short description:

La penalización del recolector de basura es significativa para cargas de trabajo de alto volumen, pero no es una preocupación al ejecutarse en una CDN. Los conjuntos de datos grandes en el navegador pueden ser problemáticos, por lo que Algolia o Elasticsearch son mejores opciones para implementaciones monolíticas en servidores Node.js. Los motores de búsqueda en JavaScript deben ejecutarse en el borde o en el navegador.

Sí, una pregunta sobre el recolector de basura. ¿Qué tan significativa es la penalización del recolector de basura en tu opinión para cargas de trabajo de alto volumen? Entonces, cuando se ejecuta en una CDN, realmente no te importa eso en absoluto porque cada vez que haces una consulta es probable que llegues a un nodo diferente o a un nodo que ya está ocupado por la solicitud anterior y siempre está en caché. Entonces, el hecho es que la penalización del recolector de basura es mala si tienes un conjunto de datos grande en el navegador pero es poco probable que tengas un conjunto de data grande en el navegador. Siento que tener una implementación monolítica en un servidor Node.js no es bueno. Si eso es lo que quieres, por favor usa Algolia o Elasticsearch. Son buenos en esto y también porque tendrías que lidiar con protocolos de consenso para data distribuida, consistencia de data. Tienes que asegurarte de eso. En mi opinión, los motores de búsqueda construidos en JavaScript para ejecutarse en el borde deben ejecutarse en el borde o en el navegador. Eso es todo.

Reasons for Choosing Imperative JavaScript

Short description:

Solía escribir JavaScript funcional, pero descubrí que el JavaScript imperativo es más rápido y mejor en muchos aspectos. Los números muestran que el código imperativo supera al código orientado a objetos o funcional. Aunque tal vez no estuviera escribiendo un buen JavaScript orientado a objetos o funcional, mi código imperativo funciona mejor.

De acuerdo, suena genial. Sí, hay algunas preguntas. ¿Por qué ya no utilizas un paradigma funcional? Porque Matteo Collina, que está aquí sonriendo. No, porque tiene razón. Quiero decir, no es la forma más eficiente de escribir código JavaScript. Antes de unirme a NIRF y a su equipo, trabajaba principalmente con JavaScript funcional. Luego descubrí que esta no es la mejor forma de escribir JavaScript. Y si cuentas los números... Quiero decir, los números son los que importan en cierto punto y los números muestran que el JavaScript imperativo es mucho más rápido y mejor en muchos aspectos que el JavaScript orientado a objetos o funcional. Probablemente sea porque estaba escribiendo un terrible JavaScript orientado a objetos o de programación funcional. Pero la forma en que lo escribo, mi código imperativo funciona mejor. Así que por eso es imperativo.

Benefits of Deploying Immutable Database to CDN

Short description:

Hay una pregunta sobre las comparativas con Elastic Search. Estamos a punto de publicarlas. Desplegar una base de datos inmutable en un CDN ofrece ventajas, como experiencias de búsqueda personalizadas. Potenciar documentos en lugar de campos puede aumentar la conversión para los usuarios. Gracias por unirse a la sala de preguntas y respuestas.

Sí, tiene sentido. Sí, también hay una pregunta sobre las comparativas con Elastic Search. ¿Tienes alguna referencia?

Estamos a punto de publicarlas, de hecho, sí. Y aún no. No son públicas Estamos a punto de publicarlas.

Muy bien, creo que necesito elegir una última. Permíteme rápidamente... Oh, esa es buena. Sí, absolutamente. Esto es bueno porque hay una cosa que no mencioné. Pero por ahora, necesito hacerlo. Si despliegas una database inmutable en un CDN, tienes algunas ventajas. Por ejemplo, si nadie está buscando, no estás pagando nada. Lo que significa que si tienes 1000 usuarios, puedes construir 1000 índices diferentes, desplegarlos en un CDN y no estar pagando nada hasta que comiencen a buscar. Lo que significa que cada usuario puede tener una experiencia de búsqueda diferente, personalizada y personalizada. ¿Verdad? Sí, puedes potenciar documentos en lugar de campos. Y puedes decir algo como, A Michele le gustan, no sé, las camisetas violetas. Entonces, cada vez que busque camisetas, tendrá campos potenciados para Violeta y camisetas juntas, ¿verdad? Porque tal vez tengo un historial de búsqueda o historial de conversiones en un e-commerce. Tal vez a otras personas les guste Paolo, siempre bromeo con él porque le gustan las camisetas amarillas. Si busco camisetas, tendré un índice que potenciará las camisetas violetas. Paolo tendrá un índice que potenciará las camisetas amarillas. Como puedes ver, esto aumenta la conversión para tus usuarios, con suerte. Y sí, definitivamente, puedes potenciar documentos y deberías potenciar documentos en lugar de campos.

Muy bien, muchas gracias. Gracias. Hay muchas más preguntas. Simplemente no puedo, sí. No sé cómo se llama, pero estaré allí. Sí, exactamente. Es una sala de preguntas y respuestas. Así que todos, por favor únanse a la sala de preguntas y respuestas. Gracias. Y en realidad...

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

React Advanced Conference 2022React Advanced Conference 2022
25 min
A Guide to React Rendering Behavior
Top Content
React is a library for "rendering" UI from components, but many users find themselves confused about how React rendering actually works. What do terms like "rendering", "reconciliation", "Fibers", and "committing" actually mean? When do renders happen? How does Context affect rendering, and how do libraries like Redux cause updates? In this talk, we'll clear up the confusion and provide a solid foundation for understanding when, why, and how React renders. We'll look at: - What "rendering" actually is - How React queues renders and the standard rendering behavior - How keys and component types are used in rendering - Techniques for optimizing render performance - How context usage affects rendering behavior| - How external libraries tie into React rendering
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Scaling Up with Remix and Micro Frontends
Top Content
Do you have a large product built by many teams? Are you struggling to release often? Did your frontend turn into a massive unmaintainable monolith? If, like me, you’ve answered yes to any of those questions, this talk is for you! I’ll show you exactly how you can build a micro frontend architecture with Remix to solve those challenges.
React Summit 2023React Summit 2023
32 min
Speeding Up Your React App With Less JavaScript
Too much JavaScript is getting you down? New frameworks promising no JavaScript look interesting, but you have an existing React application to maintain. What if Qwik React is your answer for faster applications startup and better user experience? Qwik React allows you to easily turn your React application into a collection of islands, which can be SSRed and delayed hydrated, and in some instances, hydration skipped altogether. And all of this in an incremental way without a rewrite.
React Summit 2023React Summit 2023
23 min
React Concurrency, Explained
React 18! Concurrent features! You might’ve already tried the new APIs like useTransition, or you might’ve just heard of them. But do you know how React 18 achieves the performance wins it brings with itself? In this talk, let’s peek under the hood of React 18’s performance features: - How React 18 lowers the time your page stays frozen (aka TBT) - What exactly happens in the main thread when you run useTransition() - What’s the catch with the improvements (there’s no free cake!), and why Vue.js and Preact straight refused to ship anything similar
JSNation 2022JSNation 2022
21 min
The Future of Performance Tooling
Top Content
Our understanding of performance & user-experience has heavily evolved over the years. Web Developer Tooling needs to similarly evolve to make sure it is user-centric, actionable and contextual where modern experiences are concerned. In this talk, Addy will walk you through Chrome and others have been thinking about this problem and what updates they've been making to performance tools to lower the friction for building great experiences on the web.
Remix Conf Europe 2022Remix Conf Europe 2022
37 min
Full Stack Components
Top Content
Remix is a web framework that gives you the simple mental model of a Multi-Page App (MPA) but the power and capabilities of a Single-Page App (SPA). One of the big challenges of SPAs is network management resulting in a great deal of indirection and buggy code. This is especially noticeable in application state which Remix completely eliminates, but it's also an issue in individual components that communicate with a single-purpose backend endpoint (like a combobox search for example).
In this talk, Kent will demonstrate how Remix enables you to build complex UI components that are connected to a backend in the simplest and most powerful way you've ever seen. Leaving you time to chill with your family or whatever else you do for fun.

Workshops on related topic

React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Featured WorkshopFree
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
DevOps.js Conf 2024DevOps.js Conf 2024
163 min
AI on Demand: Serverless AI
Featured WorkshopFree
In this workshop, we discuss the merits of serverless architecture and how it can be applied to the AI space. We'll explore options around building serverless RAG applications for a more lambda-esque approach to AI. Next, we'll get hands on and build a sample CRUD app that allows you to store information and query it using an LLM with Workers AI, Vectorize, D1, and Cloudflare Workers.
JSNation 2023JSNation 2023
170 min
Building WebApps That Light Up the Internet with QwikCity
Featured WorkshopFree
Building instant-on web applications at scale have been elusive. Real-world sites need tracking, analytics, and complex user interfaces and interactions. We always start with the best intentions but end up with a less-than-ideal site.
QwikCity is a new meta-framework that allows you to build large-scale applications with constant startup-up performance. We will look at how to build a QwikCity application and what makes it unique. The workshop will show you how to set up a QwikCitp project. How routing works with layout. The demo application will fetch data and present it to the user in an editable form. And finally, how one can use authentication. All of the basic parts for any large-scale applications.
Along the way, we will also look at what makes Qwik unique, and how resumability enables constant startup performance no matter the application complexity.
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Data Fetching Strategies
Top Content
WorkshopFree
- Introduction- Prerequisites for the workshop- Fetching strategies: fundamentals- Fetching strategies – hands-on: fetch API, cache (static VS dynamic), revalidate, suspense (parallel data fetching)- Test your build and serve it on Vercel- Future: Server components VS Client components- Workshop easter egg (unrelated to the topic, calling out accessibility)- Wrapping up
React Day Berlin 2022React Day Berlin 2022
86 min
Using CodeMirror to Build a JavaScript Editor with Linting and AutoComplete
Top Content
WorkshopFree
Using a library might seem easy at first glance, but how do you choose the right library? How do you upgrade an existing one? And how do you wade through the documentation to find what you want?
In this workshop, we’ll discuss all these finer points while going through a general example of building a code editor using CodeMirror in React. All while sharing some of the nuances our team learned about using this library and some problems we encountered.
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Testing Web Applications Using Cypress
WorkshopFree
This workshop will teach you the basics of writing useful end-to-end tests using Cypress Test Runner.
We will cover writing tests, covering every application feature, structuring tests, intercepting network requests, and setting up the backend data.
Anyone who knows JavaScript programming language and has NPM installed would be able to follow along.