Blog programisty: co się dzieje pod maską gamer.ru

content auto translated from {from}

Mała historyczna wzmianka

Strona gamer.ru przechodzi już trzecią (a może nawet czwartą) całkowitą przepisanie kodu. Początkowo projekt został napisany w Ruby-on-Rails jeszcze w odległych zerach. Architektura była monolityczna, dlatego każde zapytanie użytkownika „ciągnęło” za sobą ogromną liczbę dodatkowych zapytań do bazy danych i ładowanie wszystkich możliwych bibliotek. Aby zapewnić działanie serwisu przy 100 tysiącach odwiedzających dziennie, trzeba było użyć aż pięciu potężnych serwerów, wykorzystać memcache, Redis oraz replikować bazy danych na kilku serwerach. Dzięki temu udało się jakoś przetrwać do 2018 roku, aż w firmie zaczęły się problemy finansowe i zespół programistów się rozpadł.

Około 2020 roku strona straciła certyfikat SSL. Odnowienie go okazało się niemożliwe, ponieważ stara wersja Ruby-on-Rails była uzależniona od starej wersji openssl, a nowe certyfikaty wymagały nowszej wersji. Nikt szczególnie się tym nie martwił — strona w miarę jakoś działała. W okresie od 2015 do 2025 roku oglądalność stopniowo spadła ze 100 tysięcy do 1 tysiąca osób dziennie. W ukrytych blogach i komentarzach zaczęło pojawiać się ogromne ilości spamu, w tym o nie najlepszej treści. Yandex całkowicie stracił zainteresowanie nami, a w webmasterze pojawiło się mnóstwo krytycznych błędów.

Co zrobiliśmy, aby wszystko naprawić

Strona potrzebowała poważnej optymalizacji, ponieważ stara architektura nie odpowiadała już rzeczywistości. W bazie nagromadziło się około 100 tysięcy postów i 1,6 miliona komentarzy, które trzeba było starannie przenieść na nowy silnik. Podjęliśmy decyzję o przejściu na architekturę mikroserwisową zarówno w backendzie, jak i frontendzie, przy okazji korzystając z nowoczesnych technologii, w tym modnych HTMLElement'ów.

Projekt został całkowicie przepisany od podstaw na NodeJS bez użycia zewnętrznych bibliotek, co gwarantuje nam spokojne życie na najbliższe 10–20 lat. Teraz nie trzeba się bać, że aktualizacja jakiejkolwiek modnej biblioteki jak ExpressJS czy React złamie całą stronę i będzie wymagana kolejna duża refaktoryzacja. Nawet wizualny edytor postów musieliśmy napisać sami, ponieważ nie udało się znaleźć nic gotowego, co odpowiadałoby naszym skromnym wymaganiom. Teraz silnik renderuje strony HTML dla starszych urządzeń i wyszukiwarek, a użytkownikom dostarcza treść przez AJAX.

Obecnie strona skutecznie wytrzymuje średnie obciążenie około 150 zapytań na sekundę, przy czym znaczna część ruchu to boty wyszukiwarek i inne crawler. Szczególnie aktywne są boty semrush i openai, które zachowują się tak, jakby próbowały pobrać całą stronę w jeden dzień. Jeśli Yandex indeksuje nas powoli, w tempie 1-2 zapytań na sekundę, to ci koledzy mogą wysłać nawet 50.

Jednak silnik okazał się tak zoptymalizowany, że całą tę armię botów łatwo obsługuje jedna niedroga wirtualka kosztująca około 500 rubli miesięcznie.

Oczywiście od czasu do czasu strona przypomina nam o sobie błędami 502 i 504, które są stopniowo wykrywane i usuwane. Czasami okazuje się, że ktoś zapomniał dodać indeks do bazy danych, czasami zbyt złożone zapytanie trzeba rozbić na kilka prostych, a czasem po prostu kończy się miejsce na serwerze. Ale nie poddajemy się — praca trwa, a proces, jak to się mówi, „jest pod kontrolą”.