Registro Multihilo con Pino

Rate this content
Bookmark

Casi todos los desarrolladores piensan que agregar una línea de registro más no disminuiría el rendimiento de su servidor... ¡hasta que el registro se convierte en el mayor cuello de botella para sus sistemas! Creamos uno de los registradores JSON más rápidos para Node.js: pino. Una de nuestras decisiones clave fue eliminar todo el "transporte" a otro proceso (o infraestructura): redujo tanto el consumo de CPU como de memoria, eliminando cualquier cuello de botella del registro. Sin embargo, esto creó fricción y disminuyó la experiencia del desarrollador al usar Pino y los transportes en el proceso es la característica más solicitada por nuestro usuario.

En la próxima versión 7, resolveremos este problema y aumentaremos el rendimiento al mismo tiempo: estamos introduciendo pino.transport() para iniciar un hilo de trabajo que puedes usar para transferir tus registros de forma segura a otros destinos, sin sacrificar ni el rendimiento ni la experiencia del desarrollador.

19 min
11 Jun, 2021

Video Summary and Transcription

La charla de hoy es sobre el registro con Pino, uno de los registradores más rápidos para Node.js. La velocidad y el rendimiento de Pino se logran evitando el registro costoso y optimizando el procesamiento del bucle de eventos. Ofrece características avanzadas como el modo asíncrono y el registro distribuido. El uso de Worker Threads y Threadstream permite un procesamiento de datos eficiente. Pino.Transport permite el procesamiento de registros en un hilo de trabajo con varias opciones para destinos de registro. La charla concluye con una demostración de la salida del registro y una invitación para buscar oportunidades de trabajo.

Available in English

1. Introducción a la Registro con Pino

Short description:

Hoy voy a hablar sobre el registro. Trabajo para Nearform, una empresa de servicios profesionales con sede en Irlanda. Soy miembro del comité de dirección técnica y co-creador de Fastify y Pino. Pino es uno de los registradores más rápidos para Node.js con un conjunto de características mínimas. Se ha descargado 6 millones de veces al mes y estamos trabajando en la versión siete. Usar Pino es simple con una función de fábrica y ayuda a reducir la tasa de desplazamiento del registro dentro de su aplicación.

Hola a todos, soy Matteo Collina. Hoy voy a hablar sobre uno de mis temas favoritos, el registro. Solo un poco de introducción sobre mí antes de empezar. Soy Matteo Collina, en Twitter como Matteo Collina. Trabajo para una empresa llamada Nearform. Somos una empresa de servicios profesionales con sede en Irlanda. También soy miembro del comité de dirección técnica y soy el co-creador de Fastify y estas bibliotecas de las que estamos hablando hoy, Pino. También soy un arquitecto de software, por lo que normalmente ayudo a las empresas a ejecutar Node.js en producción. También escribo cada semana en mi nuevo boletín en nodeland.dev, por favor suscríbete.

De todos modos, como parte de mi, oh, esto es realmente importante. Tal vez tengo muchas descargas en NPM. Terminé manteniendo muchas cosas en el ecosistema porque como mi actividad como consultor, tiendo a equilibrar entre el trabajo del cliente y la necesidad del cliente con el mantenimiento de Node.js como ecosistema, y eso es una buena sinergia. Así que termino implementando nuevas bibliotecas y nuevos módulos para resolver problemas que tienen mis clientes, y traigo esas cosas nuevas a mis clientes. Como parte de esta iniciativa construí varias cosas como Fastify y Pino. Pino, ¿qué es Pino? Pino es uno de los registradores más rápidos para Node.js. Tiene un conjunto de características mínimas, así que hablaremos un poco sobre lo mínimo, y es una gran comunidad. Pino ahora se ha descargado 6 millones de veces al mes, y tenemos cuatro colaboradores. Tal vez tres, pero lo que sea, cuatro colaboradores. Y es la versión seis, y estamos trabajando en la versión siete. Esta charla, es sobre la versión siete. Hey, esto es realmente agradable. Así que vienen cosas nuevas.

