Блог программіста: що відбувається під капотом 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, які поступово виявляються і усуваються. Іноді виявляється, що хтось забув додати індекс у базу даних, іноді занадто складний запит доводиться розбивати на кілька простих, а іноді банально закінчується місце на сервері. Але ми не здаємось — робота триває, а процес, як кажуть, «під контролем».