Descubriendo NodeJS y Kafka: Un Cuento de Transmisión de Eventos

Rate this content
Bookmark

En esta charla relámpago revisaremos algunos principios básicos de los sistemas basados en eventos utilizando NodeJS y Kafka y obtendremos información sobre casos de uso reales críticos donde las configuraciones predeterminadas no son suficientes. Cubriremos consejos rápidos, trucos y buenas prácticas de Kafka con NodeJS utilizando la biblioteca KafkaJS y veremos algo de código real a una velocidad vertiginosa.

8 min
16 Jun, 2022

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Esta charla relámpago introduce la computación distribuida y analiza los desafíos, patrones y soluciones relacionados con el uso de Kafka para compartir eventos. Se enfatiza la importancia de separar los servicios y utilizar una tipificación fuerte para evitar mensajes rotos. La charla también cubre la configuración y garantías de transacción de Kafka, destacando la necesidad de una configuración adecuada y el uso de identificadores de transacción. En general, proporciona información valiosa sobre el escalado de empresas, big data y plataformas de transmisión.

Available in English

1. Introducción a la Computación Distribuida y Bitvavo

Short description:

Hola a todos. Esta es una charla relámpago donde hablaré sobre la computación distribuida, el escalado de empresas, big data y plataformas de streaming. Vivo en los Países Bajos y escribo publicaciones técnicas en blogs. Trabajo para Bitvavo, el mayor intercambio de criptomonedas en los Países Bajos, con la misión de brindar la oportunidad de operar con criptomonedas para todos.

Hola a todos. Espero que esto encaje. Tuvimos algunos desafíos técnicos, pero sigamos adelante. Esta es una charla relámpago. Así que seré muy rápido.

Pasé mucho tiempo, mucho más que la charla, pensando en qué puedo decir en este corto tiempo que les ayude al menos a salir de aquí sintiendo que aprendieron algo, o tal vez que les hice pensar en algo. Mi experiencia está en la computación distribuida. Así que suelo trabajar con empresas en escalado y ayudando a los sistemas a escalar realmente. Big data, he trabajado mucho en eso. Plataformas de streaming, es mi pan de cada día desde hace unos siete años. Y actualmente, vivo en los Países Bajos desde hace siete años, viniendo de Brasil. Y escribo publicaciones técnicas en blogs. Actualmente, escribo en este, pero solía escribir en otros tres o cuatro lugares diferentes. Pero puedes encontrar mis artículos más recientes allí, generalmente hablando sobre Kafka, sobre Kubernetes, principalmente en el backend, en mi caso. Trabajo para Bitvavo. Es el mayor intercambio de criptomonedas en los Países Bajos. Así que si te interesa el mundo de las criptomonedas o quieres adentrarte en él, es tan rápido como hacer clic en un botón como ves ahí. Y ese es el objetivo de la empresa. Realmente queremos brindar la oportunidad de operar con criptomonedas para todos. Y eso es lo que estamos haciendo. Esa es nuestra misión.

2. Challenges and Solutions with Kafka Event Sharing

Short description:

En esta sección, discutiré los desafíos, errores comunes, patrones y soluciones relacionados con el uso de Kafka para compartir eventos entre sistemas. Es importante separar los servicios en una plataforma global para evitar depender de las bases de datos. Enviar eventos como JSON puede ser conveniente, pero sin un contrato, los eventos rotos pueden interrumpir el sistema. La cola de eventos de Kafka puede provocar una parada del sistema cuando un mensaje no puede procesarse, lo que resulta en una píldora envenenada.

Entonces, lo que voy a intentar hablar en este corto tiempo, voy a hablar un poco sobre este mundo en el que vivimos. Muchos de nosotros, estoy seguro de que muchos de ustedes, usan Kafka para compartir eventos entre sistemas. Y esto es un requisito, por supuesto, porque en el mundo actual en el que globalizamos nuestras plataformas y aplicaciones, no podemos depender de la base de datos. Así que realmente necesitamos separar nuestros servicios, ¿verdad?

Y voy a hablar sobre algunos desafíos, errores comunes y patrones que usamos, y soluciones para eso. Esta es una arquitectura de servicios normal. Puedes llamarlo microservicios. Realmente depende de dónde estés, cómo lo hagas. No importa. Lo importante aquí es que tienes múltiples bases de datos, múltiples fuentes de datos. Estás integrando cosas a través de Kafka. Y eso es un patrón común, cada vez más. Apuesto a que muchos de ustedes tienen esto.

Y una forma común de hacerlo, y he visto esto especialmente en el mundo de TypeScript y JavaScript, es enviar eventos usando JSON. Eso es muy fácil porque todo es JSON, pero el problema es que realmente no tienes un contrato, ¿verdad? Si envías eventos a un JSON, los productores, el lado de envío, pueden enviar algo que en realidad está roto, o que otros productores pueden enviar, y el consumidor comienza a procesarlo y se rompe. Y la forma en que funciona Kafka es una cola de eventos. Si no puedes procesar un mensaje, no avanza en el procesamiento de esos mensajes. Y de repente te quedas atascado, y todo tu sistema se detiene porque tienes lo que llamamos una píldora envenenada.

3. Evitando mensajes rotos con la cola de mensajes no entregados

Short description:

Para evitar mensajes rotos, aplica un patrón llamado cola de mensajes no entregados y utiliza una tipificación fuerte. Asegúrate de que el tipo de mensaje sea correcto en el lado del productor para evitar problemas en el consumidor. Implementa un enfoque de cola de mensajes no entregados para manejar mensajes rotos y utiliza la confirmación manual de desplazamiento.