¿Cómo usas Pino? Usar Pino es muy simple. Puedes simplemente crear tu registrador. Solo usa una función de fábrica, así que simplemente creas tu registrador, y luego empiezas a hacer info, advertencia, error, debug, esas cosas que te gustan. También tenemos esta funcionalidad de registrador hijo que te permite crear un nuevo hijo con un cierto conjunto de propiedades ya preestablecidas, y es un registrador JSON delimitado por nuevas líneas, por lo que produce JSON delimitado por nuevas líneas, por lo que es un JSON seguido de una nueva línea, y otro JSON seguido de una nueva línea. Bastante interesante. Es rápido, y puedes usar pnode para reducir drásticamente la tasa de desplazamiento del registro dentro de tu aplicación. Realmente no puedes llevarlo a cero porque todavía está haciendo IO al final, pero ayuda a reducirlo bastante. Sepa que el registro debe ser rápido.

2. La Velocidad y Rendimiento del Registro con Pino

Short description:

No deberías tener un registro muy costoso porque si tienes un registro muy costoso, entonces estarás inclinado a registrar menos y no más, y necesitas más observabilidad la mayoría de las veces. Pino ha estado alrededor por un tiempo, así que, hey, días felices. Y la mayoría de lo que decimos sigue siendo moderno. La primera parte que quiero cubrir sobre Pino es cómo es tan rápido. Este diagrama explica el bucle de eventos y cómo lograr un E/S muy eficiente en Node.js y aplicaciones de Node.js con rendimiento autorizado. Cuando eso aterriza en el terreno de JavaScript, significa que, bueno, antes de hacer eso, el bucle de eventos llamó a algún C++. Así que en el lado, el código C++ dentro de Node.js, luego iniciamos la función de JavaScript, que es una función que se ejecuta, que a su vez, podría resolver una promesa o programar un siguiente tick. Y por lo tanto, también tenemos que procesar las colas de microticks. Desde el momento en que nos movemos desde el... Empezamos a llamar dentro de C++ hasta el momento en que dejamos que C++ regrese, el bucle de eventos está bloqueado. Así que no hay más eventos, nada. No está pasando nada en términos de E/S en el sistema. Uno de los... ¿Qué pasa si tienes una operación de E/S lenta? Así que imaginemos en el contexto de inicio de sesión que estás escribiendo a un destino y necesitas hacer algún manejo y procesamiento de tus registros antes de moverlos. Ahora, debido a, ya sabes, y estás escribiendo todos esos registros y tienes un lento, entonces por lo tanto tienes una operación de E/S lenta y la cantidad de tareas, tareas concurrentes aumentan. Pero si la tarea concurrente, las tareas concurrentes asíncronas aumentan, entonces también aumenta el consumo de memoria de tu aplicación.

No deberías tener un registro muy costoso porque si tienes un registro muy costoso, entonces estarás inclinado a registrar menos y no más, y necesitas más observability la mayoría de las veces.

Hay esta agradable charla llamada el Costo del Registro que mi compañero de crimen, David Marklamas, y yo hemos dado en node-conf.eu 2016. Hace mucho tiempo, ¿sabes? Pero Pino ha estado alrededor por un tiempo, así que, hey, días felices. Y puedes comprobarlo porque fue una muy buena... Es una muy buena charla. Y la mayoría de lo que decimos sigue siendo moderno. Había un montón de cosas que son diferentes y vamos a cambiar en v7 de las que vamos a hablar pronto.

Entonces, bueno, la primera parte que quiero cubrir sobre Pino es cómo es tan rápido. ¿Cómo puede ser rápido? Bueno, solo quiero darte un poco de visión general. Y gracias, James. Estas diapositivas son increíbles. Este diagrama es probablemente uno de los mejores que hemos hecho. Este diagrama explica el bucle de eventos y explica cuándo estamos haciendo E/S y cómo podemos lograr y cómo lograr un E/S muy eficiente en Node.js y aplicaciones de Node.js con rendimiento autorizado.

