Cosas que aprendí mientras escribía aplicaciones de JavaScript de alto rendimiento

Rate this content
Bookmark

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

Michele Riva
Michele Riva
31 min
14 Apr, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Esta masterclass explora la creación de un motor de búsqueda de texto completo en JavaScript, destacando 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 del 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 características y de alto rendimiento 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. Introducción a la búsqueda de texto completo

Short description:

Bienvenidos a mi charla sobre Cómo interrumpir la búsqueda de texto completo con JavaScript. Me encanta Elasticsearch por su rendimiento y escalabilidad. Elasticsearch se basa en Apache Lucene, una potente 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 despliegue, actualizaciones, uso de memoria y costos elevados.

Bienvenidos a todos a mi charla, Interrumpiendo la búsqueda de texto completo con JavaScript. Ya me han presentado, así que no seguiré con eso. Y estoy aquí para hablar de la búsqueda de texto completo porque es un dominio que me encanta 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? De nuevo, casi todos. Y debo decir que me introduje en el 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 data de clientes que utiliza Elasticsearch como una database líder en su infraestructura. Y cuando era un poco más junior, no sé, hace casi 10 años, me impresionó el rendimiento 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 el rendimiento tanto. Eso fue realmente impresionante para mí, y es ahí 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 un rendimiento tan bueno incluso con mil millones de registros? Más tarde descubrí que Elasticsearch no es en realidad un motor de búsqueda de texto completo, sino Apache Lucene. Así que Apache Lucene es la biblioteca de búsqueda de texto completo, que Elasticsearch envuelve proporcionando una interfaz RESTful, capacidades de sistema de discapacidad, fragmentación, consistencia de data, monitoreo, gestión de clústeres y así sucesivamente. Así que un gran saludo a Elasticsearch.

Y antes de continuar, permítanme aclarar que de nuevo me encanta Elasticsearch y me encanta Algolia. Me encanta MeliSearch. Me encanta MiniSearch. Me encanta 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 ese software. Así que nada personal. Por favor, si estás usando Elasticsearch, sigue usándolo, si te sientes cómodo con él. No hay problema con eso, por supuesto. Estaba hablando del hecho de que tenía algunos problemas personales con Elasticsearch. Mi primer problema personal era que es bastante difícil de desplegar, en mi opinión. Podría ser simplificado. Difícil de actualizar. Tiene una gran huella de memoria. El consumo de CPU se vuelve terrible tan pronto como

2. Desafíos con Java y Algolia

Short description:

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

añades 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, de hecho. Como, no me gusta Java. He estado programando en Java un poco. Prefiero JavaScript para siempre y siempre. También, probé diferentes soluciones, como Algolia, que es, de nuevo, un software extremadamente extraordinario. Y no estoy exagerando aquí. Los problemas que tuve con Algolia es que es increíblemente caro a scale. Es una gran caja negra, ¿verdad? Es de código cerrado. Y por lo tanto, es difícil de extender e intentar entender qué está pasando con él. Pero de nuevo, 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 vale la pena tener tales problemas, ¿verdad? Porque la gente los está usando. Así que debe haber una razón por qué. Y también entiendo ahora que soy un poco más experimentado, que hacer software simple es extremadamente difícil. Pero siento que, como ingenieros,

3. Aprendiendo Haciendo y Escogiendo un Lenguaje

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 extensivamente. Elegir un lenguaje de programación fue un desafío, pero terminé re-implementando en JavaScript y descubrí que era eficiente.

tenemos que intentarlo. Así que me puse algunos objetivos porque quería aprender más de nuevo. 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 puse 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 masivamente escalable y fácil de extender. Entonces, tres objetivos fáciles, ¿verdad?

