Construyendo un monolito modular con Fastify

Spanish audio is available in the player settings
Rate this content
Bookmark

En mi viaje por Nodeland, vi que la mayoría de los equipos luchaban con la naturaleza libre del desarrollo de Node.js: no hay barreras para la máxima flexibilidad. Sin embargo, no todos los caminos ofrecen un viaje sin problemas.
¿Cómo construir aplicaciones bien organizadas, testables y extensibles? ¿Cómo podríamos construir una base de código que resistiera el paso del tiempo?
En esta charla, exploraremos cómo evitar la trampa de los Singletons para crear aplicaciones robustas de Node.js a través del uso de plugins de Fastify: ¡construiremos un monolito modular!

30 min
14 Apr, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Fastify es una herramienta poderosa para construir aplicaciones web y APIs en Node.js, con millones de descargas al mes. Promueve la encapsulación y la estructuración a través de plugins y decoradores, permitiendo la segmentación del código y los datos. La charla enfatiza la importancia de modularizar las aplicaciones por dominios y características, y muestra una demostración de una aplicación típica de Fastify. El orador también discute los beneficios de usar Platformattic para refactorizar y lanzar aplicaciones de Fastify en la nube. La sección de preguntas y respuestas aborda temas como la inyección de dependencias y la depuración, y también destaca la importancia de separar la lógica empresarial de los contratos de la API.

Available in English

1. Introducción a Fastify

Short description:

Feliz de estar aquí en el Congreso de Node. Hablando de Fastify, una poderosa herramienta para construir aplicaciones web y APIs en Node.js. Tiene un registro incorporado llamado Pino. Fastify es ampliamente utilizado con millones de descargas al mes. El problema de usar un sistema de modelo vista controlador es que no escala bien en complejidad. En lugar de construir una capa de vista, nos enfocamos en construir APIs. Esto puede llevar a una gran cantidad de modelos y un archivo routes.js largo.

Así que, feliz de estar aquí en el Congreso de Node. He estado... Mira, he sabido sobre esta conferencia por un tiempo, y es genial finalmente estar aquí en Berlín. Ha pasado mucho tiempo desde que vine a Berlín, y lo extrañaba un poco. Así que, mira, estoy aquí hablando de Fastify. Así que, es genial estar aquí, y así sucesivamente.

Así que, un par de cosas sobre mí. También tengo un boletín, y en el Reino Unido, si no importa, simplemente suscríbete allí, o sígueme en Twitter, en Matteo Collina. Y también estoy transmitiendo en Twitch, así que si te gusta eso, puedes unirte. Además, necesito corregir a Liz, porque desde que puse en la biografía, en realidad son 17 mil millones en 2022. Lo que sea. Como, es muy divertido.

Así que, bueno. Hoy estamos hablando de Fastify. Y si no conoces Fastify, probablemente deberías, pero probablemente deberías usarlo si estás usando Node.js, ¿verdad? Esto no es el Congreso, así que no sé. Probablemente deberías usar Fastify para construir tus aplicaciones web y backends y APIs. ¿Cómo lo usas? Muy fácil, simplemente requieres importar lo que sea. Tiene un registro incorporado. EpiDías, quieres un registro en tu aplicación, ¿verdad? Se llama Pino. Y puedes usarlo para crear tus rutas usando AsyncAwait y todas las demás travesuras que puedas querer. Probablemente sean 4 mil millones de veces al año o algo así, descargas al mes.

Así que, bueno. Hablemos un poco sobre por qué no deberías usar Fastify o cualquier cosa, o cómo no usar Node.js. ¿Cuántos de ustedes han construido un sistema de modelo vista controlador en su carrera? Genial. El problema con este sistema es que en última instancia no escala. ¿En qué sentido no escala? Bueno, no escala bien en complejidad. Si estás construyendo una aplicación y la estás construyendo siguiendo el modelo vista controlador, bueno, comencemos con la vista. La mayoría de las veces ya no hay una capa de vista, simplemente construimos una API, así que eso se ha ido. Entonces, si estás escribiendo un fragmento de código, o bien va al controlador o a los modelos, y si, ya sabes, hay un 50% de probabilidad. Después de un tiempo tienes 2000 modelos y un archivo routes.js que tiene 10,000 líneas de largo.