Entonces, en primer lugar, tienes data que llega al bucle de eventos. Así que tienes data, tienes eventos que llegan. Así que alguna E/S ha terminado o tal vez ha llegado una solicitud HTTP. Cuando eso aterriza en el terreno de JavaScript, significa que, bueno, antes de hacer eso, el bucle de eventos llamó a algún C++. Así que en el lado, el código C++ dentro de Node.js, luego iniciamos la función de JavaScript, que es una función que se ejecuta, que a su vez, podría resolver una promesa o programar un siguiente tick. Y por lo tanto, también tenemos que procesar las colas de microticks. Después de que todo eso se ha dicho y hecho, volvemos al bucle de eventos. Desde el momento en que nos movemos desde el... Empezamos a llamar dentro de C++ hasta el momento en que dejamos que C++ regrese, el bucle de eventos está bloqueado. Así que no hay más eventos, nada. No está pasando nada en términos de E/S en el sistema. Esto no es genial. Bueno, o es genial en el sentido de que es, ya sabes, si quiero hacerlo rápido, si haces mi code rápido, el tiempo que paso ejecutando JavaScript necesita ser lo más pequeño posible. Entonces... Uno de los... ¿Qué pasa en, ya sabes, si tienes una operación de E/S lenta? Así que imaginemos en el contexto de inicio de sesión que estás escribiendo a un destino y necesitas hacer algún manejo y procesamiento de tus registros antes de moverlos. Ahora, debido a, ya sabes, y estás escribiendo todos esos registros y tienes un lento, entonces por lo tanto tienes una operación de E/S lenta y la cantidad de tareas, tareas concurrentes aumenta, ¿verdad? Pero si la tarea concurrente, las tareas concurrentes asíncronas aumentan, entonces también aumenta el consumo de memoria de tu aplicación.

3. Rendimiento y Características Avanzadas de Registro con Pino

Short description:

Si el consumo de memoria aumenta, se requiere más recolección de basura, que se ejecuta en la CPU. Esto puede llevar a una desaceleración en la CPU y una acumulación de eventos, lo que potencialmente puede causar un bloqueo. Para garantizar un buen rendimiento, Pino procesa los datos de forma sincrónica, evitando fugas de memoria. Pino también permite el modo asíncrono, aunque puede afectar la depuración. En 2016, Pino propuso un enfoque diferente para el registro, recomendando procesos separados o confiando en la infraestructura para el transporte de registros. Sin embargo, ahora Pino permite la distribución dentro del mismo proceso sin bloquear el hilo principal. Los usuarios han solicitado características como el formateo de registros, el envío de registros a destinos remotos, la implementación de la rotación de registros y el envío de múltiples registros a múltiples lugares simultáneamente.

Pero si el consumo de memoria aumenta, tienes que hacer más recolección de basura, que se ejecuta en la CPU. Y así, cuando la CPU se ejecuta, la recolección de basura crece, la memoria crece, la recolección de basura crece, crece en uso y luego la CPU se llena con la actividad de recolección de basura que hay que hacer. Ahora, ese es el problema, ya ves, porque la latencia y el rendimiento están profundamente conectados. Entonces, si tengo una operación lenta en mi code, entonces aumentará la concurrency, lo que aumentará la presión de la memoria, lo que ralentizará la CPU. Y es posible que debido a esa desaceleración en la CPU, la acumulación de eventos para procesar aumentará de nuevo y entrará en algún tipo de ciclo catastrófico donde hasta que la presión se alivie en algún lugar, todo estará bloqueado.

Entonces, ya sabes, el truco aquí es asegurarse de que la mayor parte del proceso se haga lo más rápido posible. Eso es todo, esa es la respuesta a esto. Y no programa más trabajo. Ahora, esto significa en el contexto del registro, por ejemplo, que si estás teniendo, si quieres enviar la misma línea de registro a múltiples destinos, será problemático porque tenemos, o especialmente incluso a través de una red, porque si intentamos hacer eso, esos data permanecerán vivos por más tiempo y en realidad estamos creando más trabajo para nuestro bucle de eventos. En Pino, hacemos todo el procesamiento de data de forma sincrónica. Así que cuando llamas a .info lo que sea, puedes estar seguro de que al usar el predeterminado, todo el procesamiento se hace dentro del macro tick. Así que no hay nada programado para ser ejecutado más tarde. Esto es fenomenal y realmente importante para obtener un buen rendimiento, porque nos aseguramos de que no queda memoria ubicada a la izquierda y se recicla esencialmente muy fácilmente. Ahora podrías activar el modo asíncrono en Pino para que el registro se borre después de un tiempo, y no se escriba inmediatamente, pero es un poco más difícil en el lado de la debugging. Hablaremos de eso en un segundo.

