Desbloqueando el Potencial de Aplicaciones en Tiempo Real Basadas en Eventos con JavaScript

This ad is not shown to multipass and full ticket holders
JSNation US
JSNation US 2025
November 17 - 20, 2025
New York, US & Online
See JS stars in the US biggest planetarium
Learn More
In partnership with Focus Reactive
Upcoming event
JSNation US 2025
JSNation US 2025
November 17 - 20, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

En el mundo digital acelerado de hoy, las aplicaciones en tiempo real basadas en eventos están en el corazón de ofrecer experiencias de usuario dinámicas y receptivas. Esta sesión profundizará en las complejidades técnicas y el inmenso potencial de construir tales aplicaciones usando JavaScript.

Juntos, exploraremos los conceptos básicos de la arquitectura basada en eventos (EDA) y su implementación en JavaScript. Los temas clave incluirán una visión técnica del event loop y la I/O no bloqueante, WebSockets y Message Brokers.

Continuaremos nuestro viaje con una mirada a cómo aplicar estas tecnologías en diferentes casos de uso, como flujos de datos en vivo y aplicaciones colaborativas, asegurando al mismo tiempo baja latencia y tolerancia a fallos.

This talk has been presented at JSNation US 2024, check out the latest edition of this JavaScript Conference.

Jarred Utt
Jarred Utt
20 min
21 Nov, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Hola, soy Jerdot, un líder técnico en AWS Safegate. Hoy, hablaré sobre la arquitectura basada en eventos y los potenciales de los sistemas en tiempo real basados en eventos en JavaScript. Exploraremos los runtimes de JavaScript, el event loop y las colas involucradas. La arquitectura basada en eventos implica producir, detectar, consumir y reaccionar a eventos. Se utiliza en microservicios, sistemas IoT y procesamiento de datos en tiempo real. Herramientas como event emitters y WebSockets se utilizan para simplificar la construcción de aplicaciones basadas en eventos. La gestión de conexiones es crucial, y RabbitMQ y MQTT son brokers de mensajes populares. La optimización del rendimiento se puede lograr utilizando brokers de mensajes de alto rendimiento, desplegando productores y brokers cerca unos de otros, y considerando la tolerancia a fallos. El procesamiento de mensajes debe incluir el almacenamiento de mensajes hasta que se procesen con éxito, manejando eventos múltiples veces con efectos secundarios no deseados, y utilizando reintentos automáticos y colas de mensajes muertos para fallos transitorios.

1. Introduction to Event-Driven Architecture

Short description:

Hola, soy Jerdot, un líder técnico en AWS Safegate. Hoy, hablaré sobre la arquitectura dirigida por eventos y los potenciales de los sistemas en tiempo real dirigidos por eventos en JavaScript. Tengo experiencia en sistemas embebidos y desarrollo web. ¡Vamos a sumergirnos!

Hola, mi nombre es Jerdot, y soy un líder técnico en AWS Safegate trabajando en el software de control de Apron que aumenta el rendimiento, la seguridad y la sostenibilidad de los aeropuertos. Hoy voy a hablar sobre la arquitectura dirigida por eventos y algunos de los potenciales de tener sistemas en tiempo real dirigidos por eventos y JavaScript.

Fuera de mi trabajo en AWS Safegate, soy estadounidense, pero me mudé a Suecia hace cuatro años. Mi experiencia es principalmente en sistemas embebidos y desarrollo web. Y fuera de trabajar con computadoras, me gusta la producción musical, jugar a juegos de computadora, y jugar al golf.

Tenemos una agenda completa para hoy, y comenzaremos desde cero con algunos componentes en tiempo real de JavaScript, una pequeña introducción al bucle de eventos de JavaScript, una breve visión general de la arquitectura dirigida por eventos, emisores de eventos, WebSockets, RabbitMQ, MQTT, y luego qué significa llevar todas estas cosas a producción. Comencemos.

2. Exploring JavaScript Runtimes and the Event Loop

Short description:

JavaScript es en realidad sincrónico, bloqueante y de un solo hilo, pero diferentes entornos de ejecución permiten operaciones asincrónicas. Hoy nos centraremos en Node.js, que tiene componentes de tiempo de ejecución como el motor V8 y LibUV. Node.js tiene una configuración simple con una Memory Deep y una pila de llamadas. Exploraremos ejemplos de ejecución de código sincrónico y asincrónico y entenderemos el papel del bucle de eventos.

