Profundizando en Undici

Rate this content
Bookmark

Undici, el cliente HTTP de próxima generación construido por el equipo principal de Node.js, alimenta el fetch() principal de Node.js. Vamos a adentrarnos en sus entresijos, descubriendo cómo trabajar con Despachadores, Agentes y Pools. Por último, pero no menos importante, incluso haremos algo de magia.

Matteo Collina
Matteo Collina
24 min
04 Apr, 2024

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Undici es un cliente HTTP moderno para Node.js que ofrece un rendimiento mejorado y características avanzadas. Admite HTTP 1.1 y recientemente agregó soporte para HTTP 2.0. Undici ofrece un rendimiento impresionante, especialmente con Undici.Stream. También admite el encolamiento de HTTP 1.1, lo que puede reducir significativamente el tiempo de respuesta. Undici ofrece una gestión flexible de conexiones y despachadores, así como interceptores para personalización. Undici v7 viene con APIs mejoradas y un tiempo de ejecución programático para ejecutar múltiples microservicios en el mismo proceso.

Available in English

1. Introducción

Short description:

Hola a todos, soy Matteo Collina, cofundador y CTO de Platformatic, y hoy voy a profundizar en Undici, la nueva biblioteca HTTP construida por el equipo principal de Node. Unas palabras sobre mí, soy parte del Comité de Dirección Técnica de Node.js, así como miembro de la Junta de la Fundación OpenJS. He creado algunas bibliotecas que es posible que utilices. Hablé de ellas en el Congreso de Node varias veces, por lo que es posible que quieras echarles un vistazo, tanto Fastify como Pino si te gustan. Trabajé ocho años como consultor y luego decidí iniciar una startup. Aquí está Platformatic. Tengo un boletín en node.landofdev, un canal de YouTube, y así sucesivamente. Puedes echarle un vistazo. Pero en todo esto, la parte importante es que es probable que estés utilizando mis cosas, porque mis módulos fueron descargados 22 mil millones de veces el año pasado, lo que probablemente incluye a ti también, que estás viendo este video.

Hola a todos, soy Matteo Collina, cofundador y CTO de Platformatic, y hoy voy a profundizar en Undici, la nueva biblioteca HTTP construida por el equipo principal de Node. Unas palabras sobre mí, soy parte del Comité de Dirección Técnica de Node.js, así como miembro de la Junta de la Fundación OpenJS. He creado algunas bibliotecas que es posible que utilices. Hablé de ellas en el Congreso de Node varias veces, por lo que es posible que quieras echarles un vistazo, tanto Fastify como Pino si te gustan. Trabajé ocho años como consultor y luego decidí iniciar una startup. Aquí está Platformatic. Tengo un boletín en node.landofdev, un canal de YouTube, y así sucesivamente. Puedes echarle un vistazo. Pero en todo esto, la parte importante es que es probable que estés utilizando mis cosas, porque mis módulos fueron descargados 22 mil millones de veces el año pasado, lo que probablemente incluye a ti también, que estás viendo este video.

2. Undici: Cliente HTTP para Node.js

Short description:

Undici es un cliente HTTP moderno escrito desde cero para Node.js. Es fácil de empezar a usar y proporciona todas las características esperadas como código de estado, encabezados, remolques y cuerpo. Undici también es el hogar de fetch para Node.js y tiene como objetivo una alta compatibilidad con las especificaciones. Ofrece un rendimiento mejorado y una separación completa entre la API y la gestión de conexiones. Undici proporciona agrupamiento de conexiones y admite interceptores para la integración.

Hablemos un poco sobre Undici. Undici es un cliente HTTP relativamente nuevo o moderno escrito desde cero para Node.js. ¿Qué significa desde cero? Significa que no se basa en el módulo interno HTTP y HTTPS, sino que lo creamos desde cero. Undici, sin color aquí, significa 11 en italiano y proviene de HTTP 1.1. También es una referencia a Stranger Things porque estaba viendo Stranger Things cuando esto comenzó a venir a mi mente.

