Pluto TV — Paramount
89.6M usuarios mensuales, 400+ canales en vivo y una plataforma síncrona haciendo trabajo asíncrono.
Stack
- Go
- Apache Kafka
- gRPC
- MongoDB
- Node.js
Problema
La plataforma servía a 89.6M de usuarios activos mensuales en Estados Unidos y Latinoamérica, con 400+ canales de streaming en vivo y más de 700.000 horas de programación. Su sistema de gestión de contenido debía presentar el contenido correcto, en la región correcta, bajo reglas de distribución complejas y dinámicas a la vez: reglas que podían cambiar mientras una petición seguía en vuelo. El trabajo era fundamentalmente asíncrono. Los servicios que lo ejecutaban eran síncronos y estaban escritos en Node.js; había más de setenta. Bajo carga alta, la plataforma hizo lo que hacen los sistemas síncronos cuando se les pide trabajo asíncrono: bloquearse, y el bloqueo se propagó en cascada.
Enfoque
Lideré la ingeniería backend del CMS —gestión regional de contenido, administración de usuarios, flujos de publicidad, distribución de contenido— y diseñé un motor de procesamiento asíncrono para que la presentación de contenido se gobernara por reglas evaluadas fuera del camino de la petición. Kafka transportó los eventos; gRPC, las llamadas entre servicios. Después perfilé los cuellos de botella y migré los servicios críticos de rendimiento de Node.js a Go: no como una reescritura, sino servicio por servicio, allí donde las mediciones lo justificaban, hasta mover 70+ servicios. La cobertura de pruebas unitarias del lado Go se mantuvo por encima del 90%, y ese número es la razón por la que la migración pudo ser incremental en vez de temeraria: solo puedes mover un servicio a la vez si puedes demostrar que el que moviste sigue comportándose.
El compromiso
Reescribir en un segundo lenguaje divide la experiencia del equipo y duplica la superficie operativa mientras dure la migración. Una reescritura completa habría sido más limpia sobre el papel e imprudente en la práctica. Migrar solo donde el profiling mostraba el costo significó convivir con una plataforma políglota durante un tiempo: un precio real, pagado a sabiendas, a cambio de no apostar nunca una fecha de entrega a un corte de golpe.
Impacto
89.6M usuarios activos mensuales · 70+ servicios Node.js migrados a Go
- Motor de procesamiento asíncrono entregado — flujos no bloqueantes y resilientes bajo la carga de 89.6M de usuarios activos mensuales
- 70+ microservicios Node.js migrados a Go, servicio por servicio, solo donde el profiling lo justificaba
- Benchmark de 90%+ de cobertura en pruebas unitarias establecido en los servicios Go
- Backend del CMS entregado para 400+ canales en vivo y 700.000+ horas de programación en EE. UU. y Latinoamérica
- Servicios Go de alta concurrencia construidos sobre gRPC y Apache Kafka, mejorando rendimiento, escalabilidad y fiabilidad operativa
Lo que aprendí
El lenguaje rara vez es el problema real, y aquí no era todo el problema. Lo era la forma síncrona de petición-respuesta. Go hizo más fácil expresar la solución, pero la ganancia vino de sacar la evaluación de reglas del camino de la petición, algo que podríamos haber hecho en Node.js, más despacio. Migra cuando lo diga el profiling, nunca porque un lenguaje esté de moda.