Entonces JavaScript. Mucha gente piensa muchas cosas diferentes, que no es bloqueante, y que es async I.O., pero esa no es la naturaleza del JavaScript real. Como lenguaje, es en realidad sincrónico, bloqueante y de un solo hilo. Pero hay diferentes entornos de ejecución que nos permiten hacer cosas asincrónicas que tienen un rendimiento variado en JavaScript, tanto en el navegador como en el servidor.

Hoy me centraré principalmente en Node.js, pero la mayoría de los entornos de ejecución tienen el mismo tipo de herramientas con diferentes nombres y comportamientos ligeramente diferentes. Algunos de los componentes de tiempo de ejecución en Node son el motor V8, LibUV, Crypto. Hay muchas características integradas en C++ para ayudarte a acceder a sistemas de archivos y redes. Y también hay esta amplia biblioteca de JavaScript que te permite usar características de C++ directamente desde JavaScript.

Así que cuando miro Node.js, se ve algo así. Y durante el tiempo de ejecución, tenemos una configuración bastante simple. Tenemos una Memory Deep, donde tenemos todas nuestras variables y funciones declaradas, todo sucediendo allí, y tenemos nuestra pila de llamadas. Las funciones en cola se empujan a la pila de llamadas, y cuando una función devuelve, se saca de la pila de llamadas. Esto es bastante simple, una cola de último en entrar, primero en salir. Veremos algunos ejemplos cortos. Tenemos un código realmente, realmente complicado aquí en la parte superior izquierda. A la derecha, tenemos nuestro tiempo de ejecución, y en la parte inferior izquierda, tenemos una salida de consola. Si comenzamos a recorrer este código, veremos que la primera función entra en la pila de llamadas. Esto se ejecuta, y obtenemos los resultados en la consola. Lo mismo con la segunda declaración. Obtenemos la salida en la consola, y la tercera declaración en la consola. Y nada allí parece extraño, ¿verdad? Lo ejecutamos en orden. Este es un script sincrónico.

¿Qué pasa si intentamos hacer algo asincrónico? Obtenemos nuestra primera declaración de registro de consola, y obtenemos la salida. Tenemos esta declaración de lectura de archivo. Y aquí es donde se pone un poco interesante, es que esto en realidad será empujado a libuv. Y continuaremos con nuestro código sincrónico. Así que iremos primero, y luego tercero. Y luego, después de un tiempo, cuando terminemos de leer nuestro archivo, procesaremos la función de devolución de llamada de esa función de lectura de archivo. Así que terminamos con una salida que fue primero, tercero y segundo. Y podríamos preguntarnos, ya sabes, ¿por qué es eso? Y esto es un poco lo que hace el bucle de eventos.

3. Understanding the Event Loop

Short description:

El bucle de eventos es un patrón de diseño que orquesta la ejecución de código sincrónico y asincrónico. Consiste en seis colas que contienen funciones de devolución de llamada. Comenzamos con la cola de microtareas, luego pasamos a la cola de temporizadores y finalmente procesamos las devoluciones de llamada de nextTick y promise. El bucle continúa en dirección de las agujas del reloj, procesando devoluciones de llamada hasta que la cola de microtareas esté vacía.

Y el bucle de eventos es esencialmente solo un patrón de diseño que orquesta la ejecución de código sincrónico y asincrónico. Siempre está ejecutándose en segundo plano de tu proceso de Node.js. Es importante saber que todo tu código sincrónico se ejecuta primero, y realmente no es parte del bucle de eventos.

Echaremos un vistazo un poco más profundo al bucle de eventos. Es un dibujo muy, muy bonito aquí. Puede ser un poco complicado si no lo has visto antes. Pero hay esencialmente seis colas diferentes en cada iteración del bucle de eventos. Y contienen funciones de devolución de llamada que eventualmente se ejecutan en la pila de llamadas normal cuando están listas.

Siempre comenzamos en el medio con una cola de microtareas. Esta contiene dos subcolas, la cola de nextTick y la cola de devolución de llamada de promise. Y cada una de estas subcolas, ejecutamos todas las funciones de processNextTick hasta que estén vacías. Y luego continuamos con todas las funciones nativas de promise hasta que esté vacía. Una vez que hemos procesado ambas subcolas, pasamos a la cola de temporizadores, típicamente conocida como el espacio de temporizadores. Esto ejecuta todas las devoluciones de llamada asociadas con setTimeouts y setEnderable. Y una vez que esa cola está completamente vacía, volvemos al medio, y nuevamente procesamos todas las devoluciones de llamada de nextTick y promise en orden. Podrías empezar a captar la idea. Nos movemos en el sentido de las agujas del reloj alrededor del bucle exterior, y después de cada iteración, volvemos al medio y procesamos las devoluciones de llamada de nextTick y promise.