¿Cómo funciona? Es muy fácil de empezar a usar, para ser honesto. Solo puedes importar solicitudes de Undici y simplemente colocar tu URL, y obtienes todas las cosas que esperarías. Obtienes el código de estado, encabezados, remolques y cuerpo. Obtienes todas las cosas. Ten en cuenta que ha implementado la misma mezcla de cuerpo de fetch, por lo que puedes esperar body.json, por ejemplo. Algo muy importante para recordar es que cuando obtienes un cuerpo, por favor, consúmelo. Hay cierta lógica interna que se asegurará de que las cosas se manejen correctamente, pero límpialo si es posible. Undici también es el hogar de fetch para Node.js. Cuando usas fetch dentro de Node.js, en realidad estás usando fetch de Undici y Node.js incluye internamente Undici. Es un fetch compatible con las especificaciones que te gusta y amas. Eso es más o menos todo lo que necesita ser dicho. Estamos trabajando muy duro para tener la mayor compatibilidad con las especificaciones posible, por lo que en teoría esto debería funcionar lo más cerca posible del fetch que estás ejecutando en tu navegador y también en otros entornos de ejecución. Si necesitas tener compatibilidad con las especificaciones, si quieres trabajar en la compatibilidad con las especificaciones para fetch, Undici es el lugar adecuado.

¿Cuáles son las cosas buenas de Undici? En primer lugar, Undici tiene un rendimiento mejorado. Hablaremos de eso más adelante. Tengo algunas diapositivas geniales. También crea una separación completa entre la API, la API pública, la experiencia del desarrollador y cómo se maneja la gestión de conexiones. Algo que no estaba presente en la solicitud HTTP y en el módulo HTTP y HTTPS. También tiene múltiples implementaciones. Dije agrupamiento. Sí, dije agrupamiento. HTTP es un protocolo basado en conexiones, por lo que probablemente quieras hacer agrupamiento de conexiones. A pesar de lo que dice la literatura de que HTTP es un protocolo sin estado, en realidad es sin estado porque se trata de una conexión con estado... ¿Cómo es esto posible? Bueno, sí, por supuesto, porque es sin estado en el sentido de la semántica, pero se implementa sobre una conexión con estado, TCP y TLS, por supuesto.

3. Undici: Funciones Avanzadas y Rendimiento

Short description:

Undici es mantenido por el equipo principal de Node y ofrece soporte para HTTP 1.1 y recientemente agregó soporte para HTTP 2.0. Los módulos HTTP son un desastre debido a la misma estructura de API para el cliente y el servidor de HTTP 1.0. Para superar esto, se creó undici.request para ser rápido y altamente configurable, utilizando el flujo de Node.js y admitiendo la agrupación de HTTP 1.1. Undici Fetch está diseñado para cumplir con las especificaciones y utiliza internamente WhatWGstream. También admite HTTP2 y la agrupación de HTTP. Undici ofrece un rendimiento impresionante, especialmente con Undici.Stream.

