Blog de programador: qué sucede bajo el capó de gamer.ru

content auto translated from {from}

Breve referencia histórica

El sitio gamer.ru está atravesando ya la tercera (o incluso cuarta) reescritura completa de su código. Inicialmente, el proyecto fue escrito en Ruby-on-Rails hace ya más de una década. La arquitectura era monolítica, por lo que cada solicitud del usuario generaba una enorme cantidad de solicitudes adicionales a la base de datos y cargaba todas las bibliotecas posibles. Para asegurar el funcionamiento del recurso con 100,000 visitantes al día, se tuvieron que utilizar cinco servidores potentes, implementar memcached, Redis y replicar bases de datos en varios servidores. Esto permitió sobrevivir de alguna manera hasta 2018, cuando comenzaron los problemas financieros en la empresa y el equipo de desarrolladores se dispersó.

Aproximadamente en 2020, el sitio perdió su certificado SSL. Resultó imposible actualizarlo, ya que la versión antigua de Ruby-on-Rails dependía de una versión obsoleta de openssl, mientras que los nuevos certificados requerían una versión más reciente. Nadie se preocupaba mucho; el sitio continuaba funcionando de forma mediocre. Entre 2015 y 2025, la asistencia cayó gradualmente de 100,000 a 1,000 personas al día. En los blogs y comentarios ocultos apareció una gran cantidad de spam, incluyendo contenido poco decoroso. Yandex perdió completamente el interés en nosotros, y en la herramienta para webmasters solo había un lienzo rojo de errores críticos.

Qué hicimos para corregir todo

El sitio necesitaba una seria optimización, ya que la antigua arquitectura ya no respondía a las realidades. Se habían acumulado alrededor de 100,000 publicaciones y 1.6 millones de comentarios que debían ser trasladados cuidadosa y cuidadosamente al nuevo motor. Decidimos migrar a una arquitectura de microservicios tanto en el backend como en el frontend, aprovechando al mismo tiempo tecnologías modernas, incluidos los modernos HTMLElement's.

El proyecto fue completamente reescrito desde cero en NodeJS sin el uso de bibliotecas de terceros, lo que garantiza una vida tranquila durante los próximos 10 a 20 años. Ahora no hay que temer que la actualización de alguna biblioteca popular como ExpressJS o React rompa todo el sitio y requiera otro gran refactor. Incluso tuvimos que escribir nosotros mismos el editor visual de publicaciones, ya que no pudimos encontrar nada listo que cumpliera con nuestras modestas solicitudes. Ahora, el motor genera páginas HTML para dispositivos y motores de búsqueda antiguos, y proporciona contenido a los usuarios a través de AJAX.

Hoy en día, el sitio soporta con éxito una carga media de aproximadamente 150 solicitudes por segundo, siendo la mayoría del tráfico generada por bots de búsqueda y otros crawlers. Los bots de semrush y openai, en particular, se comportan de manera muy activa, como si intentaran descargar todo el sitio en un día. Si Yandex nos indexa lentamente, a una velocidad de 1-2 solicitudes por segundo, estos compañeros pueden hacer hasta 50 solicitudes.

Sin embargo, el motor resultó tan optimizado que toda esta armada de bots es fácilmente atendida por una única máquina virtual económica que cuesta alrededor de 500 rublos al mes.

Por supuesto, de vez en cuando, el sitio nos recuerda su presencia con errores 502 y 504, que se van identificando y corrigiendo poco a poco. A veces, resulta que alguien olvidó añadir un índice en la base de datos, otras veces, una consulta demasiado compleja tiene que ser dividida en varias más simples, y a veces simplemente se agota el espacio en el servidor. Pero no nos rendimos: el trabajo continúa, y el proceso, como se dice, está "bajo control".