4. The Event Loop - IO Queue and Microtask Queue

Short description:

La cola de IO maneja métodos asíncronos de módulos como FS y HTTP. Procesamos esto y volvemos a la cola de microtareas. Luego continuamos a la cola de verificación para las devoluciones de llamada de setImmediate. Después de procesar nextTick y promesas, entramos en la fase de cierre. En el último paso, verificamos más nextTick y promesas. Si la cola de microtareas está vacía, el bucle de eventos sale.

La cola de IO maneja todos nuestros métodos asíncronos de módulos como FS y HTTP. Procesamos todo esto, y volvemos a la cola de microtareas, y luego continuamos a la cola de verificación donde manejamos todas las devoluciones de llamada asociadas con setImmediate. Una vez más volvemos a la cola de microtareas, procesamos todos nuestros nextTick y promesas, y luego entramos en nuestra fase de cierre. Esto maneja todas las devoluciones de llamada asociadas con el evento close en la tarea asíncrona. En el último paso del bucle, volvemos y una vez más verificamos todos nuestros nextTick y promesas. Y si hay algo aquí, en realidad haremos todo otro ciclo como parte de este bucle de eventos. Pero si la cola de microtareas está completamente vacía, el bucle de eventos técnicamente saldrá.

5. Understanding Event-Driven Architecture

Short description:

Espero que esto te haya dado una mejor comprensión de cómo se implementan y ejecutan estas cosas. La arquitectura dirigida por eventos se trata de producir, detectar, consumir y reaccionar a eventos. Los productores generan eventos, los consumidores escuchan y reaccionan, los canales transmiten eventos, y los procesadores manejan la lógica en respuesta a los eventos. Los eventos se generan cuando algo cambia en la aplicación, y los productores envían eventos después de que han ocurrido. La arquitectura dirigida por eventos se utiliza en microservicios, sistemas IoT y procesamiento de datos en tiempo real.

Espero que esto te haya dado una mejor comprensión de cómo se están implementando y ejecutando estas cosas, y por qué las promesas son realmente tan poderosas dentro de async dash JavaScript.

Ahora que tenemos una comprensión básica de cómo funciona async dash JavaScript, podemos hablar un poco más sobre la arquitectura dirigida por eventos. Esta es solo una definición, y se trata de producir, detectar, consumir y reaccionar a eventos. Está un poco en el nombre, dirigida por eventos. Algunos términos clave a considerar son qué es un evento, y esto es esencialmente solo un cambio de estado dentro de tu aplicación, y es cualquier ocurrencia o acción que pueda desencadenar una respuesta. No siempre es una respuesta a un evento, pero probablemente siempre sea un evento.

Los productores son las cosas que generan los eventos. Los consumidores escuchan y reaccionan a los eventos. Los canales son vías a través de las cuales se transmiten los eventos. Y los procesadores son componentes que manejan la lógica en respuesta a los eventos. Algunos conceptos clave para entender sobre la arquitectura dirigida por eventos es que si algo en tu aplicación cambia, siempre debes generar un evento, ya sea que vaya a ser consumido o no. Los productores envían eventos después de que han ocurrido, no antes, y al productor no le importa lo que sucede después de que se envía el evento. El único trabajo del productor es propagar el cambio al sistema, y no le importa lo que realmente sucede después de eso. No debes diseñar eventos para consumidores particulares ni contener instrucciones específicas porque los eventos son inmutables. Y así, cuando comienzas a construir el sistema, terminas con algo de alto nivel como esto, donde tienes productores que van a algún tipo de middleware de eventos, y luego tienes consumidores en el otro lado que están manejando eventos y tal vez desencadenando nuevos eventos y convirtiéndose en productores ellos mismos, y tienes este tipo de ciclo.

Algunos de los casos de uso para la arquitectura dirigida por eventos son los microservicios. Puede que ya estés haciendo algunas cosas dirigidas por eventos sin siquiera darte cuenta. Los patrones EDA son perfectos para habilitar la comunicación entre diferentes servicios. En lugar de tener puntos a OIDs, puedes distribuir todo. Los sistemas IoT utilizan en gran medida los patrones EDA para manejar datos de numerosos sensores y dispositivos, y muchos sistemas que requieren procesamiento de datos en tiempo real, como el comercio financiero, también utilizan patrones EDA. Para nosotros, proporcionamos una solución que tiene una vista en tiempo real de lo que está sucediendo en el aeropuerto, características como la visualización de todas las aeronaves y vehículos moviéndose en el suelo, controlando, monitoreando y visualizando miles de sensores. Así que nuestra aplicación es a veces un gran lío dirigido por eventos. A través de mi experiencia trabajando en esto, hay muchos pros y contras.