Hablaré sobre qué son los interceptores y cómo integrarse con ellos. Además, es mantenido por el equipo principal de Node, el equipo de HTTP y, de hecho, la mayoría de nosotros pensamos que HTTP.request es casi irremediable y por eso es en lo que estamos trabajando en su lugar. Al principio, comenzó con soporte solo para HTTP 1.1, luego también agregamos recientemente soporte para HTTP 2.0, y ahora es... Sabes, el nombre Undici puede que ya no sea la mejor referencia. De todos modos, entonces... Además, tenemos HTTP 1.1. También tiene soporte para agrupación de HTTP 1.1. Así que... También... Algo que es un poco... Hay algunas cosas que son diferentes en él, por lo que es posible que experimentes algunos errores con los que debas lidiar, en esencia. Entonces, ¿por qué? Bueno, el problema es que los módulos HTTP son un desastre, ¿vale? Principalmente porque utilizan la misma estructura de API tanto para el cliente como para el servidor de HTTP 1.0, y ambos están vinculados con la gestión de conexiones con la API pública. Entonces, ¿cómo puedes verlo? Bueno, tienes una propiedad request.socket, ¿vale? El hecho de que tengas una propiedad request.socket te dirá que hay este tipo de conexión, porque si tu sistema ya no está en socket, como en HTTP 2.0, ¿cómo lo implementarías? Y esta es la razón por la que no puedes admitir tanto HTTP 1.1 como HTTP 2.0 en la misma API. Por último, pero no menos importante, no podemos cambiar esas clases sin romper express. Entonces, sí, bueno, esa es la situación. Por eso creamos undici.request para que sea lo más rápido posible, porque hacer una solicitud HTTP no debería ser el cuello de botella de tu aplicación. También proporciona una experiencia de desarrollo lo suficientemente buena, una muy buena experiencia de desarrollo, desde mi punto de vista. Es altamente configurable, utiliza el flujo de Node.js, admite la agrupación de HTTP 1.1. Es genial. Solo usa esto. Probablemente este es el code que quieres usar, ¿vale? Undici Fetch está diseñado para cumplir con las especificaciones, ¿vale? Entonces, no coloca elperformance como la máxima prioridad. Es la conformidad con las especificaciones lo que importa. Y en este momento, estamos pasando el 88% de las pruebas WPT que estamos ejecutando para Fetch. Así que creo que la compatibilidad es bastante buena en general. Sin embargo, internamente utiliza WhatWGstream, por lo que puedes usar Pipe2, WhatWGstream, todas las cosas, el flujo legible, como en el navegador. Entonces, todo el code que utiliza Undici Fetch y Fetch Node podría ser isomórfico. Nuevamente, el manejo del protocolo y la API están completamente separados, por lo que todas las cosas de las que vamos a hablar, Undici y la gestión de conexiones y demás, se aplican a ambos. Y esta es la razón por la que Undici Fetch se construyó sobre Undici. Fetching Node se construyó sobre Undici. También admite HTTP2, la agrupación de HTTP, debido a esta separación. Bueno, hablemos deperformance, porque esto es lo crítico, ¿vale? Entonces, lo cual, ya sabes, los números son realmente significativos aquí, ¿vale? Como Undici es prácticamente sin restricciones, ¿vale? Puedes usar, en este sistema detesting, puedes usar Undici, una de las API de nivel más bajo, que es Undici.Dispatch, pero para ser honesto, esto no es lo que deberías estar usando, ¿vale? Es la parte subyacente, o Undici.Stream, que es,

4. Undici: Rendimiento y Velocidad de las Solicitudes

Short description:

Realizar solicitudes HTTP no debería ser el cuello de botella de tu aplicación con Undici.Request. Undici ofrece un rendimiento impresionante, especialmente con Undici.Stream.

ya sabes, aún más rápido, pero nuevamente, probablemente demasiado bajo nivel. Puedes lograr un gran número de solicitudes desde un solo proceso de nodo, ¿vale? Enviar 20,000, 21,000 solicitudes por segundo, es muchas solicitudes que vas a enviar, ¿vale? Entonces, en esencia, nuestro objetivo es que realizar solicitudes HTTP no sea el cuello de botella de tu aplicación con Undici.Request. Y puedes ver cómo se están configurando las otras APIs. Tenemos SuperAgent, tenemos HTTP de Node Core, tenemos Axios, cómo se desempeña Axios, tenemos el módulo de solicitud de la vieja escuela, cómo se desempeña y luego tenemos Undici.Fetch, que en realidad es más lento, ¿vale? Como dije, hay muchas cosas que se pueden optimizar aún, pero es solo un poco más rápido que Node.Fetch, lo cual es genial, y luego tenemos

5. Undici: HTTP 1.1 Pipelining

Short description:

Si estás experimentando problemas de rendimiento al hacer solicitudes HTTP, cambia a Undici. La canalización de HTTP 1.1 permite enviar múltiples solicitudes al mismo tiempo, reduciendo significativamente el tiempo de respuesta. Sin embargo, puede ocurrir bloqueo de cabeza de línea si la primera solicitud se retrasa. A pesar de esto, la canalización puede mejorar el rendimiento, especialmente al llamar a microservicios.

