Y realmente no creo que la consulta periódica califique aquí. Entonces, otro enfoque es agregar infraestructura adicional.
Puedes garantizar la escalabilidad utilizando sistemas de mensajería como Kafka o RabbitMQ. Nuevamente, veamos cómo funciona esto con un escenario simple de Alice, Bob y Jane nuevamente. Esta vez tenemos una cola de Kafka conectada a nuestro servidor de API y el primer paso es suscribirnos a un tema de Kafka. Luego recibimos el mensaje de saludo de Alice. El servidor de API escribe el mensaje en la base de datos y luego publica el evento en Kafka. A partir de ahí, recibe nuevamente el evento y luego puede transmitirlo a Bob y Jane.
Con este enfoque, resolvemos el problema de la escalabilidad horizontal que teníamos con las actualizaciones a nivel de aplicación. Pero la sobrecarga operativa de configurar y mantener infraestructura adicional es realmente notable. Y si has trabajado con Kafka antes, creo que sabes que no es el sistema más fácil de trabajar. Entonces, un segundo problema aquí sigue siendo el problema de escritura dual. Veamos un poco más en profundidad qué es esto realmente. Aquí vemos el código de cómo podría implementarse con Kafka cuando recibimos este mensaje de uno de nuestros usuarios.
En realidad, se refiere al primer paso que vimos en la secuencia anterior. El servidor de API recibe primero el mensaje y lo escribe en la base de datos, y luego lo envía al tema de Kafka al que van los mensajes de chat. Pero, ¿qué sucede si una de estas operaciones falla? Ahora te encuentras en un estado inconsistente porque tanto la base de datos ha almacenado datos que no han llegado a tus usuarios, o viceversa, tus usuarios están viendo datos que no están almacenados en la base de datos. De cualquier manera, es una situación muy indeseable y muy difícil de resolver. Por supuesto, podrías comenzar a implementar tu propia lógica de reintento o intentar envolver todo en una transacción, pero todo esto se vuelve muy complicado y también consume muchos recursos nuevamente.
Entonces, ¿cómo podemos resolver este problema a un nivel más profundo? Y la respuesta a eso es la captura de datos de cambio. La captura de datos de cambio es un patrón de diseño basado en la idea de un flujo de datos unidireccional. Y con eso, en realidad no es el servidor de API el que transmite las actualizaciones a nuestro sistema de mensajería, sino que estas actualizaciones se propagan directamente por la base de datos. Volvamos a recorrer el mismo escenario, pero esta vez utilizando un flujo de datos unidireccional y la captura de datos de cambio. Entonces, Alice nuevamente comienza enviando el mensaje al servidor de API y luego este lo almacena en la base de datos. Ahora la base de datos es responsable de publicar esta actualización en el sistema de mensajería. Y a partir de ahí, el servidor de API recibe la actualización del sistema de mensajería que estamos utilizando y puede transmitir el mensaje a todos los clientes suscritos. Ahora resolvemos de manera muy elegante este problema de los derechos duales y las posibles inconsistencias de datos cambiando la forma en que los datos fluyen a través de nuestro sistema. Entonces, ¿cuál es el inconveniente con CDC? Si tuviera que resumirlo, es realmente esto. Se vuelve complicado. Si quieres mantener y construir tu propio sistema de CDC, esto no es una tarea fácil.
Comments