Arquitectura (IT)Arquitecto de Sistema

Diseña un intercambio publicitario programático a escala planetaria y en tiempo real que organice decisiones de subasta en menos de 100 ms a través de plataformas del lado de la demanda heterogéneas, haga cumplir la programación de presupuesto por campaña sin bloqueo distribuido, detecte fraude por clic a través de huellas de comportamiento en el camino de la solicitud y reconcile discrepancias de facturación a través de entradas de libro mayor inmutables, mientras mantiene la soberanía de datos regional para el cumplimiento del GDPR.

Supere entrevistas con el asistente de IA Hintsage

Respuesta a la pregunta

Historia de la pregunta

La entrega de anuncios temprana se basaba en configuraciones de cascada estáticas donde los editores priorizaban a los socios de demanda secuencialmente, creando cascadas de latencia y pérdidas de ingresos. La transición a Header Bidding y los protocolos OpenRTB democratizó el acceso a inventarios pero introdujo extremas limitaciones de ingeniería: las subastas deben completarse en menos de 100 ms para evitar el abandono de páginas, la aplicación del presupuesto debe evitar el sobrepaso en miles de nodos de borde, y la detección de fraude debe ocurrir en línea sin añadir saltos de red. Esta pregunta surgió de la necesidad de reemplazar tuberías centralizadas de Apache Kafka con arquitecturas de computación en el borde capaces de tomar decisiones financieras autónomas mientras se mantiene una estricta auditoría y requisitos de residencia de datos.

El problema

Las arquitecturas tradicionales dependen de clústeres centralizados de PostgreSQL o Redis para contadores de presupuesto y almacenes de características, creando latencias entre regiones que violan el SLA de 100 ms durante picos de tráfico como el Black Friday. El bloqueo optimista ingenuo en los decrementos de presupuesto causa rebaños de truenos y ofertas perdidas, mientras que la detección de fraude asíncrona permite que los bots agoten los presupuestos de campaña antes de que se activen las alertas de detección. Además, la reconciliación de facturación entre DSPs (Plataformas del Lado de la Demanda) sufre de particiones de red donde los píxeles de impresión se activan pero los mensajes de reconocimiento se pierden, lo que lleva a pérdidas de ingresos o cargos duplicados que destruyen la confianza del anunciante.

La solución

Despliega Envoy Proxy como sidecars con filtros de WebAssembly en los PoPs (Puntos de Presencia) de borde para ejecutar la lógica de subasta dentro de 10 ms de los usuarios finales. Implementa contadores CRDT (Tipo de Dato Replicado Sin Conflictos) usando Redis con el protocolo Gossip para la programación del presupuesto, permitiendo que los nodos de borde acepten ofertas localmente mientras garantizan la consistencia global del presupuesto a través de la convergencia eventual. Incorpora modelos ligeros de TensorFlow Lite dentro de la capa de borde para la detección de bots en tiempo real utilizando huellas de comportamiento como patrones de velocidad del mouse y entropía de navegación. Usa Apache Pulsar con Geo-Replicación y BookKeeper para registros de auditoría inmutables, asegurando semánticas de exactamente una vez a través de Productores Idempotentes y Ventanas de Deducción. Para el cumplimiento del GDPR, implementa comprobaciones de K-Anonimato y enrutamiento de residencia de datos a través de Anycast DNS con conciencia de EDNS Client Subnet.

Situación de la vida real

Durante el evento del Black Friday 2023, nuestra plataforma experimentó un aumento de tráfico de 40 veces que saturó nuestro almacén de presupuesto centralizado de Redis en us-east-1, causando que el 12% de las subastas se agotaran y amenazando con una pérdida de potencial de ingresos de $2M. El equipo de ingeniería enfrentó una decisión arquitectónica crítica: mantener una fuerte consistencia y aceptar violaciones de latencia, o priorizar la velocidad y arriesgar un catastrófico sobrepaso del presupuesto.

Solución A: Clúster Redis con Redlock

Consideramos implementar algoritmos de Redlock a través de cinco nodos maestros de Redis independientes para hacer cumplir una estricta consistencia del presupuesto. Este enfoque teóricamente garantizaría que ninguna campaña superara su límite diario al requerir consenso mayoritario para cada decremento. Sin embargo, el tiempo promedio de ida y vuelta entre los nodos de borde y el clúster de Redis promedió 35 ms, y bajo carga, la contención del bloqueo causó que el 8% de las solicitudes reintentaran múltiples veces, superando nuestro SLA de 100 ms. Mientras esto proporcionaba una precisión perfecta del presupuesto, la latencia inaceptable y la complejidad operativa lo hacían inapropiado para la oferta en tiempo real.

Solución B: Caché Local en Memoria con Sincronización Asíncrona

Alternativamente, evaluamos permitir que cada nodo de borde mantuviera contadores de presupuesto puramente locales que se sincronizaban asíncronamente a un libro mayor central cada 30 segundos. Esto logró una latencia de subasta de menos de 5 ms y manejó el pico de tráfico con gracia sin dependencias externas. Desafortunadamente, durante el aumento, múltiples nodos de borde sobrevendieron campañas de alto valor por $800K colectivamente antes de que ocurriera la sincronización, causando problemas de confianza del anunciante y penalizaciones contractuales. La velocidad fue óptima, pero el riesgo financiero fue catastrófico para un sistema adyacente a pagos.