al final. Ok, solo para aclarar, todo esto es realmente muy importante tener en cuenta, que si estás experimentando algún problema de rendimiento al hacer solicitudes HTTP, probablemente deberías cambiar a Undici. Hablo mucho sobre la canalización de HTTP 1.1, y necesito, realmente quiero explicarlo, ¿de acuerdo? Porque de lo contrario probablemente no sabrás de qué estoy hablando. Entonces, en una solicitud HTTP normal, cuando abres un cliente, una solicitud de un cliente a un servidor, ¿de acuerdo? En primer lugar, hay un ping pong, ¿de acuerdo?, de abrir la solicitud HTTP, ¿de acuerdo? Además de eso, debes agregar TLS si hay TLS. Sí, muchos intercambios. Una vez que tienes esta conexión establecida, ¿de acuerdo?, el cliente envía una solicitud a ese socket, ¿de acuerdo? Una vez que el socket vuelve, realiza el procesamiento y lo devuelve al principio, y luego puede enviar una segunda solicitud en ese socket. Hablé mucho sobre la agrupación de conexiones. Entonces, tienes, en esencia, si quieres hablar con otro microservicio en tu red, tienes, no sé, tres, cuatro, cinco, 10, 20, 50, lo que sea conexiones. Entonces, quieres, ya sabes, asignar una conexión a una solicitud hasta que obtengas la siguiente, la siguiente solicitud después. Entonces, si tienes 50 conexiones, en esencia, significa que solo puede haber 10 conexiones, lo siento, 50 solicitudes en proceso en general, porque cada una conexión, una solicitud, ¿de acuerdo? La canalización cambia eso. Entonces, con la canalización, podemos enviar dos solicitudes al mismo tiempo, ¿de acuerdo? Podemos enviar una solicitud, podemos enviar dos solicitudes al mismo tiempo, una tras otra. Ahora, esto es genial porque realmente podemos reducir el tiempo de respuesta significativamente porque enviamos dos mensajes y podemos ahorrar todo el tiempo de ida y vuelta, ¿de acuerdo? Luego, los servidores deberán analizarlos uno tras otro y luego enviarnos los resultados, ¿de acuerdo? Lo cual está bien porque si te deslizas en este ejemplo, se tarda 172 milisegundos en obtener ambas respuestas, mientras que en el otro son 228. Entonces, en realidad estamos respondiendo más rápido y recibiendo los datos de vuelta más rápido, pero hay un problema, ¿de acuerdo? ¿Qué sucede si la primera solicitud se retrasa? Si la primera solicitud se retrasa, ¿de acuerdo?, como puedes ver en este ejemplo, en realidad estamos perdiendo mucho procesamiento, ¿de acuerdo? La segunda, la más corta, necesita esperar para ser enviada, ¿de acuerdo? Porque primero necesito enviar la primera y luego necesito enviar la segunda. Este fenómeno se llama bloqueo de cabeza de línea. Entonces, ¿de acuerdo? Genial, no tan genial, necesitas tener esto en cuenta, ¿de acuerdo? Pero especialmente al llamar a microservicios, esto probablemente está bien o en mi experiencia esto está bien y puede ayudarnos a lograr mucho, mucho, mucho más rendimiento porque

6. Undici: Gestión de conexiones

Short description:

Separaremos la API de la parte interna y gestionaremos manualmente el grupo de conexiones. La parte clave de la gestión de conexiones es el despachador, que se puede cambiar utilizando SetGlobalDispatcher. La jerarquía de despachadores incluye la clase abstracta, el despachador para la gestión de conexiones, el cliente y el grupo. El grupo equilibrado utiliza un algoritmo para elegir el socket con la mejor latencia. El agente permite trabajar en múltiples grupos, uno para cada origen.

podemos utilizar nuestros sockets de una manera mucho mejor, ¿de acuerdo? Entonces, echemos un vistazo a cómo funciona esto. Y en primer lugar, queremos proporcionar la base para HTTP a continuación. Y, como dije, separaremos la API de la API, la API que los usuarios utilizan de la parte interna. Entonces, hay dos capas separadas, completamente independientes entre sí. Y todas las partes internas están basadas en devoluciones de llamada. No se basan en devoluciones de llamada de error y no se basan en eventos, ¿de acuerdo? Entonces, se basan en un mecanismo de nivel inferior que es extremadamente rápido. Entonces, no tenemos ningún sobrecargo en absoluto.