2. Construyendo Monolitos con Fastify

Short description:

Verdad. MVC conduce a código Carbonara y spaghetti. En su lugar, estructura tu aplicación por dominios y características. Evita mezclar bases de datos de características. Fastify ofrece encapsulación a través de plugins, permitiendo la segmentación de código y datos. No tiene costo ni sobrecarga y admite decoradores. La encapsulación permite contextos anidados sin compartir datos entre capas.

Verdad. Este es el número real de código. Entonces, no funciona bien de esa manera y no escala bien en complejidad. ¿Qué haces en su lugar? Porque la pregunta es, si el modelo vista controlador no es suficientemente bueno, ¿qué haces en su lugar? Y cómo algunas grandes compañías y algunos sistemas importantes pueden construir monolitos, porque el modelo vista controlador no es bueno pero aún así lanzan monolitos. Así que de vez en cuando hay algunos artículos sobre monolitos y por qué y cómo, qué están haciendo.

Bueno, para ser honesto, MVC conduce a código Carbonara y spaghetti, pero me gusta la Carbonara y no el código spaghetti. Eso es todo. Entonces, ¿cómo lo haces? Necesitas estructurar tu aplicación por dominios, por características. Necesitas identificar cuáles son las características clave de tu aplicación y segmentarla. Y entre esos sistemas, tiendes a comunicarte a través de APIs conocidas. La parte importante es no tener un conjunto de características que lea la database del otro conjunto de características. Porque en el momento en que comienzas a sumergirte en ambos, entonces tienes mucho, no sabes cómo terminarás con tus relaciones. Otra forma de decirlo es que si para obtener un data necesitas unir 10 tablas, probablemente tengas el esquema incorrecto. ¿De acuerdo? Así que piensa en eso y reflexiona sobre tus elecciones de vida.

Entonces, ¿qué hace un dominio y cómo construimos un monolito? Como algo que queremos hacer, ¿verdad? Es algo bueno. Y bueno, típicamente, es un tema específico que se está desarrollando, ¿vale? Casos típicos son el catálogo o el sistema de gestión de pedidos o un carrito o lo que quieras llamarlo, ¿vale? En algunas de las cosas que se han desarrollado recientemente, se llama, tenemos un dominio que es la organización y los equipos y otras cosas se tratan de las aplicaciones y el código que se ejecuta en nuestra cloud. De todos modos, son dominios y quieres evitar el código spaghetti. Entonces, ¿qué hace Fastify para ayudar a construir esto? Fastify ofrece un concepto llamado encapsulación. Te permite estructurar tu aplicación en un conjunto de plugins que puedes usar para segmentar tus data, para segmentar tu código y de esa manera no comparten nada, en esencia. Ahora, algunos pueden preguntar, pero podrías hacer esto antes, ¿verdad? Hay otras técnicas. Sí, pero esto no tiene costo ni sobrecarga. De acuerdo, es súper rápido, así que no tienes que pagar nada por ello. Y es genial. También tiene un concepto llamado decorador. Entonces puedes agregar cosas a tu código y aplicación. ¿Cómo funciona la encapsulación? Básicamente puedes crear contextos dentro de contextos dentro de este contexto, como una especie de matrioshka grande, y cada capa no comparte nada con la anterior. Es genial. Es algo que desapareció. De acuerdo, divertido. Algo falta.

3. Encapsulación y Estructuración con Fastify

Short description:

Podemos utilizar la llamada de registro para crear contextos de encapsulación, decorar objetos de solicitud o respuesta con datos e información, y utilizar hooks. El plugin de Fastify permite romper la encapsulación y estructurar la aplicación como subaplicaciones con sus propios dominios y subdominios. Cada subaplicación puede tener sus propios plugins, rutas y estructura de código. Los plugins también se pueden utilizar para metaprogramación y personalización del comportamiento del sistema. En las aplicaciones de JavaScript, los plugins y las rutas se utilizan para la estructuración.