Y por supuesto, siempre que empiezas a intentar 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, gráficos, engramas, similitud de causina BN25, TF-ADF, tokenización, derivación, 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 espero que algo bueno salga. Spoiler, no lo hace. Pero aún así, la dura verdad, cuando decides que quieres aprender algo así, es que necesitas estudiar algoritmos en data estructuras, y necesitas estudiarlos 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 tipo genial, así que elijo, oh no, ese es el equivocado. Y vi a gente en la audiencia así cuando mostré el logo de Haskell ¿verdad? Por supuesto que no elegí Haskell, aunque me encanta. Intenté implementar en Rust en primer lugar. Era demasiado complejo, tengo que decir. Empecé diciendo, oh sí, extraño el recolector de basura, así que tal vez puedo intentar Golang, ¿verdad? Intenté Golang por un poco, y todavía era decente, pero aún bastante complejo de implementar. Y luego recordé a Lou, el Lou de Atwood. ¿Sabes quién era Atwood? Es el fundador de Stack Overflow. Así que cualquier aplicación que pueda ser escrita en JavaScript eventualmente será escrita en JavaScript. Y no hay nada más cierto que eso. Así que JavaScript es el rey de los lenguajes de programación. Todos lo sabemos. Por favor, un gran aplauso para JavaScript. Sí, vale la pena. Entonces, sí, empecé a reimplementar cosas en JavaScript traduciendo el code fuente que empecé a trabajar en Rust y luego en Golang. Y sorprendentemente, descubrí que, wow, era muy eficiente cuando empecé a implementar data estructuras de una manera adecuada.

4. Mejorando el Rendimiento y la Optimización del Código

Short description:

No existe un lenguaje de programación lento, solo algoritmos en el diseño de estructuras de datos. Veremos benchmarks para probar este punto. Quiero darles ejemplos de cómo mejorar su rendimiento en JavaScript. Al escribir un motor de búsqueda de texto completo, tienes que lidiar con consultas booleanas y calcular las intersecciones de los arrays. Usar MapReduce es útil pero no es lo más eficiente. Optimizar el algoritmo eliminando MapReduce y usando bucles simples puede resultar en una mejora del rendimiento del 13%. Conocer tu lenguaje y tiempo de ejecución es crucial para la optimización del código. Entender la diferencia entre monomorfismo y polimorfismo es importante.

Y este es el primer punto que me gustaría que se llevaran de esta charla. En mi opinión, que, de nuevo, es muy personal, no existe un lenguaje de programación lento, solo algoritmos en la estructura de data design. Veremos más adelante algunos benchmarks para probar este punto. Pero, por favor, realmente quiero que esto sea un punto clave de esta charla. Estamos en una conferencia de Node, ¿verdad? Entonces, con suerte, esto puede darnos esperanza.

Entonces, sí, también quiero darles algunos ejemplos de cómo mejorar realmente su rendimiento en JavaScript, Node, Deno, lo que sea. Entonces, cuando estás escribiendo un motor de búsqueda de texto completo, en cierto punto, tienes que lidiar con consultas booleanas, ¿verdad? Y, o, etc. Y en cierto punto, tienes que calcular las intersecciones de los arrays. Entonces, tienes varios arrays y tienes que determinar los elementos que aparecen en cada array y devolver eso. Este es un ejemplo usando el paradigma MapReduce. Y como un antiguo, y destaco, antiguo programador functional, solía amar esto mucho. Y sí, básicamente, veo a Matteo allí, está llevándose las manos a la cara y tú eres la razón por la que ya no code de manera funcional. Espero que lo sepas. Llegaremos allí más tarde. Pero de todos modos, usar 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 material de MapReduce y usando una iteración simple. Y luego tenemos que entender cómo funciona JavaScript y cómo funcionan los algoritmos. Y tal vez podemos tener la versión dos, optimizarla aún más, e ir a la versión tres. Entonces, no es una cuestión de paridad, es una cuestión de algoritmos. Aquí, básicamente, solo estamos añadiendo una sola línea que básicamente comienza la intersección desde el array más pequeño. Es una sintonización de performance muy simple que puedes aplicar en este tipo de algoritmos. Cuando ejecutas los benchmarks, y ahí está la referencia para los benchmarks, así que puedes ejecutarlos tú mismo, verás que tienes como un 13% de mejora en el performance simplemente eliminando el material de MapReduce y usando bucles simples, porque así es como, al final del día, los ordenadores tienden a trabajar. Quiero darles otros ejemplos, pero antes de hacer eso, como dije, construí un completo motor de búsqueda de texto, y con este PR solo, incrementamos el rendimiento en un 50%, cinco cero, el 50% del rendimiento total del motor de búsqueda de texto es solo cuidar cómo se calculan las intersecciones. Por eso quería traer este ejemplo a la mesa. Pero otra cosa que me gustaría que pensaran es, por favor, tienen que conocer su lenguaje, su tiempo de ejecución, y cómo optimizar su code para el tiempo de ejecución en el que se está ejecutando. Y puedo darles un par de ejemplos de eso. En primer lugar, ¿quién sabe la diferencia entre monomorfismo y polimorfismo? Estoy seguro de que hay más gente que eso. Entonces, básicamente, el polimorfismo es cuando creas una función que toma múltiples argumentos, de 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. Funciones Polimórficas y Optimización del Rendimiento

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. Consulta el repositorio Optimization Killers en GitHub para un código más eficiente. La biblioteca 2-Fast Properties asegura que las modificaciones de la forma del objeto no ralentizan el rendimiento. Al llamar a la función fast object dentro de un bucle, se calienta la optimización en línea para Db8Engine. JavaScript puede ser altamente eficiente con la optimización. Creé un motor de búsqueda de texto completo autónomo.