Solución C: Arquitectura Híbrida CRDT con Programación Hierárquica

Implementamos un enfoque híbrido usando CRDTs de Estado Delta en Redis en tres niveles: borde, regional y global. Los nodos de borde aceptan ofertas utilizando PN-Counters (Contadores Positivos-Negativos) locales con límites locales conservadores establecidos en el 95% del presupuesto global. Cuando se agotan los presupuestos locales, los nodos consultan cachés regionales con consistencia de Leer-Tus-Escrituras. El 5% restante se gestiona mediante el libro mayor global utilizando fusiones CRDT durante la sincronización de gossip. Para el fraude, desplegamos modelos de TinyML en los nodos de borde entrenados para detectar patrones de bots sin llamadas de red. Elegimos esta solución porque proporcionó una precisión del 99.9% del presupuesto mientras mantenía una latencia p99 de 45 ms.

Resultado

La plataforma procesó 12 millones de consultas por segundo durante el pico con cero sobrepaso de presupuesto en campañas limitadas. La latencia de detección de fraude se redujo de 150 ms a 8 ms, bloqueando el 3.4% del tráfico malicioso antes de la presentación de ofertas. La reconciliación CRDT logró consistencia eventual dentro de 200 ms entre regiones, muy dentro de la ventana de reconciliación de facturación, y el cumplimiento del GDPR se mantuvo mediante el procesamiento de datos locales en el borde.

Lo que los candidatos a menudo pasan por alto

¿Cómo previenes el sobrepaso del presupuesto cuando múltiples nodos de borde decrecen simultáneamente el mismo presupuesto de campaña sin adquirir bloqueos globales?

La mayoría de los candidatos sugieren bloqueos distribuidos o operaciones de decremento atómicas en Redis, que fallan bajo particiones de red o alta latencia. El enfoque correcto utiliza PN-Counters (Contadores Positivos-Negativos) implementados como CRDTs. Cada nodo de borde mantiene un contador local de incremento para gastos y un contador de decremento para reembolsos. Cuando un nodo acepta una oferta, incrementa su contador de gastos local. Durante la sincronización de gossip, los nodos intercambian sus estados de contadores y los fusionan usando la operación Join (tomando el máximo de cada componente de contador). Para prevenir el sobrepaso temporal, implementa algoritmos de Token Bucket localmente con límites conservadores. Si la suma de todos los gastos locales se acerca al límite global, los nodos entran en un "modo de austeridad" donde consultan al coordinador regional por el 5% restante del presupuesto. Esto asegura que, si bien un sobrepaso temporal del 1-2% es teóricamente posible durante particiones, el sistema nunca excede el 105% del presupuesto, lo que es aceptable para los SLA de publicidad digital, a diferencia de los sistemas bancarios tradicionales.

¿Cómo aseguras la facturación exactamente una vez cuando los píxeles de seguimiento de impresión se activan desde los navegadores de los usuarios pero las fallas de red impiden la entrega de reconocimiento al servidor de subastas?

Los candidatos a menudo proponen idempotencia de Kafka o actualizaciones de la base de datos, sin abordar el problema de extremo a extremo. La solución requiere Claves Idempotentes generadas en el borde utilizando UUIDv7 (ordenado por tiempo) incrustado en la marcación creativa. Cuando el navegador activa el píxel de impresión, incluye esta clave. La capa de Nginx en el borde escribe en Apache Pulsar con Deducción Habilitada utilizando una ventana de 24 horas. El almacenamiento BookKeeper de Pulsar garantiza que las escrituras duplicadas con la misma clave se descarten a nivel de broker, no a nivel de consumidor. Además, implementa Entrega Al Menos Una Vez a una tabla de staging de BigQuery particionada por la clave idempotente, con declaraciones MERGE que deduplican durante el proceso ETL. Esta protección de doble capa asegura que, incluso si el navegador reintenta activar el píxel 50 veces debido a errores 500, el anunciante solo sea cargado exactamente una vez.

¿Cómo manejas la desincronización del reloj entre los postores distribuidos geográficamente al determinar los ganadores de la subasta en función del tiempo de respuesta?

Esto es sutil. Los candidatos a menudo sugieren NTP o TrueTime (de Spanner), pero esto añade latencia. La arquitectura correcta elimina dependencias de reloj de pared de la lógica de subasta. En lugar de comparar marcas de tiempo de las respuestas de los DSP, utiliza Relojes Lógicos (Tiempos Lamport) o simplemente colas FIFO en el borde. Cuando comienza la subasta, el nodo de borde inicia un Temporizador de Alta Resolución (Performance.now() en V8 o C++ chrono). Las respuestas de los DSP se clasifican por orden de llegada en la interfaz de red, no por las marcas de tiempo de los encabezados. Para manejar los tardones, implementa un Tiempo de Espera Ajustable utilizando Algoritmos de Tiempo de Espera Adaptativos que se ajustan en función de la latencia histórica p99 por DSP. Para análisis posteriores y disputas de facturación, registra la lectura del Reloj Monótono y la Marca de Tiempo UTC con intervalos de incertidumbre, almacenándolos en CockroachDB, que maneja ventanas de incertidumbre automáticamente. Esto asegura equidad incluso cuando el reloj de un servidor de un DSP está 200 ms delante del de otro.