En la presentación original sobre Pino de 2016, teníamos esta luz sobre el hecho de que Pino es más que un módulo, es una forma de vida. Bueno, Pino, es más que un módulo. Y al principio, lo señalamos porque estaba claro que estábamos proponiendo algo radicalmente diferente. ¿Y qué estábamos proponiendo en 2016? Bueno, le decíamos a la gente, mira, necesitas implementar tu transporte como procesos separados o confiar en tu infraestructura. Así que registras en la salida estándar y tu infraestructura recoge la salida estándar y la envía a otro lugar. Sí, todavía recomendamos eso, eso no ha cambiado. Sin embargo, varios equipos se han acercado a nosotros y a nosotros también, pero realmente necesitamos ejecutar la distribución en nuestro proceso. El objetivo típico es enviar tu registro a data dog o a la búsqueda elástica o algo así. Bueno, Pino te permite hacer eso. Bueno, Pino pronto te permitirá hacer eso desde el mismo proceso sin bloquear el hilo principal. Lo veremos en un momento. Ya sabes, lo que pasó fue que todas las personas empezaron a pedirnos las mismas características. Querían formatear sus registros, querían enviarlos a un destino remoto. Querían implementar la rotación de registros, esto era una gran cosa. Y realmente querían enviar múltiples registros a múltiples lugares al mismo tiempo.

4. Uso de Worker Thread y Threadstream

Short description:

Podríamos haber utilizado Worker Thread, que ahora son estables en todas las líneas de lanzamiento de soporte a largo plazo de Node.js 12 y 14. Ofrecen primitivas de sincronización fáciles como Atomics. Comencé a escribir una biblioteca llamada Threadstream, que envuelve un Worker Thread en una API basada en streams. Es rápido y permite escribir cadenas y buffers. Al proporcionar un stream escribible, puedes enviar datos al WorkerThread. Esto proporciona una forma de enviar datos a mi WorkerThread como un stream.

Al decir, bueno, deberías hacer todas esas cosas fuera del proceso. Estábamos diciendo a todos esos equipos, bueno, necesitas que tus operaciones o tu DevOps se encarguen de esas cosas. Fue más difícil para la mayoría de los equipos, para ser honesto. Entonces, y los usuarios siguen haciendo estas preguntas todos los días, todos los días, todos los días. Entonces, ¿qué podríamos hacer? Bueno, había algo que podríamos haber hecho. Podríamos haber utilizado Worker Thread. Los Worker Thread ahora son estables en todas las líneas de lanzamiento de soporte a largo plazo de Node.js 12 y 14, por supuesto. Y ofrecen algunas primitivas de sincronización fáciles, como, por ejemplo, Atomics. Y es genial. Y tal vez podríamos usarlos para construir transportes, ¿verdad? Wow, bueno, ¿cómo? Primero que nada, esta idea no es nueva. Fue originalmente mostrada por Mark Martin en una conferencia hace unos años, donde estaba usando un complemento nativo para hacer la mayor parte de este trabajo. Y mostraba un gran potencial en términos de rendimiento y performance. Así que fue bastante genial. Entonces, lo que hice fue, empecé a escribir esta biblioteca llamada Threadstream. ¿Qué hace Threadstream? Bueno, esencialmente envuelve un Worker Thread en una API basada en streams. Así que no es puramente un stream escribible porque no hereda de un escribible, pero es rápido, y puedes escribir cadenas en él. Puedes escribir buffers. Así que básicamente, llamas a streams write y simplemente empiezas a escribir en tu Thread. Y en el otro Thread, necesitas proporcionar un stream escribible. Eso es todo. Esa es la única interfaz que necesitas proporcionar. Entonces, una vez que has hecho esto, que has proporcionado ambos, es realmente genial porque ahora tengo una forma de enviar data a mi WorkerThread como un stream. Pero ya sabes, un stream es la interfaz que PNO tiene. Así que veamos cómo usar eso.