Además, gestionamos manualmente nuestro grupo de conexiones, ¿de acuerdo? Y puedes hacer diferentes cosas. Y somos muy exigentes con el sobrecargo y la asignación de memoria. Por último, pero no menos importante, minimizamos la transición entre C, C++ y JavaScript. Entonces, la parte clave de la gestión de conexiones y cómo interactúas con las partes internas es mediante el concepto de un despachador. Y hay una API en Undici llamada SetGlobalDispatcher. Entonces, si quieres cambiar el despachador global o el mecanismo global para manejar la solicitud HTTP, puedes hacerlo en cualquier momento a través de la biblioteca Undici, llamando a SetGlobalDispatcher y pasando un agente u otra cosa de la que hablaremos pronto. Puedes configurar muchas cosas. Puedes poner muchos parámetros aquí. Así que échale un vistazo. Ahora, lo importante es tener en cuenta que llamar a SetGlobalDispatcher desde Undici también cambiará el de fetch en Node.js, ya que ambas cosas están diseñadas para ser completamente interoperables.

Entonces, ¿cuál es la jerarquía de esos despachadores? Tenemos una clase abstracta de despachador, que incluye muchas cosas. E incluye muchos de los métodos sofisticados. Y luego tenemos una clase abstracta que implementa el despachador para la gestión de conexiones. Y a partir de ahí, tenemos el cliente, que envuelve un socket, una conexión. Luego tenemos el grupo. Y el grupo es un conjunto de clientes, básicamente. Entonces, si el grupo recibe una solicitud, dice: `Oh, dame un cliente libre`. De lo contrario, espera. El grupo equilibrado es un sistema alternativo que utiliza un algoritmo reciente que se publicó en un artículo reciente que nos permite elegir el socket que ofrecerá la mejor latencia para esa solicitud específica. ¿Cómo funciona? Sí, es un algoritmo complejo. Así que échale un vistazo. Utiliza mucho peso y matemáticas para hacer su trabajo. ¿Qué hace el agente? Bueno, el agente te permite trabajar

7. Undici: Dispatchers and Interceptors

Short description:

El agente coordina las solicitudes al grupo correcto y permite la creación de un agente simulado. El método de despacho del despachador separa la interfaz de nivel inferior de la de nivel superior. Se puede utilizar un agente de reintento para volver a intentar las solicitudes HTTP que fallan. Los interceptores de despacho ofrecen una alternativa a la clase de despachador. El módulo UndiciOIDCInterceptor emite automáticamente tokens OIDC de máquina a máquina para las solicitudes a destinos específicos.