siempre pasarás números a esa función. Así que es monomórfica. Solo hay una forma para los data que estás pasando a los argumentos de la función. Pero claro, en JavaScript, como concatenar cadenas y calcular la suma de números usa el mismo operador, como el más. Así que fácilmente podrías usar el número de añadir 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 los bucles, estás disminuyendo el performance por muchas razones diferentes que mostraremos en un segundo. Hay un increíble repositorio en GitHub que tiene una increíble wiki llamada Optimization Killers. Se trata todo sobre el turbofan. Esta es básicamente una lista de cosas que me encantaría que exploraras si quieres aprender más sobre cómo realmente crear un code más eficiente para Node.js, específicamente. Hay un enlace allí, así que eres libre de tomar una foto y mirarlo más tarde. Hay una biblioteca específica que expone una API que es realmente loca para mí. Cuando mi colega Paolo me mostró eso, yo estaba como, oh, Dios mío, no, por favor, tienes que estar bromeando. La biblioteca se llama 2-Fast Properties. Si tienes un objeto y estás modificando la forma del objeto original, esto está ralentizando todo. Hay esta biblioteca que básicamente se asegura de que cada vez que editas la forma de un objeto, básicamente sigue siendo eficiente, ¿verdad? ¿Cómo lo hace? Eso debe ser como una locura de metaprogramación de reflexión pasando por ahí, ¿verdad? En realidad, no. Son 31 líneas de code con un montón de comentarios. ¿Puedes ver cómo lo hace? ¿Qué pasa si miento de la línea 24 a la 27? ¿Qué está pasando aquí? Así que, básicamente, estamos llamando a la función fast object dentro de un bucle, y eso calienta la optimization en línea para Db8Engine. Y eso es una locura. Quiero decir, esto se rompe en JavaScript Core. Así que si estás haciendo algo para Safari, por ejemplo, o para BUN, esto no funciona bien. Pero para Node.js o Dino, eso es excepcional. Esta es una mejora seria del performance aquí. Una vez que sabes cómo optimizarlo, JavaScript, es muy, muy eficiente. Y te traigo algunos benchmarks ahora. En solo un segundo. Puedes hacer fácilmente que tu code funcione en el área de los microsegundos. Lo veremos en solo un minuto. Pero antes de hacer eso, estaba hablando de cómo quería crear un motor de búsqueda de texto completo justo al principio. Así que vamos a bajar aquí por un segundo. Tuve el honor de hablar en la masterclass We Are Developers en Berlín el año pasado,

6. Lyra: De Proyecto de Código Abierto a Empresa

Short description:

Esto era muy malo, pero tenía cierto potencial. Lo limpiamos un poco y liberamos 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, centrada en la búsqueda de texto completo de código abierto. Orama es la próxima evolución de Lyra y es completamente gratuita para su uso.

