Todavía recuerdo el día en que instalé accidentalmente mi propio servidor de prueba.

El esquema era banal: un par de cámaras IP, un backend simple, todo esto escupe video en la web. Funcionó perfectamente en las pruebas. Y luego alguien publicó un enlace a la transmisión en el chat corporativo.

Mil (vale, vale, miento, claro, pero hubo muchas solicitudes) personas hicieron clic en el enlace al mismo tiempo. El servidor comenzó a chirriar con los refrigeradores, la RAM se agotó en tres segundos y la cámara dejó de hacer ping por completo.

Bienvenido al problema de Thundering Herd.

Si alguna vez ha intentado ampliar la distribución de videos en vivo, conoce este problema. Cuando multitudes de espectadores se apresuran a ver la misma transmisión, un servidor típico intentará abrir honestamente una nueva conexión o iniciar un proceso de carga por separado para cada uno. El resultado es siempre el mismo: OOM (memoria insuficiente) y un procesador inactivo.

No quería resolver esto invirtiendo dinero en instancias de AWS pesadas o comprando hardware nuevo. La idea era enrutar todo lo más barato posible usando Go. El spoiler no tardará mucho: al final, exprimimos 8,8 Gbit/s en un núcleo de procesador, y el recolector de basura (GC) estaba completamente descansado en ese momento.

Te contaré cómo ensamblamos Ruseon Core.

Leer más

|

@habr_ai