No lo sé. De acuerdo, divertido. Hubo un ejemplo allí. No lo sé. De acuerdo, llegó. No tengo ni idea. No he hecho nada. Genial. Lo que sucedió es que... Lo que puedes ver aquí, podemos usar esta llamada de registro para crear estos contextos de encapsulación, y podemos decorar nuestros objetos de solicitud o respuesta con datos e información, y tenemos un concepto de hooks.

Aquí tenemos hooks, y tenemos el hook onRequest donde establecemos los data, y estos llevarán... Dadas las dos rutas, tendrás un valor diferente. Ves que uno y dos. Y esos tendrán los mismos valores diferentes que se han poblado en función del concepto... Basado en los metadatos, en los que se está ejecutando la ruta. Es genial, porque de esta manera, podríamos crear nuestras cosas mejor. Entonces, ¿cómo lo haces... Pero ya sabes, en cada sistema de encapsulación, hay una forma de romper la encapsulación. Entonces, ¿cómo rompes la encapsulación? Bueno, hay una utilidad llamada plugin de Fastify que te permite hacer eso.

El concepto clave es que quieres proporcionar, crear, estructurar tu aplicación como pequeñas partes de subaplicaciones. De modo que cada una de ellas contenga su propio dominio y su propio subdominio. Y de esa manera, puedes escalar tu desarrollo en JavaScript a diferentes partes. Y cada una de ellas tiene sus propios plugins, sus propias rutas y toda la estructura de su código. ¿Cómo rompes el término de encapsulación? Utilizas estos agradables, puedes usar un skip override o el plugin de Fastify nuevamente. Nos faltan algunas diapositivas, así que estoy, de acuerdo, llegó. Además, puedes usar plugins para hacer metaprogramación. Cuando registras un plugin o una ruta, puedes comenzar automáticamente a crear un nuevo comportamiento. Personalizar automáticamente la forma en que funciona el sistema. Vamos a omitir, llego un poco tarde. ¿Cómo estructuras tu aplicación normal de JavaScript? Utilizas plugins y rutas para estructurar tu cosa.

4. Construyendo un Monolito Modular

Short description:

Para construir un monolito modular, debes identificar el dominio, estructurar tus carpetas de código y utilizar plugins y decoradores para compartir código entre dominios.

Estas son estructuras típicas para un monolito, ¿verdad? Esto no es para nada modular, es simplemente un monolito. De acuerdo, bien. Esta no es la diapositiva que se suponía que debía ser. De acuerdo, ahora está en verde. De acuerdo, ¿cómo construimos un monolito modular? En primer lugar, es uno, y llegó. Debes identificar el dominio que deseas abordar, y luego dos... De acuerdo, debes estructurar tus carpetas de código para que puedas organizar tus dominios uno a la vez. Y tres, es lo mismo. Eso será divertido cuando haga la codificación en vivo. Me has maldecido, Paolo. Esto es totalmente culpa tuya. Así que tres, puedes utilizar plugins y decoradores para compartir código entre dominios.

5. Fastify Demo

Short description:

Vamos a hacer una demostración rápida de una aplicación típica de Fastify. Tenemos una carpeta con server.js que inicia la aplicación y la configura. En la aplicación, cargamos Fastify y utilizamos la carga automática de Fastify para cargar automáticamente plugins y rutas. Tenemos plugins para la gestión de errores y el manejo de no encontrados. También tenemos un objeto de inventario para almacenar datos y dos rutas para productos e inventario. Ejecutemos la demostración y veamos los resultados.

Y vamos a hacer una demostración rápida ahora porque de hecho, es hora de la demostración. Y esto se suponía que iba a ser una bonita imagen de Roma, y los dioses de la demostración deberían estar conmigo. Pero, aparentemente, bueno, esto está empezando muy bien. Así que veamos cómo va.

