Blog programátora: co se děje pod kapotou gamer.ru
Malá historická poznámka
Web gamer.ru prochází již třetí (možná dokonce čtvrtou) úplnou přepracováním kódu. Původně byl projekt napsán na Ruby-on-Rails ještě v dávných nulových letech. Architektura byla monolitní, a proto každý uživatelský dotaz "táhl" za sebou obrovské množství dalších dotazů na databázi a načítání všech možných knihoven. Aby se zajistil provoz zdroje při 100 tisíc návštěvníků denně, muselo být zapojeno celkem pět výkonných serverů, použít memcache, Redis a replikovat databáze na několika serverech. To nám umožnilo tak nějak přežít do roku 2018, kdy začaly ve firmě finanční problémy a tým vývojářů se rozprchnul.
Kolem roku 2020 web přišel o SSL certifikát. Aktualizace se ukázala jako nemožná, protože stará verze Ruby-on-Rails závisela na staré verzi openssl, zatímco nové certifikáty vyžadovaly novější verzi. Nikdo se o to příliš nestaral — web pokračoval v rozumném provozu. V období mezi lety 2015 a 2025 postupně klesla návštěvnost z 100 tisíc na 1 tisíc lidí denně. V skrytých blozích a komentářích se objevilo obrovské množství spamu, včetně ne zrovna slušného obsahu. Yandex úplně ztratil zájem a ve webmasteru bylo jen samé červené plátno kritických chyb.
Co jsme udělali pro nápravu
Web potřeboval vážnou optimalizaci, protože stará architektura už neodpovídala realitě. V databázi se nahromadilo asi 100 tisíc příspěvků a 1,6 milionu komentářů, které bylo třeba pečlivě přenést na nový motor. Rozhodli jsme se přejít na mikroservisní architekturu jak na backendu, tak na frontendu, přičemž jsme zapojili moderní technologie, včetně módních HTMLElementů.
Projekt byl kompletně přepsán od nuly na NodeJS bez využití externích knihoven, což nám zaručuje klidný život na příštích 10–20 let. Nyní se nemusíme bát, že aktualizace nějaké módní knihovny jako ExpressJS nebo React rozbije celý web a vyžádá si další rozsáhlou refaktorizaci. Dokonce bylo nutné napsat vizuální editor příspěvků vlastními silami, protože nic hotového, co by vyhovovalo našim skromným požadavkům, nebylo k nalezení. Nyní motor generuje HTML stránky pro staré zařízení a vyhledávače, zatímco uživatelům dodává obsah přes AJAX.
V současné době web úspěšně snáší průměrné zatížení přibližně 150 dotazů za sekundu, přičemž velkou část provozu tvoří vyhledávací roboti a další crawleri. Zejména se aktivně chovají roboti semrush a openai, kteří se tváří, jako by se snažili stáhnout celý web za den. Pokud nás Yandex indexuje pomalu, rychlostí 1-2 dotazy za sekundu, tiše tito pánové mohou vyžadovat i 50.
Nicméně motor byl natolik optimalizován, že celou tuto armádu botů snadno obsluhuje pouze jeden levný virtuální server za přibližně 500 rublů měsíčně.
Samozřejmě nám web občas připomíná svou přítomnost chybami 502 a 504, které se postupně identifikují a odstraňují. Někdy se zjistí, že někdo zapomněl přidat index do databáze, někdy je třeba příliš složitý dotaz rozdělit na několik jednodušších, a někdy prostě dojde místo na serveru. Ale nevzdáváme se — práce pokračuje a proces, jak se říká, "je pod kontrolou".