6. Herramientas y Técnicas para la Arquitectura Dirigida por Eventos

Short description:

La arquitectura dirigida por eventos proporciona las ventajas de desacoplar componentes, permitiendo flexibilidad y escalabilidad. Sin embargo, también presenta desafíos como la consistencia de datos, la complejidad y el orden de los eventos. Para abordar estos, se utilizan herramientas como event emitters y WebSockets para simplificar la construcción de aplicaciones de producción.

Algunas de las ventajas son el desacoplamiento de componentes. Tus productores y consumidores no necesitan conocerse entre sí. Esto te da mucha flexibilidad ya que puedes añadir nuevos consumidores y servicios sin necesariamente cambiar los datos de los productores, y esto te permite escalar. Puedes añadir nuevos componentes o eliminarlos sin afectar a otros y te permite habilitar algún procesamiento en tiempo real.

Algunos de los inconvenientes. La consistencia de datos puede ser bastante difícil. Al enviar eventos a múltiples consumidores, puede ser realmente desafiante asegurar que todo se procese, especialmente si hay alguna ralentización en un servicio o fallos transitorios. La complejidad también es bastante difícil, especialmente a medida que crece el número de eventos y consumidores. Esto hace que la depuración sea más desafiante debido a la naturaleza asincrónica. Y el orden de los eventos también puede ser bastante complejo si necesitas un orden específico de tus eventos a medida que ocurren.

Así que ahora que hablamos de esto, hablaremos de un par de herramientas y cosas alrededor de EDA que hacen que construir aplicaciones de producción sea mucho más fácil. La primera son los event emitters, que es una biblioteca nativa dentro de JavaScript, y nos centraremos en tres funciones principales. Emits, que te permite emitir un evento. On que te permite escuchar cambios en un cierto evento, y off, que te permite dejar de escuchar cambios en un cierto evento.

Así que si miramos este dibujo simple aquí, tenemos el event emitter A, que emite dos eventos diferentes, uno de tipo X y otro de tipo Y. Y en eventos de tipo X, tenemos dos oyentes que están escuchando cambios para el método X. Y tenemos un oyente C, que está escuchando eventos de tipo Y. Esto es realmente útil para desacoplar diferentes partes de tu aplicación.

7. Emisión de Eventos y Comunicación WebSocket

Short description:

Puedes emitir eventos dentro de tu aplicación, manejar errores y gestionar tareas asíncronas. WebSockets proporcionan una comunicación eficiente, permitiendo actualizaciones en tiempo real de servidores a clientes. Socket.io es un paquete popular para la funcionalidad de WebSocket. La gestión de conexiones es crucial para manejar conexiones caídas o reinicios de servicio.

Puedes emitir eventos desde una parte de tu aplicación, escucharlos en otras partes. Puedes implementar un manejo de errores robusto escuchando específicamente eventos de error. Y también puedes aprovechar esto para manejar operaciones asíncronas emitiendo eventos cuando las tareas asíncronas se completan. Esto es realmente útil para la comunicación de procesos internos, pero no se expande realmente fuera de un solo proceso.

Para cosas como esa, podrías pensar en WebSockets, que proporcionan una comunicación de dúplex completo sobre una única conexión de larga duración. Esto es mucho mejor en comparación con los ciclos tradicionales de solicitud-respuesta HTTP. Tiene un costo mucho menor en la red y también en su tiempo. Y esto también permite a los servidores enviar actualizaciones directamente a los clientes para que tengan comunicación en tiempo real.

Así que en lugar de decir, oye, dame algunos vuelos, estoy esperando que el servidor responda con 200 OK y tus datos, o tal vez incluso un 500, dependiendo de cómo vayan las cosas. Puedes simplemente obtener los nuevos Sockets, realizar el handshake, y luego tienes esta comunicación bidireccional entre tu cliente y servidor. Y en JavaScript, están disponibles de forma nativa en la biblioteca WebSocket. Pero también hay un paquete NPM popular llamado Socket.io.

Y esto proporciona métodos como onOpen, onMessage, onAir, onClose. Y esto sigue de cerca otros patrones dirigidos por eventos en paquetes.

8. Connection Management and Message Brokers

Short description:

La gestión de conexiones es crucial. RabbitMQ es un broker de mensajes de código abierto con soporte para diferentes protocolos. Utiliza conexiones TCP, canales, colas e intercambios. RabbitMQ ofrece patrones de publicación y suscripción y llamadas a procedimientos remotos. MQTT es un protocolo de mensajería ligero para aplicaciones IoT.

Una cosa a tener en cuenta es que la gestión de conexiones es súper importante para asegurar que tu aplicación se comporte bien si su conexión se cae o el servicio se reinicia. Esto es algo que tienes que hacer por tu cuenta.

Otra muy buena opción para propagar eventos dentro de tu sistema es RabbitMQ. RabbitMQ es un broker de mensajes de código abierto, por lo que se encarga de enviar mensajes entre diferentes servicios, productores y consumidores. Tiene soporte para muchos protocolos diferentes, pero el principal que se suele usar es MQP. Y esto permite un enrutamiento de mensajes confiable, flexible y escalable.

Algunos términos clave que debes conocer sobre RabbitMQ, si empiezas a investigarlo o alguien te habla sobre su conexión, es una conexión TCP usando el protocolo MTP. Un canal, que es una conexión virtual multiplexada dentro de MQP. Así es como realizas diferentes acciones y puedes tener comunicación multiplexada a través del único socket TCP. Colas, que son componentes básicos para almacenar y gestionar mensajes específicos, e intercambios, que son como un agente de enrutamiento que te permite poner mensajes en una o más colas.

Hay un par de patrones bien conocidos en RabbitMQ. El primero sería publicar y suscribir. Esto encaja muy bien en la arquitectura de administración. Podemos tener un publicador en el lado izquierdo que publica en un intercambio, que es solo un agente de mensajería que te permite enrutar mensajes a diferentes personas. Y los consumidores pueden vincular sus propias colas a este intercambio. Así que cada consumidor que vemos en el lado derecho, consumidor A, consumidor B y consumidor C, puede realmente consumir actualizaciones de este publicador a su propio ritmo y manejarlas a su manera. Así que esto es realmente, realmente poderoso dentro de RabbitMQ. Es una propagación de cambios.

Otra cosa que podrías mirar son las llamadas a procedimientos remotos, donde el servicio A necesita enviar una instrucción al servicio B. En este caso, el servicio B instancia una cola de comandos. El servicio A interactúa con esta cola de comandos enviando un ID de correlación para el mensaje y una cola de respuesta, que es una cola a la que el servicio A debe intentar. Así que cuando el servicio A envía el comando al servicio B o a esta cola de comandos, el servicio B lo procesa y envía la respuesta con el ID de correlación en esta cola de respuesta proporcionada de vuelta al servicio A.

Cuando miramos la combinación de estas cosas dentro de tus microservicios, verás muchas cosas como esta, donde tienes intercambios yendo en cualquier dirección. Tienes este intercambio que está siendo expuesto por el servicio A, donde el cliente A está suscrito a él, y también tienes colas de comandos donde el cliente A puede decir, edita, dame todos los datos de las últimas 24 horas. No es suficiente que solo obtenga las actualizaciones en tiempo real.

Otro broker realmente bueno, que es más ligero, sería MQTT. Esto básicamente es solo un protocolo de mensajería, así que no lo confundas con los brokers en sí mismos. Esto se usa comúnmente en aplicaciones IoT, donde tienes como un ancho de banda bajo o redes poco fiables, o tal vez hay ahorro de energía con tus baterías, no quieres tener una conexión consistente. Y esto opera en un modelo básico de publicación-suscripción, que te permite desacoplar tus productores y consumidores. Algunas de las cosas que escucharás al discutir MQTT son temas, que es solo una cadena jerárquica que actúa como un mecanismo de enrutamiento.

9. MQTT Brokers and Performance Optimization

Short description:

MQTT tiene configuración de calidad de servicio con tres niveles. Los brokers MQTT envían automáticamente actualizaciones a los clientes suscritos. Combinar RabbitMQ, MQTT, event emitters y WebSockets permite servicios desacoplados y código limpio. El rendimiento puede mejorarse utilizando brokers de mensajes de alto rendimiento, desplegando productores y brokers cerca unos de otros, y considerando la tolerancia a fallos.

Así que esta es una especie de clave. Tienes publicadores, estas son las personas que envían mensajes al broker, y suscriptores, y ellos leen mensajes del broker. O más bien, el broker envía mensajes al suscriptor. También es importante saber que MQTT tiene una configuración de calidad de servicio realmente buena. Hay tres diferentes, y en el nivel cero, el mensaje se entrega como máximo una vez, y la pérdida es aceptable. En el nivel de calidad de servicio uno, el mensaje se entrega al menos una vez, pero pueden ocurrir duplicados y en el nivel dos, se entrega exactamente una vez y no debería haber duplicados.