De acuerdo, aquí vamos. Así que tenemos esta bonita carpeta. Y en esta bonita carpeta tenemos algunas cosas. Estas son aplicaciones típicas de Fastify. Tengo mi server.js que inicia las cosas, y configuramos mi, tenemos un método de construcción para construir la aplicación. Y luego puedo cerrar mi, escuchar algo en el puerto y el host. Y luego cerrar la aplicación, genial. Y en mi aplicación, ¿qué hago? Bueno, en mi aplicación cargo Fastify. Utilizo una utilidad llamada Fastify autoload para cargar automáticamente todos mis plugins, o mis rutas. Y luego devuelvo la aplicación.

¿Cuáles son mis plugins? Bueno, tengo algunos plugins diferentes. Tengo uno para gestionar el error, y uno para manejar un no encontrado. Y mira, quieres un no encontrado y una gestión de errores, ¿verdad? Entonces, bien, y tenemos algo llamado inventario. ¿Qué es un inventario? Bueno, el inventario es una especie de objeto que uso para almacenar data, ¿vale? En algún momento, necesitas una entidad, alguien de quien quieras obtener algunos data de la database, ¿vale? Y puedes usar lo que quieras. Puedes usar Prisma. Puedes usar Next. Puedes usar solo el controlador de la database. Pero en algún momento, necesitarás tener alguna utilidad que lea data de la database por ti. Así que de eso se trata esto. Y lo falsifica por completo, ¿vale? Simplemente devuelve verdadero si este SQ es para tejido, ¿vale?

Entonces, ¿cuáles son nuestras rutas? Tenemos dos rutas. Una es la ruta de productos. Así que queremos una ruta para productos, y eso devuelve. Y luego también consultamos para obtener nuestro inventario, ¿vale? Y también tenemos un inventario que acaba de devolver el número de artículos que hay en la tienda para ese SQ. ¿Por qué estamos haciendo esta estructura de API, quién sabe, ¿vale? Pero ese no es el punto. Entonces, bien, tenemos esta estructura. Ejecutemos esto y veamos cómo va.

6. Modularizando Rutas y Carga

Short description:

Podemos consultar el catálogo de productos y el inventario. Fastify autoload proporciona una estructura de enrutamiento basada en el sistema de archivos. Podemos refactorizar nuestra carpeta de rutas para convertirla en módulos y crear subcarpetas para las rutas dentro de cada módulo. El punto de interacción clave entre el catálogo y el inventario es el archivo inventory.js, que pertenece al subsistema de inventario. Creamos un archivo index.js y cargamos nuestras rutas utilizando la utilidad autoload.

Entonces hacemos Node server, y luego podríamos hacer... hagamos eso, ¿de acuerdo? Podemos hacer curl. Y podemos ir y consultar el catálogo de productos, ¿de acuerdo? Y puedes ver el resultado. Y luego puedes ir a inventario, y producto 42, y obtienes los data. Y luego si es 43, no obtienes nada, ¿de acuerdo? Ten en cuenta que ves que hay un prefijo, y el prefijo es la carpeta. Así que Fastify autoload realmente te brinda ese agradable enrutamiento basado en el sistema de archivos de Fastify para estructurar tu cosa.

Entonces esta estructura es bastante buena, ¿de acuerdo? Este es un buen monolito, esencialmente, lo que llamarías una arquitectura MVC, muy cercana. Pero es algo que puede llevarte muy lejos. ¿Cómo migrar esto para que sea un monolito modular? ¿Y cómo podemos tener múltiples equipos comunicándose entre sí, y compartiendo código de una mejor manera? De acuerdo, comencemos haciendo un poco de refactorización a esto.

