Saltar al contenido

Etiqueta: CDC

CDC con SQL Server, Kafka y Debezium (Part 1): arquitectura end-to-end con Docker Compose

Si quieres entender Change Data Capture (CDC) sin quedarte en la teoría, esta demo tiene un objetivo muy concreto: mostrar cómo un cambio en una tabla de SQL Server termina convertido en un evento de Kafka usando Debezium y Kafka Connect, todo orquestado con Docker Compose.

Para que el recorrido sea claro y útil, dividí el contenido en dos partes. En esta primera parte me concentro en la arquitectura, el flujo de datos y las decisiones de diseño. En la segunda parte dejo la guía operativa para levantar la demo, validarla y probar INSERT, UPDATE y DELETE de punta a punta.

Parte 2: Cómo levantar la demo paso a paso.

Qué problema resuelve CDC

En muchos sistemas, la base de datos es la fuente de verdad y al mismo tiempo el punto donde nacen eventos valiosos para otros consumidores: analítica, sincronización con otros sistemas, motores de recomendación, pipelines de auditoría o paneles en tiempo real. El problema es que convertir cada cambio en un evento sin acoplar la aplicación no siempre es trivial.

Ahí entra CDC. En lugar de modificar la aplicación para publicar mensajes manualmente, el patrón captura los cambios desde la base de datos y los expone como un stream de eventos. En esta demo, esos eventos se publican en Kafka y luego pueden ser consumidos por distintos clientes, incluido un visor web en vivo.

Arquitectura general de la demo

La solución está compuesta por cinco servicios dentro de la red Docker cdc-net: SQL Server como origen, Kafka en modo KRaft como broker, Kafka Connect con Debezium como capa CDC, Kafka UI para inspección y un web viewer propio para visualizar eventos en tiempo real.

Arquitectura general de la demo CDC con SQL Server, Debezium, Kafka, Kafka UI y Web Viewer
Arquitectura general de la demo y relación entre servicios.

Qué hace cada componente

  • SQL Server 2022: contiene la base de datos DemoCDC y la tabla dbo.Clientes, con CDC habilitado a nivel de base y de tabla.
  • Kafka en modo KRaft: actúa como broker de eventos sin necesidad de Zookeeper, lo que simplifica mucho la demo.
  • Kafka Connect + Debezium: registra un SqlServerConnector que hace primero el snapshot inicial y luego entra en modo streaming.
  • Kafka UI: permite inspeccionar topics, mensajes y estado de connectors desde el navegador.
  • Web Viewer: es un consumidor más del topic, implementado con Node.js, KafkaJS y WebSocket para mostrar los eventos en vivo.

Un detalle importante es que el web viewer no forma parte del pipeline CDC en sí. Está desacoplado del proceso de captura y publicación; se comporta como lo haría cualquier otro consumidor real de Kafka.

Cómo fluye un cambio desde SQL Server hasta Kafka

El flujo de datos empieza con un INSERT, UPDATE o DELETE sobre dbo.Clientes. SQL Server registra ese cambio en su transaction log y, a través de los capture jobs del SQL Server Agent, lo refleja en las tablas de CDC. Debezium no hace polling con SELECT sobre la tabla de negocio: lee ese mecanismo nativo y genera un evento estructurado con metadatos de origen, operación y estado antes/después.

Flujo de datos CDC desde la tabla dbo.Clientes hasta el topic de Kafka
Del cambio en la tabla al topic de Kafka.

Ese evento se publica en el topic sqlserver.DemoCDC.dbo.Clientes. A partir de ahí, cualquier consumidor puede reaccionar: Kafka UI para inspección manual, el visor web para una demo visual o futuros sinks hacia otros sistemas.

Secuencia de operación de un UPDATE capturado por Debezium y publicado en Kafka
Secuencia de operación desde el UPDATE hasta la visualización en Kafka UI y Web Viewer.

Por qué usé Debezium y Kafka Connect

Para este caso, Debezium resuelve mejor el problema que alternativas como polling con JDBC, triggers o tablas de auditoría manuales. La ventaja principal es que aprovecha el CDC nativo de SQL Server y produce eventos ricos con before, after, op y source.

Opción Ventaja Desventaja
Debezium Captura INSERT, UPDATE y DELETE de forma no intrusiva y con eventos completos Requiere comprender Kafka Connect y la configuración del connector
Polling con JDBC Source Arranque simple No detecta bien DELETE y puede perder cambios intermedios
Triggers + auditoría Control total Acopla la lógica CDC a la base y complica mantenimiento

Además, Kafka Connect aporta una capa muy valiosa para demos y para producción: el connector se registra por JSON, queda observable por REST y se puede reiniciar, borrar o inspeccionar sin tocar código de negocio.

Por qué Kafka en modo KRaft y por qué Docker Compose

Elegí KRaft porque reduce complejidad. En una demo local, tener un contenedor menos importa: menos servicios, menos coordinación y menos puntos de fallo en el arranque. Kafka ya no necesita Zookeeper para este escenario y eso hace el stack más didáctico.

Docker Compose también fue una decisión deliberada. Permite levantar todos los componentes con un único archivo declarativo, encapsula dependencias y vuelve reproducible la demo en cualquier equipo con Docker. Para explicar CDC de forma clara, eso vale más que montar Kubernetes o un entorno más complejo desde el inicio.

Ventajas y límites de esta demo

La principal ventaja es que el flujo completo queda a la vista: base de datos, mecanismo CDC, connector, broker y consumidores. Eso hace que sea una base excelente para aprender y para enseñar el patrón.

  • Ventajas: reproducibilidad, observabilidad, separación clara de responsabilidades y un consumidor visual pensado para demos.
  • Límites: un solo broker, replicación 1, seguridad mínima, JSON con schema embebido y ausencia de un sink persistente real.

Es decir: el patrón es el correcto, pero el despliegue está optimizado para claridad y velocidad de arranque, no para tolerancia a fallos ni endurecimiento de seguridad.

Qué cambiaría en un entorno productivo

Si esta demo evolucionara a producción, el primer salto sería endurecer seguridad y disponibilidad: varios brokers Kafka, replicación mayor, TLS, autenticación, secretos gestionados y un usuario de base de datos con permisos mínimos en lugar de sa. El siguiente paso natural sería introducir Schema Registry, métricas con Prometheus + Grafana y, por supuesto, al menos un sink connector hacia un sistema analítico o de búsqueda.

También sería buena idea aplicar transformaciones SMT para aplanar eventos o enmascarar campos sensibles, según el uso posterior de los datos.

Conclusión

La idea central de esta arquitectura es simple: desacoplar el cambio en la base de datos de los sistemas que reaccionan a ese cambio. SQL Server sigue haciendo de origen transaccional; Debezium se encarga de traducir cambios a eventos; Kafka los distribuye; y consumidores como Kafka UI o el Web Viewer permiten observar el resultado casi en tiempo real.

En la segunda parte dejo la guía operativa completa: cómo levantar el stack, inicializar la base, registrar el connector, validar el snapshot y probar INSERT, UPDATE y DELETE paso a paso. Ademas de ver en un video todo esto funcionando y compartir la demo en un repo de github.

Deja un comentario