Si miramos un ejemplo de cómo se comportan realmente los brokers MQTT, podemos ver en el lado izquierdo tenemos dos publicadores y podemos ver los datos que están publicando y el tema al que están publicando. Así que cuando publican esto, cualquier cliente que esté suscrito a ese tema recibirá automáticamente una actualización. Así que en este caso, el suscriptor en la parte superior derecha está suscrito al tema estado de la pista. Y tan pronto como el publicador en la parte superior izquierda publique un nuevo valor, será automáticamente recibido por el cliente en la parte superior derecha. Así que esto es realmente, realmente agradable. Ahora, si conectamos todas esas cosas de las que hablamos, ya sabes, RabbitMQ, MQTT, event emitters, WebSockets, obtendrás algo como esto, que es solo una cosa hipotética. No es un dibujo de uno de nuestros servicios, pero en el lado izquierdo, tenemos un radar que alimenta un servicio de radar a través de TCP. Y eso puede ser realmente, realmente difícil de distribuir a través de un sistema. Así que tenemos que meter eso en RabbitMQ mediante un intercambio donde podemos tener múltiples servicios como el Servicio A y el Servicio B que están suscritos a estos datos. El Servicio A podría enviar estos datos a otro lugar y el Servicio B está tomando otros datos y el Servicio B crea su propio tipo de intercambio que va a otro servicio y ese servicio está tomando datos de MQTT, y luego lo republicamos, y luego podemos obtenerlo en un WebSocket para enviarlo a otro lugar. Parece realmente complicado, pero de esta manera, podemos desacoplar nuestros servicios y poner mucha de la lógica dentro del middleware. Esto hace que tu código sea extremadamente limpio. Pero como hablamos antes, una de las desventajas con EDA es la complejidad.

Continuando, hay algunas cosas realmente buenas que saber sobre el rendimiento y hacer las cosas correctas con sistemas que están configurados de esta manera. La forma normal que puedes recomendar es usar brokers de mensajes bien conocidos y de alto rendimiento como RabbitMQ o Apache Kafka. Podrías querer investigar diferentes formatos de serialización como Protobuf. Desplegar productores y brokers y todas tus aplicaciones cerca unas de otras en el mismo centro de datos, misma zona de disponibilidad también ayudará mucho. Desplegar manejadores, como vimos antes, JavaScript maneja cosas asíncronas realmente bien, e incluso procesa eventos y lotes si es apropiado. Pero el rendimiento solo llega hasta cierto punto si tu aplicación es inestable. También necesitas pensar en la tolerancia a fallos. Cuantos más datos tengas circulando dentro de tu aplicación, más difícil es hacerla de alta calidad. Siempre ejecuta tu broker en un clúster y asegúrate de que tus datos se consideren replicados. Cancelamos la pérdida de datos de reenvío. Asegúrate de que tus eventos estén almacenados de manera segura.

10. Message Processing and System Building

Short description:

Configura brokers para almacenar mensajes en memoria hasta que se procesen con éxito. Maneja eventos múltiples veces con efectos secundarios no deseados. Usa reintentos automáticos y colas de letras muertas para fallos transitorios. Practica la ingeniería del caos y documenta bien productores y consumidores. Enfócate en construir complejidad simple. EDI permite escalabilidad, flexibilidad y procesamiento en tiempo real. RabbitMQ soporta enrutamiento complejo. MQTT permite entrega confiable de mensajes en entornos restringidos.

La mayoría de los brokers puedes configurarlos para que el mensaje se almacene en memoria hasta que el consumidor lo procese con éxito. Desde el lado del consumidor, siempre debes poder manejar los mismos eventos múltiples veces con efectos secundarios no deseados como la idempotencia. Y tener estos reintentos automáticos para fallos transitorios con retrocesos exponenciales. Así que reintenta cinco veces en diferentes intervalos, y si eso no funciona, deberías enviarlo a lo que se llama una cola de letras muertas para que puedas analizarlo más tarde.