Primero que nada, tomemos nuestra mágica carpeta de rutas, y llamémosla modules, porque nos gusta, ¿verdad? Así que no es ruta, es modules. Entonces, ahora nos estamos convirtiendo en una arquitectura modular, ¿de acuerdo? Así es como se hace, ¿de acuerdo? Y aún tienes tu catálogo y tu inventario, pero ahora creamos subcarpetas para las rutas, y mueves las cosas allí. De acuerdo, y luego inventario. Y mueves las otras rutas. Genial, tal vez haya hecho mi movimiento en estas cosas, ¿y por qué hacemos esto? Bueno, quedará claro en un segundo. Así que hemos hecho esto, estas dos migraciones, ¿de acuerdo? ¿Cómo los separamos? El punto de interacción clave entre el catálogo y el inventario es este archivo inventory.js, que es un plugin. Entonces necesitamos hacer algo al respecto porque esto realmente pertenece al subsistema de inventario. Entonces lo que hacemos es abrirlo y creamos, aquí creamos un archivo index.js. Y en este archivo, literalmente, estoy haciendo trampa. Solo estoy poniendo cosas aquí, de acuerdo, copiando estas cosas. Bueno, ya no necesitaremos esto. Te mostraré en un segundo por qué. Así que tenemos esto y genial. Ahora necesitamos algunas cosas más. Queremos cargar nuestras rutas. Así que vamos y copiamos estas dos cosas. Obtenemos el autoload y esta utilidad llamada DSM que escribí. No preguntes por qué porque la respuesta es mala. Así que no quieres unir rutas. Así que aquí tomas esto y oh, solo copias esto. De acuerdo, así que aquí vas a inventario y después de hacer eso has configurado la cosa de autoload y para cargar nuestras rutas.

7. Refactorización y Mejoras con Platformattic

Short description:

Hemos refactorizado todo y ahora podemos reiniciar esta aplicación. Se está bloqueando, pero lo solucionamos. Ahora podemos hacer consultas y ver que sigue funcionando igual que antes. ¿Podemos hacer algo mejor? Sí, podemos. Hemos estado trabajando en una nueva empresa llamada Platformattic. Podemos crear un nuevo archivo de configuración Platformattic.service.json y abrir un servidor.

De acuerdo, esto está hecho. Bien, ahora lo que necesitamos hacer es básicamente lo mismo para nuestro catálogo. Y aquí vamos y no necesitamos el inventario. De acuerdo, usaremos el inventario de la capa superior. Genial, necesitamos una cosa más. De acuerdo, queremos establecer el prefijo. Así que necesitamos las opciones y aquí necesitamos opciones y prefijo, ops prefijo. Genial. ¿Por qué hacemos esto? Porque nuestra magia de autoload necesitará, establecerá nuestro prefijo y solo necesitamos pasar eso. Así que hacemos eso y tenemos, ¿qué es? De acuerdo, ¡genial! Hemos creado, hemos configurado nuestras cosas. Ahora aquí podemos eliminar este archivo de inventario. Y aquí, oh, bueno, ya no es rutas. Es modules, pero solo necesitamos cambiar algo. No queremos, queremos romper la encapsulación. Y solo queremos cargar cosas en un nivel. Así que hemos refactorizado todo. Y ahora podemos reiniciar esta aplicación y se está bloqueando. ¡Bien! Y aquí tienes y está en lugar de fastify. ¡Genial! De acuerdo, y nuevamente es lo mismo en el otro archivo. Mira aquí, solo estoy cambiando esto fastify. ¡Genial! Así que aquí tienes y es... Vamos, sigo olvidando cosas. De acuerdo, aquí tienes. ¡Genial! Ahora podemos hacer consultas y puedes ver que esto sigue funcionando igual que antes. De acuerdo, y los dioses de la demostración han estado en su mayoría conmigo. Así que estemos muy contentos por esto. Hemos estado haciendo esta buena refactorización y configurando las cosas y parece bueno, ¿verdad? Sin embargo, ¿podemos hacer algo mejor? ¿Podemos mejorar nuestras cosas? Bueno, podemos. He estado trabajando durante un tiempo en una nueva empresa llamada Platformattic. Aquí viene la presentación, así que ten cuidado. Entonces, lo que podemos hacer aquí ahora es simplemente crear un nuevo archivo de configuración Platformattic.service.json y podríamos abrir literalmente un servidor.

8. Configuración de Fastify y Lanzamiento en la Nube

Short description:

Veamos si Copilot está lo suficientemente satisfecho. Agregamos la propiedad del servidor, complementos y módulos. Eliminamos archivos innecesarios. La aplicación se reinicia automáticamente. Se generan los documentos de OpenAPI. PlatformaticDB genera APIs a partir de una base de datos. Construir un monolito modular se trata de crear y separar preocupaciones. Puedes migrar fácilmente a microservicios. Lanzamos nuestra nube gratuita para implementar aplicaciones Fastify o Node.js.

Veamos si Copilot está lo suficientemente satisfecho. Entonces platformattic.dev, esquemas, bueno, sí, no exactamente como debería ser. Esquemas, y aquí tenemos V20 y aquí vamos. Y esto es DB, okay, genial. Y ahora se queja porque nos falta algo, así que queremos agregar la propiedad del servidor, y queremos escuchar en el puerto, y que vaya al 1000, queremos el nombre del host, y queremos... De acuerdo, genial, necesitamos agregar algunas cosas más, así que una cosa que queremos agregar son complementos, y queremos decirle que cargue cosas desde una ruta, que es una ruta, y necesitamos cargar los complementos primero, así que simplemente hacemos cargar complementos, genial, y simplemente no queremos encapsular esto, y esto es falso, genial. Ahora lo siguiente es cargar nuestros modules, y queremos los modules, no queremos encapsular, y queremos ir solo un nivel de profundidad, con un nivel de profundidad, y ahora puedo simplemente eliminar este archivo muy felizmente, eliminar este otro archivo muy felizmente, así que muchos menos archivos para mantener, y ahora puedo simplemente ejecutar esto NPX-PLT service start, y ahora todo sigue funcionando como antes. Entonces, y ahora hemos simplificado muchas cosas. Un punto extra de este enfoque es que podría simplemente hacer, por ejemplo, service, agregar más configuración, y simplemente activar OpenAPI. Cierto, de acuerdo. ¿Y qué error cometí? No se permite... Oh, es DB. Service. Claro, tiene razón. De acuerdo, aquí simplemente se reinicia. De acuerdo, se reinició automáticamente. Cosas geniales. Así que se reinicia automáticamente como has visto. Entonces lo que podríamos hacer ahora es ir aquí y ver en el puerto 3000 la documentación y verás todos nuestros documentos de OpenAPI generados automáticamente y configurados correctamente. También admite métricas automáticas, integración automática de permisos y muchas otras cosas que deseas en tu aplicación de producción de Node.js. Hay otro componente llamado PlatformaticDB que genera automáticamente tus APIs a partir de una base de datos, pero no estoy hablando de eso en esta presentación. Lo que quería decir al final es que construir un monolito modular se trata de crear y separar preocupaciones y en algún momento es posible que solo quieras cambiar a microservicios. Pero si has hecho eso, verás que todo el código que he hecho es solo un archivo de configuración para comenzar, por lo que podrías migrar fácilmente a microservicios ahora y tener una arquitectura casi sin compartir. Solo quería decir al final que también acabamos de lanzar nuestra nube. Así que si quieres implementar tu aplicación Fastify o Node.js está ahí afuera y es gratis. Así que gracias. ¿Las instantáneas de inicio se toman después de la optimización de funciones? No creo que esta pregunta fuera para mí. Sí, no creo. Pero si quieres, puedo intentar responder esa pregunta.

QnA

Q&A sobre Inyección de Dependencias y Depuración

Short description:

Esta es una sección de preguntas y respuestas donde el orador responde preguntas sobre la inyección de dependencias y la depuración de microservicios Fastify. Explican que el mecanismo de inyección de dependencias mostrado es una forma sencilla de crear un contexto y adjuntar cosas a él. Es un sistema del tipo `no te repitas` que simplemente funciona. En cuanto a la depuración, el orador recomienda especificar esquemas tanto para los datos entrantes como salientes para garantizar la protección y una representación rápida de JSON.