a través de un grupo de grupos. Uno para cada origen. Entonces, si tienes una combinación de dominio más puerto, o IP más puerto, entonces el agente es el sistema que lo coordina y envía una solicitud al grupo correcto. Este sistema también nos permite implementar un agente simulado o un sistema simulado para Undici, que está integrado. Entonces, en realidad puedes configurar un agente simulado, y el agente simulado se puede configurar para interceptar solo algunas solicitudes. Entonces, si configuras esto, puedes interceptar una solicitud y puedes envolverla a través del agente simulado. Parece fantástico, ¿verdad? No hay parches de monos ni nada por el estilo. Esto funciona directamente desde el principio. ¿Por qué se llama despachador, sin embargo? Bueno, porque un despachador tiene los métodos más importantes, y el método de despacho es el método de despacho. Y el método de despacho toma un objeto de opciones que describe la solicitud y un controlador para esa solicitud. Un controlador es un objeto complejo que implementa muchas devoluciones de llamada para muchos estados diferentes de la solicitud HTTP. Y si estás llamando a dispatcher.request internamente para usar un controlador de solicitud, y stream, controlador de transmisión, fetch, controlador de fetch, pipeline, controlador de pipeline, sí, parece correcto, ¿de acuerdo? Y así es como separamos la interfaz de nivel inferior que es el despacho, y el nivel superior, como solicitud, fetch, stream, y así sucesivamente. ¿Cuántos métodos hay? Bastantes, en realidad, porque necesitamos rastrear todas las cosas. Entonces tenemos connect, ¿de acuerdo? Tenemos non-connect, onError, onUpgrade, onResponseStarted, onHeaders, onData, onComplete y onBodySent. ¿Sí? Bastante genial, ¿verdad? Bueno, este sistema nos permite crear algo como un agente de reintento. Entonces, imaginemos que quieres volver a intentar tu solicitud HTTP porque están fallando, por cualquier motivo. Bueno, el agente de reintento simplemente hace eso, ¿de acuerdo? Está integrado, ¿de acuerdo? Así que no necesito hacer mucho. Puedo configurarlo como un agente global, o simplemente puedo llamarlo. Funciona muy bien. Internamente, esto, implementa un controlador de reintento. Entonces, el agente de reintento, cuando recibe el método de despacho, crea un controlador de reintento, que básicamente envuelve el controlador anterior y agrega cierta lógica de reintento. ¡Hey! Eso funciona, ¿de acuerdo? Bastante genial, ¿verdad? Y es interminable hasta el final Y una de las opciones en el interior, para el despachador, son los interceptores de despacho, ¿de acuerdo? Lo siento, y los interceptores de despacho son simplemente objetos que tienen una función de despacho. Eso es todo, ¿de acuerdo? Que ofrece la misma API que la clase de despachador, ¿de acuerdo? Pero un interceptor solo, es un objeto que solo tiene despacho. El otro, el despachador también tiene muchos otros métodos en él, ¿de acuerdo? Y por ejemplo, lo que he creado, es un sistema para emitir automáticamente tokens OIDC de máquina a máquina para cada solicitud que sale hacia un destino específico. En este ejemplo, y puedes comprobarlo, es un módulo separado llamado UndiciOIDCInterceptor. Y cuando creas un agente, puedes configurar tus interceptores en el code, ¿de acuerdo? Es bastante, es bastante genial. Es bastante bueno desde mi punto de vista. Y puedes comprobarlo, en esta diapositiva a la derecha, puedes ver un gran ejemplo de cómo se ve el proveedor. Es mucho, ¿de acuerdo? Es mucho code, mucha configuración, pero es

8. Undici: Nuevas APIs y Plataforma de Ejecución

Short description:

Undici v7 viene con APIs mejoradas. Los resultados de referencia muestran que la mayor parte del tiempo se gasta en inicializar los streams WOTUG. El nuevo RFC 9110 de HTTP permite implementar lógica HTTP en cualquier cosa. El despachador Fastify Undici omite la lógica de solicitud HTTP para enrutar las solicitudes al servidor Fastify. La plataforma de ejecución permite ejecutar múltiples microservicios en el mismo proceso.

compatible con Auth0, por ejemplo. Es compatible con cualquier cosa que sea compatible con OIDC y admita tokens de máquina a máquina. Muy bueno desde mi punto de vista. Pero ten cuidado, porque probablemente en la próxima versión de Undici v7, cambiaremos estas APIs. Así que estamos trabajando en algo mejor.