5. Uso de Pinot Transport para el procesamiento de registros

Short description:

Queremos que nuestro hilo principal envíe registros a nuestro WorkerThread. Se comunican utilizando un Ring Buffer, lo que permite escribir y consumir sin bloqueo. Pinot.Transport es una nueva función que permite el procesamiento de registros en un hilo de trabajo. Ofrece varias opciones para destinos de registros e impresión bonita. Una demostración muestra el ejemplo básico de Pino y el uso de transportes para múltiples destinos.

Bueno, lo que hacemos es que queremos que nuestro hilo principal envíe registros a nuestro WorkerThread. Eso es lo que hacemos. Entonces, en una aplicación AV Node, tendremos dos hilos, uno para el principal y otro para el procesamiento de registros. ¿Cómo se comunican? Se comunican usando un Ring Buffer. Usar un Ring Buffer les permite escribir en este buffer en su mayoría sin bloquear el buffer en sí. Así que uno puede escribir y el otro puede consumir sin bloquearse entre ellos.

Entonces, siempre puedo determinar la parte a leer de ese trabajo. Así que ahora les voy a presentar Pinot Transport. He construido toda esta tensión y espero que la liberemos ahora mismo. Así que Pinot.Transport es una nueva función dentro de Pinot que te permite crear, hacer el procesamiento de registros en un transporte remoto, lo siento, en un hilo de trabajo que está envuelto como un transporte. Puedes usar modules, puedes especificar ya sea una dependencia o un solo archivo con una ruta absoluta, o puedes usar un archivo de destino o puedes usar una console e imprimir de manera bonita. Eso es todo. Así que en realidad puedes hacer muchas de esas cosas de diferentes maneras.

Así que es hora de una demostración. Así que lo que voy a hacer, voy a abrir Kibana y veremos nuestro camino. Así que es Kibana, tenemos los últimos cinco minutos, esto no es nada. Y tengo mi script. Así que primero voy a mostrarles el ejemplo y el ejemplo, este es el ejemplo básico de Pino, estos solo registran cosas y a la salida estándar. Así que lo que, lo que solíamos hacer es no ejemplo y ves que imprime esto, pero entonces podría hacer Pino Pretty y luego obtener una impresión bonita. Nota que lo que he hecho aquí es, ah, eso está bien. Así que lo que he hecho aquí es que he ejecutado en frío Node Modules Bean, punto bean barra Pino Pretty para embellecer y colorear mis bloqueos. Ahora lo que puedo hacer en su lugar es con los transportes es estos nuevos, oop yay, abrió de todos modos, yay. Y es usar esta nueva técnica donde estoy creando mi transporte Estoy especificando un archivo para un destino. Estoy especificando que voy a usar un Pino Elasticsearch para enviar los data a Elastic especificando que el nodo Elasticsearcher y haciendo una impresión bonita. Así que veamos cómo funciona. Así que he estado haciendo y oh nota que esto es el resto no cambia en absoluto. Es exactamente lo mismo. Y es bastante genial, ¿verdad? Porque puedo escribir mi transporte, no mantener mi aplicación pero hacer múltiples destinos en el mismo proceso. Bueno, ejecutemos esto. Así que si ejecuto ejemplo transportes, obtengo exactamente lo mismo...

6. Salida de Registro y Conclusión

Short description:

Obtuve exactamente la misma salida que antes. Solo se agregaron estas líneas de registro porque solo muestra los registros de advertencia. Y ahora puedes ver que también tienen registros dentro de Elasticsearch. Es realmente agradable porque tenemos todos nuestros datos de una manera fácil de procesar con Kibana. Gracias por ver esta charla. Si tienes más preguntas, por favor contáctame. Estamos contratando para todo tipo de roles.

