Introducción a la capa de abstracción de datos TimeSeries de Netflix
(netflixtechblog.com)- A medida que Netflix se expande a áreas diversas como VoD y Gaming, se ha vuelto crucial la capacidad de almacenar y procesar grandes volúmenes de datos temporales (a escala de petabytes) con latencias de milisegundos.
- Con base en la abstracción Key-Value y la plataforma Data Gateway, desarrolló una abstracción TimeSeries que ofrece una solución para almacenar y consultar de forma eficiente datos de eventos temporales en distintos casos de uso.
Desafíos
- En Netflix, los datos temporales se generan y utilizan continuamente en interacciones de usuarios, exposición de activos y actividad de redes complejas de microservicios.
- Gestionar estos datos de forma efectiva es clave para garantizar la experiencia del usuario y la confiabilidad del sistema.
- Principales desafíos:
- Alto rendimiento: debe gestionar hasta 10 millones de escrituras por segundo manteniendo alta disponibilidad.
- Consultas eficientes sobre datasets a gran escala: debe almacenar datos a escala de petabytes, devolver resultados de lecturas por clave principal en bajas latencias de milisegundos y soportar búsquedas y agregaciones mediante múltiples atributos secundarios.
- Lecturas y escrituras globales: debe soportar operaciones de lectura y escritura desde cualquier parte del mundo y ofrecer un modelo de consistencia ajustable.
- Configuración ajustable: debe ofrecer la capacidad de particionar datasets en almacenes de datos single-tenant o multi-tenant.
- Manejo de tráfico en ráfagas: debe administrar aumentos repentinos de tráfico durante lanzamientos de nuevo contenido o recuperación ante fallas regionales.
- Eficiencia de costos: debe minimizar los costos de infraestructura mientras optimiza la retención a largo plazo.
Abstracción TimeSeries
- Particionamiento de datos: usa una estrategia única de particionamiento temporal y un enfoque de event buckets para gestionar eficientemente cargas burst y simplificar las consultas.
- Almacenamiento flexible: está diseñada para integrarse con distintos backends de almacenamiento, como Apache Cassandra y Elasticsearch.
- Configurabilidad: ofrece múltiples opciones ajustables para cada dataset, brindando flexibilidad para adaptarse a distintos casos de uso.
- Escalabilidad: soporta escalado horizontal y vertical para manejar el aumento de throughput y volumen de datos conforme crecen la base de usuarios y los servicios de Netflix.
- Infraestructura de shards: aprovecha la Data Gateway Platform para desplegar infraestructura single-tenant y/o multi-tenant con el aislamiento de acceso y tráfico necesario.
Modelo de datos
- Sigue un modelo de datos de eventos único que encapsula los datos de eventos para permitir consultas eficientes.
- Elemento de evento: un elemento de evento es un par clave-valor que el usuario utiliza para almacenar datos sobre un evento específico. Ej.: {"device_type": "ios"}
- Evento: un evento es una colección estructurada compuesta por uno o más elementos de evento. Ocurre en un momento específico y se identifica mediante un timestamp generado por el cliente y un identificador del evento (como un UUID). La combinación de event_time y event_id forma parte de una clave de idempotencia única del evento, para que el usuario pueda reintentar solicitudes de forma segura.
- ID de serie temporal: time_series_id es un conjunto de uno o más eventos ocurridos durante el período de retención de un dataset. Por ejemplo, device_id almacena todos los eventos ocurridos en un dispositivo específico durante el período de retención. Todos los eventos son inmutables y el servicio TimeSeries solo agrega eventos a un ID de serie temporal dado.
- Namespace: un namespace es un conjunto de IDs de series temporales y datos de eventos que representa el dataset completo de TimeSeries. Los usuarios pueden crear uno o más namespaces para cada caso de uso. La abstracción aplica varias opciones ajustables a nivel de namespace.
API
- WriteEventRecordsSync: este endpoint escribe un lote de eventos y devuelve una confirmación de durabilidad al cliente. Se usa cuando el usuario requiere garantías de durabilidad.
- WriteEventRecords: esta es la versión fire-and-forget del endpoint anterior. Encola un lote de eventos sin confirmación de durabilidad. Se usa en casos como logging o tracing, donde el usuario prioriza más el throughput y puede tolerar una pequeña pérdida de datos.
- ReadEventRecords: dado un namespace, timeSeriesId, timeInterval y eventFilters opcionales, este endpoint devuelve todos los eventos coincidentes en orden descendente por event_time con baja latencia de milisegundos.
- SearchEventRecords: dado un criterio de búsqueda y un intervalo de tiempo, este endpoint devuelve todos los eventos coincidentes. Estos casos de uso son adecuados para lecturas eventualmente consistentes.
- AggregateEventRecords: dado un criterio de búsqueda y un modo de agregación (por ejemplo, DistinctAggregation), este endpoint realiza la agregación indicada dentro del intervalo de tiempo dado. Al igual que el endpoint Search, el usuario puede aceptar consistencia eventual y una latencia potencialmente mayor (del orden de segundos).
Capa de almacenamiento
- La capa de almacenamiento de TimeSeries está compuesta por un almacén de datos principal y un almacén de datos de índices opcional.
- Apache Cassandra es el almacén de datos preferido para garantizar durabilidad en escenarios de alto throughput.
- Elasticsearch es el almacén de datos preferido para indexación.
Almacén de datos principal
- Aprovecha Apache Cassandra para manejar casos de uso de TimeSeries.
- Gestiona los datos mediante Temporal Partitioning, que divide los datos en chunks según intervalos de tiempo.
- Time slice: se mapea a una tabla de Cassandra correspondiente al período de retención
- Time bucket: vuelve a particionar datos dentro de un time slice para optimizar consultas sobre rangos de tiempo específicos
- Event bucket: vuelve a particionar un time bucket para manejar grandes volúmenes de escrituras en una serie temporal durante períodos cortos
- La tabla de datos almacena los datos reales de los eventos, y la tabla de metadatos almacena la información de configuración de time slices por namespace.
Almacén de datos de índices
- Indexa los datos en Elasticsearch para soportar patrones de acceso secundarios a través de atributos que no son clave principal.
- Los usuarios pueden configurar por namespace la lista de atributos que desean buscar y agregar.
Plano de control
- El plano de datos maneja las operaciones de lectura/escritura, y el plano de control configura todos los aspectos del comportamiento de los namespaces.
- El plano de datos se comunica con el stack de control de TimeSeries, que a su vez interactúa con el plano de control de Data Gateway.
- Mediante la configuración del namespace es posible ajustar con flexibilidad distintos aspectos (por ejemplo, particionamiento temporal, buffering, consistencia, retención, etc.).
Configuración del namespace
- Mediante un fragmento de configuración que muestra la flexibilidad del servicio, se pueden ajustar varios aspectos por namespace.
Aprovisionamiento de infraestructura
- Considerando distintos parámetros, obtiene la configuración óptima mediante un workflow automatizado de aprovisionamiento.
- El sistema aprovisiona la infraestructura inicial y luego escala según la carga de trabajo del usuario.
Escalabilidad
- Como la predicción de uso es limitada en el aprovisionamiento inicial, se requieren ajustes posteriores.
- Escalado horizontal: las instancias del servidor TimeSeries escalan automáticamente hacia arriba o hacia abajo según la demanda de tráfico.
- Escalado vertical: las instancias del servidor TimeSeries o de almacenamiento pueden escalar verticalmente para obtener más CPU, RAM y/o capacidad de almacenamiento adjunto.
- Expansión de disco: se puede adjuntar EBS para almacenar datos y, cuando el almacenamiento en disco alcanza cierto umbral, se expande el volumen de EBS.
- El re-particionamiento de datos permite ajustar datasets sobreparticionados o subparticionados.
Principios de diseño
- Idempotencia de eventos: incorpora idempotencia en todos los endpoints de mutación para que los usuarios puedan reintentar solicitudes de forma segura.
- Hedging basado en SLO: asigna objetivos de nivel de servicio (SLO) a distintos endpoints para garantizar el rendimiento.
- Devolución parcial: si el cliente es sensible a la latencia, puede aceptar conjuntos de resultados parciales.
- Paginación adaptativa: si la capa de servicio determina que el dataset de series temporales es denso, ajusta dinámicamente el factor de fan-out.
- Ventana de escritura limitada: permite que los datos se vuelvan inmutables lo antes posible para poder aplicar optimizaciones.
- Buffering de escritura: para manejar cargas burst, fusiona eventos durante períodos cortos para distribuir la carga de manera más uniforme.
- Compresión dinámica: una vez que los datos se vuelven inmutables, utiliza estrategias de compresión para optimizar el rendimiento de lectura.
Rendimiento real
- El servicio puede registrar datos con latencias bajas de milisegundos y mantener una latencia estable en lecturas puntuales.
Uso de TimeSeries en Netflix
La abstracción TimeSeries desempeña un papel clave en los principales servicios de Netflix. Estos son algunos casos de uso de alto impacto:
- Tracing e insights: realiza trazabilidad de logs en todas las apps y microservicios dentro de Netflix para entender la comunicación entre servicios, ayudar a depurar problemas y responder solicitudes de soporte.
- Seguimiento de interacciones de usuarios: rastrea millones de interacciones de usuarios, como reproducción de video, búsquedas y engagement con contenido, para mejorar en tiempo real los algoritmos de recomendación de Netflix y ofrecer insights que mejoren la experiencia general del usuario.
- Lanzamiento de funciones y análisis de rendimiento: rastrea el lanzamiento y el rendimiento de nuevas funciones de producto para que los ingenieros de Netflix puedan medir cómo interactúan los usuarios con ellas, respaldando decisiones basadas en datos para futuras mejoras.
- Seguimiento y optimización de impresiones de assets: rastrea la exposición de assets para asegurar que el contenido y los assets se entreguen eficientemente, al tiempo que proporciona retroalimentación en tiempo real para optimización.
- Facturación y gestión de suscripciones: almacena datos históricos relacionados con facturación y gestión de suscripciones para garantizar la precisión del historial de transacciones y apoyar consultas de servicio al cliente.
Mejoras futuras
A medida que evolucionan los casos de uso y crece la necesidad de hacer la abstracción más rentable, planean mejorar mucho el servicio en los próximos meses. Algunas de esas mejoras son las siguientes:
- Almacenamiento por niveles para eficiencia de costos: soportar el movimiento de datos antiguos y menos accedidos hacia almacenamiento de objetos más barato, con mayor tiempo hasta el first byte, lo que podría ahorrar a Netflix millones de dólares.
- Event bucketing dinámico: en lugar de tener una configuración algo estática al aprovisionar un namespace, soporta dividir claves en tiempo real en particiones de tamaño óptimo mientras los eventos se transmiten. Esta estrategia tiene la gran ventaja de reducir el costo total de amplificación de lectura al no particionar time_series_id que no requieren particionamiento. Además, en Cassandra 4.x hay mejoras importantes para leer subconjuntos de datos de particiones amplias, lo que podría reducir la necesidad de particionar agresivamente todo el dataset por adelantado.
- Caché: aprovecha la inmutabilidad de los datos para aplicar caché inteligente a rangos de tiempo individuales.
- Conteos y otras agregaciones: algunos usuarios solo están interesados en la cantidad de eventos dentro de un intervalo de tiempo dado, en lugar de recuperar todos los datos de eventos.
Conclusión
- TimeSeries Abstraction es un componente importante de la infraestructura de datos online de Netflix y soporta la toma de decisiones en tiempo real y a largo plazo.
- A medida que Netflix se expanda a nuevas áreas, TimeSeries Abstraction seguirá siendo un elemento central de la plataforma y contribuirá a ampliar las posibilidades del streaming y más allá.
Opinión de GN⁺
- Resulta muy llamativo el know-how de Netflix para procesar de forma confiable enormes volúmenes de datos de series temporales, asegurando al mismo tiempo escalabilidad, flexibilidad y eficiencia de costos mediante la abstracción TimeSeries. En particular, destacan técnicas optimizadas para las características de los datos y los patrones de acceso, como el particionamiento basado en tiempo, el buffering de escritura y la compactación dinámica.
- No se trata simplemente de una base de datos de series temporales, sino de una capa de abstracción que permite aprovechar con flexibilidad distintos almacenes como Cassandra y Elasticsearch, además de contar con un sistema de control para aprovisionar y operar la infraestructura según las características de la carga de trabajo. Gracias a la abstracción, los usuarios pueden ocultar la complejidad y concentrarse en los datos.
- Actualmente muestra un rendimiento capaz de manejar datos a escala de petabytes y procesar 15 millones de eventos por segundo, por lo que puede servir de referencia para empresas que busquen construir pipelines de datos temporales de alto rendimiento. En particular, sugiere que para servicios a gran escala hay que considerar de manera integral no solo el volumen y la velocidad de los datos, sino también el costo.
- Se utiliza ampliamente en áreas clave del negocio de Netflix, como tracing, análisis del comportamiento de usuarios y gestión de facturación, lo que deja claro que los datos de series temporales son un motor para la toma de decisiones basada en datos y la innovación del servicio. No se trata solo de logging, sino que también sirve de base para servicios basados en ML/AI, como las recomendaciones en tiempo real.
- Sus planes de mejora futura, como almacenamiento por niveles, particionamiento dinámico y operaciones de agregación, muestran una intención clara de seguir evolucionando de forma continua. Para responder a requisitos de negocio que cambian rápidamente, parece necesario innovar constantemente de esta manera. Sería interesante que el know-how acumulado en este proceso se compartiera a través de open source u otros medios.
Aún no hay comentarios.