Probablemente tengo la respuesta. No creo que esto sea para ti. Ok, no. Espera. Parece que esto no está funcionando. Hay algo que no funciona con la sección de preguntas y respuestas. ¿Alguien tiene alguna pregunta? Sí, simplemente levanten la mano y luego continuamos. A la antigua. Ooh. Sí, simplemente... Ok, hay una pregunta allí.

¿Cuál es tu opinión sobre la inyección de dependencias basada en ShareCode? ShareCode, Fastify, ¿qué son? Sí, lo que acabo de mostrar es una forma muy simplista de inyección de dependencias. Esencialmente. La pregunta fue, ¿qué opinas de lo que mostraste? Mecanismo de inyección de dependencias basado en compartir código a través de un complemento de Fastify. Si entiendo correctamente la pregunta, ¿verdad? Perfecto. Es exactamente eso. Es una forma muy rudimentaria de crear un contexto y adjuntar cosas a ese contexto. Y siendo honestos, es un mecanismo de inyección de dependencias. En su mayoría, es un sistema del tipo `no te repitas`. Y ni siquiera se basa en configuración. Simplemente creas tus complementos e incluso puedes especificar con Fastify autoload, puedes incluso especificar un poco qué otros valores deben ser decorados y todo se cargará correctamente. Así que sí, es un mecanismo de inyección de dependencias muy sencillo. Y desde mi punto de vista, es un mecanismo de inyección de dependencias que simplemente funciona, en esencia.

Ok. Gracias. Tengo una pregunta aquí. ¡Oh, funcionó! ¡Choca esos cinco! Entonces, ¿cómo podemos depurar que nuestro microservicio Fastify está funcionando de la mejor manera posible? Sí, esta es una pregunta fenomenal. Ok, lo primero que debes hacer es... Asegurarte de haber especificado esquemas tanto para los datos que ingresan como para los datos que salen. De esa manera, estarás protegido y también estarás representando tu JSON lo más rápido posible.

Protección de Servicios y Reutilización de Código

Short description:

Puedes utilizar el módulo under-pressure para proteger tu servicio de sobrecargas. Asegura que tu servicio devuelva un error 503 cuando está sobrecargado. El módulo forma parte de Platformatic y cuenta con soporte de autocompletado. Platformatic admite la compilación completa de TypeScript, por lo que puedes escribir complementos en TypeScript. Al modularizar por dominio, puedes colocar el código que no pertenece a una categoría de dominio específica en una biblioteca de utilidades que se puede compartir entre módulos. Es importante mantener separado el dominio y la base de datos para mantener la integridad de los datos.

Es genial. Luego, lo segundo es que quieres usar un módulo. Se llama under-pressure, y under-pressure protege tu servicio de sobrecargas. Probablemente hayas oído hablar de la degradación del bucle de eventos, y te protege automáticamente de eso y asegura que si tu servicio recibe demasiada carga, comienza a devolver un error 503 y, al menos, no se bloquea ni entra en una situación irrecuperable. Ah, por cierto, ese módulo también forma parte de Platformatic, por lo que lo obtienes de forma gratuita si usas nuestras cosas. Genial.

Y el archivo JSON era muy específico. ¿Cómo sabría qué poner allí si no soy Matteo? Oh, hay autocompletado si no te diste cuenta. Es muy sencillo ponerlo allí, se basa en esquemas JSON y el esquema JSON proporciona una guía. Finalmente, ahí está, yay. Esa es mi siguiente pregunta. Es genial, y puedes ponerlo allí, está completamente documentado, pero también hay autocompletado. Así que si hay autocompletado, es genial.

Entonces, ¿odias TS? No, no, esa es la respuesta, no. No, no lo odio. De hecho, Platformatic admite la compilación completa de TypeScript, por lo que puedes escribir tus complementos en TypeScript y todo funcionará bien como se espera. Así que sí, no, no odio TypeScript. ¿Qué sucede con los complementos cuando la aplicación se convierte en microservicios? Oh, ya sabes, microservicios es solo un complemento, ¿verdad? Eso es lo que es.