Obtuve exactamente la misma salida que antes. Solo se agregaron estas líneas de registro porque de hecho, puedo, ya sabes, esto solo muestra los registros de advertencia. Vale, aquí está. Es bastante genial. Y luego podemos ver si estos se actualizaron. Y ahora puedes ver que también tienen registros dentro de Elasticsearch. Y es realmente agradable porque puedes ver que tenemos todos nuestros data de una manera realmente fácil de procesar que Kibana nos proporciona. Así que es bastante genial.

Genial, solo quería agradecerte por ver esta charla. Si tienes más preguntas sobre Pino y Fastify y Node.js, por favor contáctame o envíame un correo electrónico. Ah, por cierto, estamos hiring para todo tipo de roles. Así que si estás interesado, sí, échale un vistazo, adiós.

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

Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
Node Congress 2022Node Congress 2022
34 min
Out of the Box Node.js Diagnostics
In the early years of Node.js, diagnostics and debugging were considerable pain points. Modern versions of Node have improved considerably in these areas. Features like async stack traces, heap snapshots, and CPU profiling no longer require third party modules or modifications to application source code. This talk explores the various diagnostic features that have recently been built into Node.
You can check the slides for Colin's talk here. 
JSNation 2023JSNation 2023
22 min
ESM Loaders: Enhancing Module Loading in Node.js
Native ESM support for Node.js was a chance for the Node.js project to release official support for enhancing the module loading experience, to enable use cases such as on the fly transpilation, module stubbing, support for loading modules from HTTP, and monitoring.
While CommonJS has support for all this, it was never officially supported and was done by hacking into the Node.js runtime code. ESM has fixed all this. We will look at the architecture of ESM loading in Node.js, and discuss the loader API that supports enhancing it. We will also look into advanced features such as loader chaining and off thread execution.
Node Congress 2023Node Congress 2023
30 min
Building a modular monolith with Fastify
Top Content
In my journey through Nodeland, I saw most teams struggling with the free-form nature of Node.js development: there are no guardrails for maximum flexibility. Yet, not all paths offer a smooth ride.
How to build applications that are well-organized, testable, and extendable? How could we build a codebase that would stand the test of time?
In this talk, we will explore how to avoid the trap of Singletons to create robust Node.js applications through the use of Fastify plugins: we will build a modular monolith!

Workshops on related topic

Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Top Content
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Platformatic allows you to rapidly develop GraphQL and REST APIs with minimal effort. The best part is that it also allows you to unleash the full potential of Node.js and Fastify whenever you need to. You can fully customise a Platformatic application by writing your own additional features and plugins. In the workshop, we’ll cover both our Open Source modules and our Cloud offering:- Platformatic OSS (open-source software) — Tools and libraries for rapidly building robust applications with Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (currently in beta) — Our hosting platform that includes features such as preview apps, built-in metrics and integration with your Git flow (https://platformatic.dev/). 
In this workshop you'll learn how to develop APIs with Fastify and deploy them to the Platformatic Cloud.
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.JS backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.
Table of contents- A quick intro to core authentication concepts- Coding- Why passwordless matters
Prerequisites- IDE for your choice- Node 18 or higher
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.
React Summit 2022React Summit 2022
164 min
GraphQL - From Zero to Hero in 3 hours
Workshop
How to build a fullstack GraphQL application (Postgres + NestJs + React) in the shortest time possible.
All beginnings are hard. Even harder than choosing the technology is often developing a suitable architecture. Especially when it comes to GraphQL.
In this workshop, you will get a variety of best practices that you would normally have to work through over a number of projects - all in just three hours.
If you've always wanted to participate in a hackathon to get something up and running in the shortest amount of time - then take an active part in this workshop, and participate in the thought processes of the trainer.
TestJS Summit 2023TestJS Summit 2023
78 min
Mastering Node.js Test Runner
Workshop
Node.js test runner is modern, fast, and doesn't require additional libraries, but understanding and using it well can be tricky. You will learn how to use Node.js test runner to its full potential. We'll show you how it compares to other tools, how to set it up, and how to run your tests effectively. During the workshop, we'll do exercises to help you get comfortable with filtering, using native assertions, running tests in parallel, using CLI, and more. We'll also talk about working with TypeScript, making custom reports, and code coverage.