y di esta charla. Y creé un motor de búsqueda de texto completo muy pequeño y autónomo. Esto era muy malo, pero tenía cierto 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 contribuyente de Node.js, Rafael Silva, ahora Node.js THC, y 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 liberarlo. Así que liberamos Lyra. Así que Lyra era un motor de búsqueda de texto completo destinado a ejecutar cualquier cosa que JavaScript ejecute. Y veremos cómo lo hace en solo un segundo. Una cosa bonita que pasó, y me gustaría que esto fuera una especie de historia inspiradora, si se quiere. Alguien tomó el enlace del proyecto Lyra y lo puso en Hacker News, sin decírmelo. Y al día siguiente descubrí que teníamos unas 3,000 estrellas en GitHub, lo cual fue una locura para mí. Nunca tuve ningún repositorio que creciera tan rápido en GitHub. Y decidimos que tal vez era el momento de crear algo alrededor de eso. Así que hablé con mi antiguo jefe en NearForm, y decidimos que sí, teníamos que crear una empresa alrededor de eso. Y llegaré allí en solo un segundo. Tuve la oportunidad de llevar a dos profesionales increíbles de NearForm, Paolo, que ha hablado hoy en este mismo escenario, que ahora está trabajando conmigo como arquitecto principal. Angela, que es la mejor diseñadora que uno puede 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 sugirieron hablar con una persona que ahora se ha unido a la empresa como CEO y cofundador, una persona que fue una de las primeras en basarse en Node.js que creó OpenShift, Strongloop, Scalar, muchas hermosas startups ha servido a IBM como CTO. Y ahora es nuestro, estoy orgulloso de decirlo, cofundador y CEO, Sir Isaac Roth. Y estoy muy orgulloso de decir que fundamos juntos Orama. Así que Orama es la próxima evolución de Lira. Y aquí es donde 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 usando NPM. Con Orama, puedes crear una base de datos de películas fuertemente tipada, insertar datos y realizar búsquedas basadas en propiedades seleccionadas o 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 gratis. Y queremos traer un nuevo paradigma a la búsqueda de texto completo. Y voy a mostrarte cómo. Entonces, en primer lugar, usar Orama es bastante simple. Es de código abierto. Es gratis para usar. Está licenciado bajo la licencia Apache 2.0. Y puedes descargarlo usando NPM.

Entonces, una vez que lo importas, digamos que creas una database de películas. Entonces debes tener un esquema, que es fuertemente tipado. Y puedes decir, OK, tendré mi 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, The Prestige. ¿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. Bueno. De todos modos, en mi opinión, esta es la mejor película de todos los tiempos, . Y sí, de todos modos, no es por eso que estamos aquí. Discutiremos esto más tarde. Insertamos cosas y luego buscamos cosas. Entonces, busquemos Prestige. Y seleccionamos las propiedades en las que queremos buscar. O podemos usar el operador 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 varias bibliotecas de búsqueda de texto completo construidas en JavaScript. Tenemos mini-search, tenemos FUSE.js, tenemos FlexiSearch. Y déjame decirte, todas estas son bibliotecas excepcionales. Si ya las estás usando ahora,

8. Conjunto de características y ventajas de Arama

Short description:

Arama tiene un gran conjunto de características, incluyendo soporte para conjuntos de caras, filtrado, impulso de campo y más. Puedes personalizar Arama usando hooks y componentes. Arama funciona en cualquier entorno de ejecución de JavaScript, excepto para Rhino. Es extensible en JavaScript puro y ofrece tiempos de búsqueda increíblemente rápidos medidos en microsegundos.

y si funcionan bien para ti, sigue usándolos. Son fantásticos. De verdad. Y me dieron mucha inspiration para construir lo que creamos hoy. Así que, nada malo sobre ellos. Solo quiero aprender más y crear algo diferente. Eso es realmente todo.

Pero dije, queremos crear algo diferente. Así que, creamos un gran conjunto de características. Y esto no es ni siquiera 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, impulso de campo, derivación, 26 idiomas de serie, soporte para palabras de parada, plugins, componentes y hooks, que no están relacionados con React. Quiero decir, hooks significa, por ejemplo, antes de insertar cosas, hacer algo después de insertar cosas, hacer algo después de tokenizar antes de tokenizar. Hay mucho que puedes personalizar sobre Arama. Y lo mismo se aplica para los componentes. Como, por ejemplo, si indexas números, por convención, hicimos algunos benchmarks y descubrimos que los árboles AVL son la estructura de data que está más optimizada para números en nuestro caso. Pero tú podrías tener un caso de uso diferente. Así que, exportamos una interfaz opaca. Así que, puedes traer tu propia estructura de data lo que también significa que si quieres probar tus habilidades y crear nuevas estructuras de data, puedes usar nuestra suite de pruebas para probar tus algoritmos y estructuras de data. Eso es simplemente fácil y divertido de hacer, supongo. Lo bueno de Arama, es que funciona donde sea que JavaScript se ejecute. Funciona en Cloud 5.0 workers. No tenemos ninguna dependencia y lo hicimos compatible con literalmente todos los entornos de ejecución que existen, excepto para Rhino. ¿Hay alguien aquí que conozca Rhino? Oh Dios mío, lo siento mucho por ti. He estado trabajando con él durante cinco años. No tienes idea. No, tal vez sí la tengas. Tal vez sí la tengas. Aparte de eso, creo 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 incorporados, 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 es hora de una pequeña demostración.

