Блог программиста: что происходит под капотом gamer.ru
Небольшая историческая справка
Сайт gamer.ru переживает уже третью (а возможно, даже четвёртую) полную переписку кода. Изначально проект был написан на Ruby-on-Rails еще в далёких нулевых. Архитектура была монолитной, поэтому каждый пользовательский запрос «тянул» за собой огромное количество дополнительных запросов к базе данных и загрузку всех возможных библиотек. Чтобы обеспечить работу ресурса при 100 тысячах посетителей в сутки, пришлось задействовать целых пять мощных серверов, использовать мемкэши, Redis и реплицировать базы данных по нескольким серверам. Это позволило кое-как продержаться до 2018 года, пока в компании не начались финансовые проблемы и команда разработчиков не разбежалась.
Примерно в 2020 году у сайта отвалился SSL-сертификат. Обновить его оказалось невозможно, так как старая версия Ruby-on-Rails зависела от старой версии openssl, а новые сертификаты требовали более свежей версии. Никто особо не переживал — сайт продолжал худо-бедно работать. В период с 2015 по 2025 годы посещаемость постепенно упала со 100 тысяч до 1 тысячи человек в сутки. В скрытых блогах и комментариях стало появляться огромное количество спама, в том числе не самого приличного содержания. Яндекс полностью потерял к нам интерес, а в вебмастере было сплошное красное полотно критических ошибок.
Что мы сделали, чтобы всё исправить
Сайт нуждался в серьёзной оптимизации, так как старая архитектура больше не соответствовала реалиям. В базе накопилось около 100 тысяч постов и 1,6 млн комментариев, которые нужно было аккуратно перенести на новый движок. Мы приняли решение перейти на микросервисную архитектуру как на бэкенде, так и на фронтенде, попутно задействовав современные технологии, включая модные HTMLElement'ы.
Проект был полностью переписан с нуля на NodeJS без использования сторонних библиотек, что гарантирует нам спокойную жизнь на ближайшие лет 10–20. Теперь можно не бояться, что обновление какой-нибудь модной библиотеки вроде ExpressJS или React сломает весь сайт и потребует очередного масштабного рефакторинга. Даже визуальный редактор постов пришлось написать самостоятельно, поскольку ничего готового, что отвечало бы нашим скромным запросам, найти не удалось. Теперь движок рендерит HTML-страницы для старых устройств и поисковиков, а пользователям отдаёт контент через AJAX.
На сегодняшний день сайт успешно выдерживает среднюю нагрузку примерно в 150 запросов в секунду, причём львиную долю трафика составляют поисковые боты и другие кравлеры. Особенно активно ведут себя боты semrush и openai, которые ведут себя так, словно пытаются выгрузить себе весь сайт за день. Если Яндекс индексирует нас неспешно, со скоростью 1-2 запроса в секунду, то эти товарищи вполне могут запросить и 50.
Однако движок получился настолько оптимизированным, что всю эту бот-армию легко обслуживает всего одна недорогая виртуалка стоимостью около 500 рублей в месяц.
Разумеется, периодически сайт напоминает нам о себе ошибками 502 и 504, которые постепенно выявляются и устраняются. Иногда оказывается, что кто-то забыл добавить индекс в базу данных, иногда слишком сложный запрос приходится разбивать на несколько простых, а иногда банально заканчивается место на сервере. Но мы не сдаёмся — работа продолжается, а процесс, как говорится, «под контролем».