Básicamente cualquier mensaje que puedas procesar, envíalo allí, y luego puedes leer los registros y averiguar qué sucedió. Y algunos consejos generales para construir sistemas como este es tener un buen monitoreo y alertas para mantener un seguimiento de la salud y el rendimiento de tu sistema y practicar la ingeniería del caos probando regularmente cómo se comporta tu sistema inyectando mensajes defectuosos intencionalmente. Otra cosa que es realmente agradable es documentar muy bien tus productores y consumidores. Si piensas en mi pequeño ejemplo de antes, puede ser un poco confuso y hay la diferencia entre complejo y complicado.

Complejo significa que puedes rastrear a través de alguna documentación y averiguar cómo está funcionando incluso si hay muchas cosas. Pero complicado significa que es realmente difícil encontrar el camino correcto al sistema. Así que enfócate en construir una complejidad simple en lugar de hacer las cosas complicadas. Para concluir, EDI se trata de escalabilidad, flexibilidad y habilitar el procesamiento en tiempo real. RabbitMQ es un broker realmente agradable, de código abierto, gratuito para usar, que soporta varios patrones de mensajería en enrutamiento complejo. MQTT es un broker súper ligero con modelo de publicación y suscripción que te permite tener entrega de mensajes confiable en entornos restringidos. Gracias.

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

Una Guía del Comportamiento de Renderizado de React
React Advanced 2022React Advanced 2022
25 min
Una Guía del Comportamiento de Renderizado de React
Top Content
This transcription provides a brief guide to React rendering behavior. It explains the process of rendering, comparing new and old elements, and the importance of pure rendering without side effects. It also covers topics such as batching and double rendering, optimizing rendering and using context and Redux in React. Overall, it offers valuable insights for developers looking to understand and optimize React rendering.
Acelerando tu aplicación React con menos JavaScript
React Summit 2023React Summit 2023
32 min
Acelerando tu aplicación React con menos JavaScript
Top Content
Mishko, the creator of Angular and AngularJS, discusses the challenges of website performance and JavaScript hydration. He explains the differences between client-side and server-side rendering and introduces Quik as a solution for efficient component hydration. Mishko demonstrates examples of state management and intercommunication using Quik. He highlights the performance benefits of using Quik with React and emphasizes the importance of reducing JavaScript size for better performance. Finally, he mentions the use of QUIC in both MPA and SPA applications for improved startup performance.
Enrutamiento en React 18 y más allá
React Summit 2022React Summit 2022
20 min
Enrutamiento en React 18 y más allá
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Sistemas de Diseño: Caminando la Línea Entre Flexibilidad y Consistencia
React Advanced 2021React Advanced 2021
47 min
Sistemas de Diseño: Caminando la Línea Entre Flexibilidad y Consistencia
Top Content
The Talk discusses the balance between flexibility and consistency in design systems. It explores the API design of the ActionList component and the customization options it offers. The use of component-based APIs and composability is emphasized for flexibility and customization. The Talk also touches on the ActionMenu component and the concept of building for people. The Q&A session covers topics such as component inclusion in design systems, API complexity, and the decision between creating a custom design system or using a component library.
Concurrencia en React, Explicada
React Summit 2023React Summit 2023
23 min
Concurrencia en React, Explicada
Top Content
React 18's concurrent rendering, specifically the useTransition hook, optimizes app performance by allowing non-urgent updates to be processed without freezing the UI. However, there are drawbacks such as longer processing time for non-urgent updates and increased CPU usage. The useTransition hook works similarly to throttling or bouncing, making it useful for addressing performance issues caused by multiple small components. Libraries like React Query may require the use of alternative APIs to handle urgent and non-urgent updates effectively.
How React Compiler Performs on Real Code
React Advanced 2024React Advanced 2024
31 min
How React Compiler Performs on Real Code
Top Content
I'm Nadia, a developer experienced in performance, re-renders, and React. The React team released the React compiler, which eliminates the need for memoization. The compiler optimizes code by automatically memoizing components, props, and hook dependencies. It shows promise in managing changing references and improving performance. Real app testing and synthetic examples have been used to evaluate its effectiveness. The impact on initial load performance is minimal, but further investigation is needed for interactions performance. The React query library simplifies data fetching and caching. The compiler has limitations and may not catch every re-render, especially with external libraries. Enabling the compiler can improve performance but manual memorization is still necessary for optimal results. There are risks of overreliance and messy code, but the compiler can be used file by file or folder by folder with thorough testing. Practice makes incredible cats. Thank you, Nadia!

Workshops on related topic