9. Indexación y Consulta de Bases de Datos

Short description:

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

Veamos. Vaya. Desapareció. Oh, aquí está. De acuerdo. Permíteme darte un ejemplo. Así que tengo una base de datos que tomé de keggle.com. Básicamente son 20,000 productos llenos de 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 haremos algunas consultas sobre ellos. Para ser honesto, también desplegué la misma base de datos exacta en nuestra propia CDN. Hablaremos de eso más tarde para poder hacer algunas comparaciones. Bien. ¿Estás listo? Vamos a poblar 20,000 productos en la base de datos. Debería tomar alrededor de tres segundos. Sí, así fue. Y ahora estamos listos para hacer algunas consultas. Así que hagamos una consulta. Vale. Vaya. 17 milisegundos. Eso está bien. Intentemos con, no sé, caballo. 175 microsegundos. ¿Por qué estoy destacando esto? Porque estás ejecutando en una CDN, en un worker, y te están cobrando cada microsegundo que tu CPU funciona. Así que esto es lo que 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 ejecutando en una CDN. Una cosa a tener en cuenta es que, como, ahora tenemos 10 imágenes en esta página, ¿verdad? Algunas imágenes en realidad faltan debido a los datos corruptos. Pero estás pagando por la dirección 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 gestió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 grande con él y dejar que Orama haga su magia. Estamos contratando a un ingeniero de personal que trabaja principalmente en Node.js y Rust. ¡Gracias por estar aquí!

1.8. Lo siento, 1.8 megabytes para tu transferencia de data. Y estás pagando 12 kilobytes por el payload de Orama, que es básicamente gratis, ¿verdad? Pero si tu conjunto de data 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 buen conjunto de características. Así que solo para darte un ejemplo, si el 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 medirlo debido a lo rápido que es. Y si no me crees, eso 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 code, y realmente funciona. Pregunté a varias personas, así que tengo que creerlo, supongo. No sé, puedes filtrar por precio, puedes crear conjuntos de caras alrededor de eso. Déjame ver. Bueno, no hay data, pero básicamente todo está entre uno y cincuenta, lo que sea. Pero esto es solo para mostrarte básicamente las capacidades de ejecutar algo en el borde, básicamente gratis. Así que eso es lo que quería compartir contigo. Quizás ahora puedas creerme que puede ejecutarse algunos microsegundos, ¿verdad? Así que en su núcleo, Orama es una búsqueda enterprise más barata, mejor, más rápida. Y lo bueno de esto es que dado que se ejecuta en nuestra propia CDN, quizás la tuya, deberíamos discutir esto, ¿verdad? No tienes gestión de clústeres, no hay aprovisionamiento de servidores, no hay degradación del performance, 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 grande con él y dejar que Orama, o dejar que Orama haga su magia por ti. Eso es solo GPT por ejemplo, ¿verdad? Así que todos estamos en la misma página. Así que supongo que estoy terminando mi tiempo. Así que si quieres aprender más, por favor danos una estrella en GitHub, suscríbete a nuestro boletín en el sitio web de oramasearch.com y puedes encontrar lo que necesites aquí. Y por supuesto, estaré por aquí si tienes un caso de uso específico para compartir con nosotros para que podamos recoger comentarios. No tengo nada que decirte ahora mismo. Solo quiero recoger comentarios. Y también estamos hiring. Así que si estás interesado, estamos contratando a un ingeniero de personal que trabaja principalmente en Node.js y Rust. Y si estás interesado, somos totalmente remotos, PTO limitado, plan de acciones generoso, y eso es todo. Así que gracias por estar aquí.

QnA

Preguntas y Elección de Lenguaje

Short description:

Charla impresionante. Gracias. La primera parte de la charla me dio serias vibraciones de JSPerf. Java, ese fue el primero. ¿Por qué no elegiste Haskell? ¿Pregunta seria... quiero decir, respuesta seria? Depende de ti. Si quieres ejecutar en un navegador, no querrás usar pure script. Simplemente usa Javascript en sí o usa TypeScript de una manera que solo puedas eliminar los tipos y obtener Javascript puro de él. Así es como sugiero escribir Javascript en absoluto. Sí, siguiente pregunta, ¿cómo escala realmente? Oops. Sí, y se ha ido...