Entonces, ¿cómo evitas eso? En realidad, es bastante simple. Aplicas un patrón llamado cola de mensajes no entregados y utilizas otros esquemas para definir realmente un esquema. Así que es un tipo fuerte.

Ahora tus mensajes deben cumplir en el lado del productor con un sistema de tipificación específico. Así que garantizas que el tipo no se va a equivocar para ese tema específico, y luego tus consumidores no se romperán para ese caso. Y puedes utilizar un enfoque de cola de mensajes no entregados que si comienzas a consumir un mensaje y está roto, en lugar de entrar en ese ciclo para siempre, intentas un par de veces, si no funciona, lo envías a una cola diferente, y pasas al siguiente mensaje. Y para eso es posible que necesites utilizar la confirmación manual de desplazamiento y voy a explicar eso y mostrar algo porque aquí hay un temporizador. Es realmente aterrador. Tengo que ir rápido.

4. Configuración y garantías de transacciones de Kafka

Short description:

Kafka ofrece una semántica de exactamente una vez y límites de transacción para procesar mensajes en una sola transacción. Para garantizar la integridad del mensaje, configura Kafka para establecer la idempotencia en verdadero en el lado del productor y deshabilitar la confirmación automática del desplazamiento en el lado del consumidor. Utiliza un ID de transacción para establecer límites y garantizar la atomicidad. Ten en cuenta que las transacciones de Kafka no son transacciones distribuidas como las transacciones XA. La configuración adecuada de las particiones del clúster y las réplicas en sincronización es crucial. Inicia, envía y confirma transacciones para garantizar el procesamiento del mensaje o la reversión. Para obtener más información, consulta la publicación del blog y prueba el archivo docker-compose proporcionado con múltiples nodos de Kafka para experimentación local.

Entonces, piensa en este productor y consumidor estándar, si simplemente usas Kafka.js o cualquier cliente que decidas usar. Los productores normales y los consumidores normales no tienen garantías sólidas. Lo que quiero decir con eso es que no te garantiza que vayas a enviar un solo mensaje en el lado del productor, podría haber duplicados. Es lo que llamamos al menos una vez. Esa es la garantía, lo que significa que puedes tener duplicados. Y en algunos sistemas, no puedes hacer eso. Si estás depositando dinero, no deberías hacer eso. Especialmente al retirar dinero de un cliente, no deberías hacer eso. Y en el lado del cliente, también puedes tener procesamiento duplicado. Esos son los valores predeterminados que obtienes si los usas. Hay soluciones para eso.

Entonces, Kafka ofrece una semántica de exactamente una vez. Eso es lo que significa EOS. Y límites de transacción. Y es muy común que tengas un patrón como ese, en el que tienes un procesador, un mensaje que se inicia como un proceso, quieres consumir el mensaje, hacer algún procesamiento y producir el mensaje en otro tema en una sola transacción. Por lo tanto, quieres asegurarte de que cuando consumas, hagas el procesamiento, algo salga mal. Si vuelves a procesar o reinicias tu sistema, procesas ese mensaje nuevamente, porque no finalizaste esos tres pasos, que es enviar ese mensaje al siguiente paso. Y para esto, debes hacer alguna configuración en Kafka.

Desde el lado del productor, debes establecer la idempotencia en verdadero. Eso garantiza que no se duplique y se envíe. Y en el lado del consumidor, debes deshabilitar la confirmación automática del desplazamiento, lo que significa que tu cliente lee el mensaje, pero ahora tienes el control. Cuando quieras decirle a Kafka que realmente procesaste este mensaje, confirmas el desplazamiento. Y también quieres establecer una propiedad llamada max in-flight request en uno, para que no haya procesamiento paralelo y puedas mantener las garantías de ordenamiento. Y en el lado del productor, en el último paso, recuerda, es consumir y luego producir, y quieres que todo esto esté en la misma transacción. Lo que quieres establecer es un ID de transacción, para que el broker pueda establecer los límites de transacción y decir que el punto es verdadero también. Y lo que esto garantiza es que cuando consumes, procesas y envías, es parte de una única transacción atómica. El cliente de Kafka, esto no es una transacción distribuida, como una transacción XA. No está garantizado que si haces una llamada a la base de datos en el lado que se revierta. Debes encargarte de eso. Está en los límites de Kafka. Es lo mismo que tu transacción normal de base de datos entre dos tablas a las que estás acostumbrado, así que ten eso en cuenta.

Algunas configuraciones del clúster, y también he terminado porque mi reloj ya está parpadeando. Debes tener al menos tres particiones y al menos dos réplicas en sincronización para tus temas para que esto funcione. Por lo tanto, si lo intentas localmente y no lo tienes, no funcionará, y también debes iniciar la transacción como puedes ver, iniciar una transacción, enviar un mensaje, enviar los desplazamientos y luego confirmar las transacciones, lo que significa que todo va a suceder o se revertirá. Y eso es básicamente lo que quieres hacer, y es realmente importante tener eso en cuenta. Eso es todo. Si quieres saber más sobre esto, escribo en esta publicación de blog específica sobre esto, y también tengo un archivo docker-compose donde tengo múltiples nodos de Kafka donde puedes probar este tipo de trabajo más avanzado en tu máquina local. Muchas 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

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

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