Entonces, a partir del code, el ejemplo que hicimos al principio, te preguntas por qué fetch es bajo, ¿de acuerdo? Así que me tomé la libertad de ejecutar esta referencia. Muy simple, muy, para ser honesto, bastante directo. Emitimos cien mil solicitudes de fetch localmente y obtenemos el texto. Y eso es todo. Y te sorprenderá mucho dónde estamos gastando el tiempo. Todo el tiempo, la mayor parte del tiempo, el 50 por ciento del tiempo se gasta en inicializar los streams WOTUG, ¿de acuerdo? No en el procesamiento HTTP, no en nada más, solo en la inicialización. ¿Por qué los streams WOTUG son tan costosos en la inicialización? Bueno, esta es una respuesta larga y desafortunadamente probablemente valdría la pena una charla por sí sola, pero está relacionada con el hecho de que son transferibles. ¿Qué es eso? Sí, bueno, como dije, probablemente valga la pena una charla por sí sola. Así que algo que hace todo esto significa que también puedes usar la lógica del despachador para hacer algo de magia, ¿de acuerdo? De hecho, debido a cómo funciona esto, el nuevo RFC 9110 de HTTP simplemente separa la semántica de los transportes, de HTTP 1 y HTTP 2.2. Entonces, básicamente, el formato de conexión ahora es solo un detalle de implementación. Básicamente, significa que podemos implementar la lógica de HTTP, ¿de acuerdo? La semántica de HTTP en prácticamente cualquier cosa, lo cual es fantástico. Esto significa que podemos desvincular completamente nuestro sistema del transporte HTTP. De hecho, esta es la lógica que usamos para el multiplexor. Entonces, de hecho, podríamos implementar un sistema que haga HTTP sin red. Para hacer eso, necesitamos una forma de inyectar una solicitud HTTP en otro servidor, lo cual es bastante bueno, ¿de acuerdo? Este módulo se llama LightMyRequest, y de hecho, está integrado en uno de los frameworks que construí llamado Fastify. Y es un framework bastante bueno, pero puedes tomarlo y llamar a inject en él, y esto funciona sin abrir ningún socket HTTP. Entonces, lo que podrías hacer es implementarlo con Fastify, el despachador Fastify Undici, que es otro despachador de Undici que omite completamente la lógica de solicitud HTTP y crea básicamente una red de malla dentro de tu proceso para enrutar tus solicitudes a tu servidor Fastify. Es bastante fantástico. De hecho, es lo que usamos en mi startup. Se llama platformatic, y ayudamos a los desarrolladores a deshacerse y diferenciar el trabajo pesado de construir aplicaciones Node.js. De hecho, te hacemos ir muy rápido de A a B, y luego te ayudamos a ir exactamente donde necesitas ir, dándote todas las herramientas como un SUV muy, muy simple. Entonces, sí, todo esto, que te conté, alimenta la nueva plataforma de ejecución platformatic, que es un sistema para ejecutar múltiples microservicios dentro de la misma caja, dentro del mismo proceso. Y no sé, échale un vistazo. Está ahí. No creo que tenga tiempo para una demostración, pero mantente atento, porque publicaré algo más temprano que tarde en este frente. Y muchas gracias por ver, 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

It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
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.
Towards a Standard Library for JavaScript Runtimes
Node Congress 2022Node Congress 2022
34 min
Towards a Standard Library for JavaScript Runtimes
Top Content
You can check the slides for James' talk here.
Out of the Box Node.js Diagnostics
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. 
ESM Loaders: Enhancing Module Loading in Node.js
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.js Compatibility in Deno
Node Congress 2022Node Congress 2022
34 min
Node.js Compatibility in Deno
Can Deno run apps and libraries authored for Node.js? What are the tradeoffs? How does it work? What’s next?
Multithreaded Logging with Pino
JSNation Live 2021JSNation Live 2021
19 min
Multithreaded Logging with Pino
Top Content
Almost every developer thinks that adding one more log line would not decrease the performance of their server... until logging becomes the biggest bottleneck for their systems! We created one of the fastest JSON loggers for Node.js: pino. One of our key decisions was to remove all "transport" to another process (or infrastructure): it reduced both CPU and memory consumption, removing any bottleneck from logging. However, this created friction and lowered the developer experience of using Pino and in-process transports is the most asked feature our user.In the upcoming version 7, we will solve this problem and increase throughput at the same time: we are introducing pino.transport() to start a worker thread that you can use to transfer your logs safely to other destinations, without sacrificing neither performance nor the developer experience.

Workshops on related topic

Node.js Masterclass
Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Top Content
Workshop
Matteo Collina
Matteo Collina
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
Build and Deploy a Backend With Fastify & Platformatic
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Matteo Collina
Matteo Collina
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.
0 to Auth in an Hour Using NodeJS SDK
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Asaf Shen
Asaf Shen
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
Building a Hyper Fast Web Server with Deno
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Matt Landers
Will Johnston
2 authors
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.
GraphQL - From Zero to Hero in 3 hours
React Summit 2022React Summit 2022
164 min
GraphQL - From Zero to Hero in 3 hours
Workshop
Pawel Sawicki
Pawel Sawicki
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.
Mastering Node.js Test Runner
TestJS Summit 2023TestJS Summit 2023
78 min
Mastering Node.js Test Runner
Workshop
Marco Ippolito
Marco Ippolito
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.