Y al modularizar por dominio, ¿dónde colocas el código que no pertenece a una categoría de dominio específica? Algunos ayudantes para ser reutilizados en los puntos finales de la API. Entonces, está bien, eso son dos cosas. Cuando construyes este tipo de sistema, tienes dos niveles de reutilización. Un nivel de reutilización es típicamente a nivel de código. Y cuando trabajas en equipos más grandes, especialmente en un monolito modular, tiendes a usar un mono-repo. Entonces, cada uno de tus módulos, como mostré, en lugar de estar estructurado, en lugar de ser solo una carpeta única, también tiene un archivo package JSON adjunto, ¿verdad? Entonces, podrías tener una biblioteca de utilidades que realmente estás importando y requiriendo allí. Entonces, si solo necesitas código para reutilizar la utilidad, simplemente puedes compartir código. Y eso es todo. Si quieres establecer la parte clave, mantén el dominio separado, principalmente mantén la base de datos separada. Mantén los datos de cada dominio contenidos para que no se compartan entre límites. Genial. ¿Qué opinas de separar el transporte HTTP GraphQL PubSub de la lógica empresarial para permitir la reutilización de la lógica empresarial entre ellos?

Separando la Lógica Empresarial y los Contratos de la API

Short description:

Separar la lógica empresarial del transporte es un desafío en el desarrollo de software. Las APIs son contratos entre desarrolladores, que permiten la comunicación y el acceso a datos y lógica empresarial. La API y su interfaz son cruciales para una colaboración efectiva.

De acuerdo. Probablemente me haya perdido algunos. Sí, es así. De acuerdo, sí, mi punto aquí es que sería bueno hacerlo si pudieras separarlos. Y la dura realidad del desarrollo de software implica que en realidad es muy difícil separar la lógica empresarial del transporte. Y puedes hacerlo, pero requiere un esfuerzo gigantesco. Por supuesto, si puedes hacerlo, hazlo. Pero en algún momento, estás pasando de ser un servidor HTTP que expone una API a ser una cola que expone una API, ¿vale? Y lo importante no es solo el código, sino también la forma en que se invoca el código. Y tiendo a poner énfasis en las personas, no en el software. Y cuando defines una API, una API no es código. Una API es un contrato entre personas. Así que nosotros, los desarrolladores del backend, ofrecemos a los desarrolladores del frontend acceso a data y lógica empresarial. Y la API y la interfaz de esa API es en realidad lo más importante. Porque es cómo podemos hablar y comunicarnos con un lenguaje común. Así que, no sé, con suerte. ¿Puedes explicarnos Fastify como si tuvieras cinco años? ¿De verdad? ¿Sabes cuando vas a jugar al preescolar con todos tus amigos juntos? Sí, eso es Fastify, ¿vale? Sabes, también puedes hacer eso, y eso es Fastify, o puedes jugar solo en tu casa, y eso son otros frameworks. No. Genial. ¿Es posible hacer que los complementos de Fastify sean seguros en cuanto a tipos, podemos asegurarnos de que el complemento se haya registrado antes de intentar acceder a él? Sí, los complementos de Fastify pueden ser seguros en cuanto a tipos. De hecho, hay una compatibilidad total donde puedes especificar tus rutas y validar automáticamente tus data y hacer que sean seguros en cuanto a tipos utilizando Typebox o Zod o JSON Schema 2TS, ya sabes, eso probablemente sea una charla completa, solo mostrando todas estas cosas. Pero recientemente hice un video en YouTube sobre ese tema específico, así que si quieres, puedes ir y buscar `Fastify seguro en cuanto a tipos` y verlo, en 10 minutos lo entenderás. Así que sí, esa es la respuesta y simplemente hazlo. No puedes asegurarte de que el complemento esté registrado, pero eso requiere un paso adicional. Y, gracias. Nuestra última pregunta, porque nos quedan unos segundos, ¿te unirás a la fiesta después? ¡Por supuesto que sí! ¡Claro! ¡Vamos! ¿No lo hará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.
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 Congress 2023Node Congress 2023
109 min
Node.js Masterclass
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
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 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.
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.