mucho por estar aquí. Ha sido un honor. Gracias, Michele. Charla impresionante. Gracias. Y tenemos algunas preguntas para ti. Y por cierto, la primera parte de la charla... Sí, la primera no era realmente una pregunta, pero era sobre Java. Alberto, te veo en la audiencia. Veo la segunda. Oh, no puedo creerlo. Lo siento. Queja personal. Oh, no. La primera parte de la charla me dio serias vibraciones de JSPerf. No sé si alguien más siente eso. Supongo que es algo bueno. Sí.

Java, ese fue el primero. ¿Por qué no elegiste Haskell? ¿Pregunta seria... quiero decir, respuesta seria? Depende de ti. De hecho, solía usar code Haskell durante un tiempo. No era bueno en eso. El problema es que si quieres ejecutar en un navegador, no querrás usar pure script. Sabes que puedes compilar Haskell a Javascript. No vale la pena, en mi opinión. No vale la pena compilar ningún lenguaje a Javascript. Simplemente usa Javascript en sí o usa TypeScript de una manera que solo puedas eliminar los tipos y obtener Javascript puro de él. Así es como sugiero escribir Javascript en absoluto. No uses ningún otro lenguaje en él. Sí, lo tengo.

Sí, siguiente pregunta, ¿cómo escala realmente? Oops. Sí, y se ha ido...

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 ultra escalable para grandes conjuntos de datos, permitiéndote desplegarlo como prefieras. Desplegar tantos datos en una CDN es peligroso y difícil de lograr, pero encontramos una forma de hacerlo funcionar. Vamos a discutirlo 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 gratis. 50 gigabytes gratis de artículos en el campo médico. Claro que puedes. De la misma manera que puedes hacerlo... Por supuesto que 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 hacer eso, en mi opinión, es... Me entristece mucho decir esto pero esto es... ¿Cómo queremos comercializar RAM, de acuerdo? Proporcionando una solución ultra escalable para tus grandes conjuntos de data. Por supuesto que puedes usar los proyectos de código abierto y desplegarlo como prefieras. Puedes desplegarlo en una CDN pero tantos data en una CDN eso es bastante peligroso y bastante difícil de lograr. Encontramos una forma de lograrlo. Definitivamente deberíamos discutir esto. Lamento mucho no poder revelar esto públicamente aún. Lo siento, 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 está funcionando correctamente puede ser un desafío debido a factores como el contexto y el stemming. Mientras que Algolia y Elastic pueden dar resultados diferentes, Orama te permite inyectar tu código y personalizar la búsqueda a tus preferencias utilizando hooks y componentes.

Muy bien. ¿Cómo pruebas que la búsqueda de texto funciona? Bueno, tenemos varias unit tests en primer lugar. Tenemos varias pruebas generativas y nos aseguramos cada vez que implementamos una nueva característica nos aseguramos de generar aún más unit tests en datos reales para garantizar su corrección. El mayor problema es determinar si la búsqueda está funcionando 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 exactamente los mismos resultados por varias razones. Entonces, ¿cómo determinas si está funcionando o no? Un hecho interesante sobre Orama es que puedes inyectar tu code y hacerlo funcionar y buscar como prefieras. Así que solo puedo garantizarte que está funcionando bien porque tenemos una adopción de la community que lo demuestra, tenemos unit tests y pruebas de integración que lo demuestran pero si no está funcionando como quieres que funcione siempre puedes usar los hooks y componentes para hacerlo funcionar como prefieras.

El cambio de marca de Orama y el significado del nombre

Short description:

Orama es una versión con cambio de marca 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 cambiar de marca fue principalmente para evitar confusiones e incorporar la empresa bajo un nombre único.

Genial, creo que la siguiente pregunta irá. Sí, ¿será Orama diferente de Lyra? Hablando de características. Oh, en absoluto. Solo tuvimos que cambiar la marca del nombre básicamente porque Lyra era un códec de Google y tuvimos algunos problemas con el nombre. También 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 lo sé. Tengo buenos sentimientos sobre el nombre pero eso es solo un cambio de nombre en realidad. No es nada más que eso.

Penalización del Recolector de Basura y Despliegue

Short description:

La penalización del recolector de basura es significativa para cargas de trabajo de alto volumen, pero no es una preocupación cuando se ejecuta 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 despliegues monolíticos en servidores Node.js. Los motores de búsqueda en JavaScript deberían ejecutarse en el borde o en el navegador.