Masterclass de Depuración de Rendimiento de React
React Summit 2023React Summit 2023
170 min
Masterclass de Depuración de Rendimiento de React
Top Content
Featured Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Vería una interacción lenta, intentaría una optimización aleatoria, vería que no ayudaba, y seguiría intentando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Haría una grabación en Chrome DevTools o React Profiler, la examinaría, intentaría hacer clic en cosas aleatorias, y luego la cerraría frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos a analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, estaremos cubriendo el rendimiento de la interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Domina los Patrones de JavaScript
JSNation 2024JSNation 2024
145 min
Domina los Patrones de JavaScript
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Durante esta masterclass, los participantes revisarán los patrones esenciales de JavaScript que todo desarrollador debería conocer. A través de ejercicios prácticos, ejemplos del mundo real y discusiones interactivas, los asistentes profundizarán su comprensión de las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables. Al final de la masterclass, los participantes ganarán una nueva confianza en su capacidad para escribir código JavaScript de alta calidad que resista el paso del tiempo.
Puntos Cubiertos:
1. Introducción a los Patrones de JavaScript2. Patrones Fundamentales3. Patrones de Creación de Objetos4. Patrones de Comportamiento5. Patrones Arquitectónicos6. Ejercicios Prácticos y Estudios de Caso
Cómo Ayudará a los Desarrolladores:
- Obtener una comprensión profunda de los patrones de JavaScript y sus aplicaciones en escenarios del mundo real- Aprender las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables- Mejorar las habilidades de resolución de problemas y la legibilidad del código- Mejorar la colaboración y la comunicación dentro de los equipos de desarrollo- Acelerar el crecimiento de la carrera y las oportunidades de avance en la industria del software
React Patterns Made Simple
React Day Berlin 2024React Day Berlin 2024
62 min
React Patterns Made Simple
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Aprende patrones de React ampliamente utilizados, incluyendo HOCs, Compound Components, Provider Patterns, Functions as Child, y Portals, para escribir código más limpio y eficiente y crear aplicaciones escalables y mantenibles.Visión general En esta masterclass, los espectadores aprenderán sobre patrones clave de React que pueden hacer su código más eficiente, legible y mantenible. Presentaremos cada patrón, explicaremos cómo funciona y demostraremos ejemplos prácticos. Al final de la sesión, los participantes tendrán una comprensión sólida de cómo usar estos patrones en sus proyectos.Objetivos de aprendizajeHOCs Compound Components Provider Patterns Functions as Child Portals Modularidad Mantenibilidad Aplicación en el mundo real.
Next.js 13: Estrategias de Obtención de Datos
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Estrategias de Obtención de Datos
Top Content
Workshop
Alice De Mauro
Alice De Mauro
- Introducción- Prerrequisitos para la masterclass- Estrategias de obtención: fundamentos- Estrategias de obtención – práctica: API de obtención, caché (estática VS dinámica), revalidar, suspense (obtención de datos en paralelo)- Prueba tu construcción y sírvela en Vercel- Futuro: Componentes de servidor VS Componentes de cliente- Huevo de pascua de la masterclass (no relacionado con el tema, destacando la accesibilidad)- Conclusión
Depuración del Rendimiento de React
React Advanced 2023React Advanced 2023
148 min
Depuración del Rendimiento de React
Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Veía una interacción lenta, probaba una optimización aleatoria, veía que no ayudaba, y seguía probando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Hacía una grabación en Chrome DevTools o React Profiler, la examinaba, intentaba hacer clic en cosas al azar, y luego la cerraba frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos cómo analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, cubriremos el rendimiento de interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Construyendo aplicaciones web que iluminan Internet con QwikCity
JSNation 2023JSNation 2023
170 min
Construyendo aplicaciones web que iluminan Internet con QwikCity
WorkshopFree
Miško Hevery
Miško Hevery
Construir aplicaciones web instantáneas a gran escala ha sido elusivo. Los sitios del mundo real necesitan seguimiento, análisis y interfaces y interacciones de usuario complejas. Siempre comenzamos con las mejores intenciones pero terminamos con un sitio menos que ideal.
QwikCity es un nuevo meta-framework que te permite construir aplicaciones a gran escala con un rendimiento de inicio constante. Veremos cómo construir una aplicación QwikCity y qué la hace única. El masterclass te mostrará cómo configurar un proyecto QwikCity. Cómo funciona el enrutamiento con el diseño. La aplicación de demostración obtendrá datos y los presentará al usuario en un formulario editable. Y finalmente, cómo se puede utilizar la autenticación. Todas las partes básicas para cualquier aplicación a gran escala.
En el camino, también veremos qué hace que Qwik sea único y cómo la capacidad de reanudación permite un rendimiento de inicio constante sin importar la complejidad de la aplicación.