Hablemos sobre procesamiento de data en tiempo real.
Contexto: El otro día estaba en Twitch viendo un stream de Illojuan y más que ver el stream, me distraje con la cantidad de data que estaba fluyendo en tiempo real en milésimas de segundos.
Millones de mensajes en el chat, moderadores bloqueando y eliminando mensajes ofensivos, cientos de espectadores, suscripciones, donaciones, cambios de cámara, efectos, etc.
Y eso sin contar que él era solo una persona de las miles que estaban haciendo stream al mismo tiempo.
¿Cómo puede ser que una plataforma soporte esa cantidad de información?
Imaginemos este sistema como una orquesta gigante, donde cada sección tiene que tocar perfectamente sincronizada. Vamos a tener 4 secciones esenciales:
- Data Ingestion
- Data Processing
- Data Storage
- Data Delivery
1. Data Ingestion (Ingestión de datos)
Esta es la primera fase en este camino de procesamiento de datos en tiempo real.
Se trata de capturar toda la información que recibes desde diferentes lugares para entonces procesarla en las próximas secciones.
Imagina que tu API es un aeropuerto concurrido donde la data hace referencia a las distintas aerolíneas que intentan aterrizar en la pista.
Para hacer este trabajo tenemos herramientas como Apache Kafka o Amazon Kinesis que son capaces de gestionar un gran volumen de datos y soportar la presión mediante la gestión de flujos de datos.
Por ejemplo, con Kafka podemos configurar temas relacionados con diferentes flujos de datos (por ejemplo, actividades de usuario, transacciones) que tu API necesita ingerir.
2. Data Processing (Procesamiento de datos)
Una vez que se ingieren los datos, el procesamiento de datos hace la magia.
Este paso transforma los datos sin procesar en información significativa.
Volviendo a nuestra analogía del aeropuerto, esto es como la aduana y el reclamo de equipaje: los datos se verifican, clasifican y envían a donde deben ir.
Como herramientas, en este caso tenemos Apache Storm o servicios de Google como Google Cloud Dataflow donde podemos hacer el procesamiento de flujos de datos con baja latencia.
Por ejemplo con Apache Flink, podemos definir análisis en tiempo real de las transmisiones ingeridas o también agregar las actividades del usuario en una ventana de 5 minutos para analizar tendencias o detectar anomalías.
3. Data Storage (Almacenamiento de datos)
Es necesario almacenar todo esos flujos de datos en la alguna parte.
Y aquí hay otro poco de magia, porque imagina lo rápido que tienen que escribir estas base de datos para evitar bloquear el sistema 😮💨
En el caso de estas APIs, vamos a querer un equilibrio entre la accesibilidad inmediata y la persistencia a largo plazo.
Piensa en esto como el sistema de equipaje del aeropuerto, que guarda el equipaje hasta que lo reclaman.
Entre las herramientas que tenemos, una de las más populares es Redis que es bastante utilizada para implementar temas de caché, pero en este caso tiene mucho más protagonismo.
Redis se puede utilizar para almacenar datos de sesiones en tiempo real para un acceso rápido, lo que garantiza que los tiempos de respuesta sean rápidos para las consultas de los usuarios.
También hay otras alternativas a Redis como Cassandra o Memcached.
4. Data Delivery (Entrega de datos)
Y finalmente, vamos a tener que entregar esos datos a los usuarios finales u otros sistemas de alguna forma.
Para este caso tenemos varias técnicas como WebSockets para mantener una conexión bidireccional con los clientes, tenemos eventos enviados desde el servidor (SSE), MQTT para aplicaciones de IoT y pare usted de contar.
Consideraciones
Obviamente no todo es tan simple, tenemos que gestionar muchos recursos para asegurar que el sistema soporta todo este flujo y cumple con su trabajo.
- Escalabilidad: diseña un sistema que pueda escalar horizontalmente, agregando más máquinas o instancias a medida que aumenta la carga. Puedes utilizar balanceadores de carga para distribuir el tráfico de manera uniforme.
- Tolerancia a fallos: agrega mecanismos de redundancia y conmutación por error. Hay herramientas como Apache ZooKeeper para administrar sistemas distribuidos y garantizar que puedan recuperarse de fallas.
- Seguridad: tienes que proteger los datos en tránsito y en reposo. Utiliza TLS para datos en tránsito y cifrado para los datos en reposo. También utiliza mecanismos de autenticación y autorización para controlar los accesos.
- Monitoreo y observabilidad: utiliza herramientas como Prometheus para monitoreo y Grafana para observabilidad. Pueden ayudarte a controlar el estado del sistema, las métricas de rendimiento y los registros para solucionar problemas.
Para finalizar
Entender y manejar el flujo de datos en tiempo real es una tarea compleja que requiere una combinación de tecnología adecuada, diseño de sistema robusto y una estrategia de escalabilidad y seguridad bien pensada.
Es fundamental elegir las herramientas correctas para cada fase del proceso - ingesta, procesamiento, almacenamiento y entrega de datos - y garantizar que el sistema es capaz de manejar picos de carga sin degradar la experiencia del usuario.
Nos vemos en la edición #30
Te animo a experimentar con las herramientas y técnicas discutidas, y a compartir tus experiencias y aprendizajes con la comunidad.
Recuerda que si quieres hablar de algo en particular puedes sugerir el tema respondiendo este correo.
Hasta pronto 👊🏼
#29 Orquestando datos en tiempo real: una guía para Ingenieros de Software
Exploramos cómo las plataformas manejan enormes volúmenes de datos en tiempo real, desde la ingesta hasta la entrega, destacando herramientas y estrategias clave para ingenieros de software senior y líderes técnicos