Sí, 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? Así que cada vez que ejecutas en una CDN, realmente no te importa eso en absoluto porque cada vez que haces una consulta es probable que golpees un nodo diferente o un nodo que ya está desgastado por la solicitud anterior y siempre está en caché. Así que el hecho es que la penalización del recolector de basura es mala si tienes un conjunto de datos grande en el navegador pero no es probable que tengas un gran conjunto de data en el navegador. Siento que tener un despliegue monolítico en un servidor Node.js, no es bueno. Si querías eso, 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 asegurarlo. Así que mi opinión es que los motores de búsqueda construidos en JavaScript para ejecutarse en el borde deberían ejecutarse en el borde o en el navegador. Eso es realmente todo.

Razones para Elegir JavaScript Imperativo

Short description:

Solía escribir JavaScript funcional, pero descubrí que 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 puede que no haya estado escribiendo 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 usas un paradigma funcional? Por culpa de Matteo Collina, que está aquí sonriendo. No, porque tiene razón. Quiero decir, no es la forma más eficiente de escribir JavaScript code. Antes de unirme a NIRF y su equipo, trabajaba principalmente con JavaScript funcional. Luego descubrí que esta no es la mejor manera de escribir JavaScript. Y si cuentas el número... Quiero decir, los números son lo que importa 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 eso se deba a que estaba escribiendo un terrible JavaScript orientado a objetos o de programación funcional. Pero como lo escribo, mi código imperativo funciona mejor. Así que por eso es imperativo.

Beneficios de Implementar una Base de Datos Inmutable en una CDN

Short description:

Hay una pregunta sobre los benchmarks en comparación con Elastic Search. Estamos a punto de publicarlos. Implementar una base de datos inmutable en una 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 los benchmarks en comparación con Elastic Search. ¿Tienes alguna referencia?

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

Bien, creo que necesito elegir una última. Permíteme rápidamente... Oh, esa es buena. Sí, absolutamente. Esto es bueno por una cosa que no mencioné. Pero por ahora, necesito hacerlo. Si implementas una base de datos inmutable en una 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, implementarlos en una CDN, y no estás pagando nada hasta que comiencen a buscar. Lo que significa que cada usuario puede tener una experiencia de búsqueda diferente y personalizable y personalizada. ¿Verdad? Así que sí, puedes potenciar documentos en lugar de campos. Y puedes decir como, a Michele le gustan, no sé, las camisetas violetas. Así que cada vez que busca camisetas, tendrá campos potenciados para Violeta y camisetas juntas, ¿verdad? Porque tal vez tengo un historial de búsqueda o historial de conversión en e-commerce. Tal vez a otras personas como 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 está aumentando la conversión para tus usuarios, con suerte. Y así que 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

A Guide to React Rendering Behavior
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
Scaling Up with Remix and Micro Frontends
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.
Speeding Up Your React App With Less JavaScript
React Summit 2023React Summit 2023
32 min
Speeding Up Your React App With Less JavaScript
Top Content
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 Concurrency, Explained
React Summit 2023React Summit 2023
23 min
React Concurrency, Explained
Top Content
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
The Future of Performance Tooling
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.
Full Stack Components
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 Performance Debugging Masterclass
React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Top Content
Featured WorkshopFree
Ivan Akulov
Ivan Akulov
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 🤐)
AI on Demand: Serverless AI
DevOps.js Conf 2024DevOps.js Conf 2024
163 min
AI on Demand: Serverless AI
Top Content
Featured WorkshopFree
Nathan Disidore
Nathan Disidore
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.
Building WebApps That Light Up the Internet with QwikCity
JSNation 2023JSNation 2023
170 min
Building WebApps That Light Up the Internet with QwikCity
Featured WorkshopFree
Miško Hevery
Miško Hevery
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.
Next.js 13: Data Fetching Strategies
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Data Fetching Strategies
Top Content
WorkshopFree
Alice De Mauro
Alice De Mauro
- 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
Using CodeMirror to Build a JavaScript Editor with Linting and AutoComplete
React Day Berlin 2022React Day Berlin 2022
86 min
Using CodeMirror to Build a JavaScript Editor with Linting and AutoComplete
Top Content
WorkshopFree
Hussien Khayoon
Kahvi Patel
2 authors
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.
Testing Web Applications Using Cypress
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Testing Web Applications Using Cypress
WorkshopFree
Gleb Bahmutov
Gleb Bahmutov
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.