Blog προγραμματιστή: τι συμβαίνει κάτω από το καπό του gamer.ru

content auto translated from {from}

Μικρή ιστορική αναδρομή

Ο ιστότοπος gamer.ru βιώνει ήδη την τρίτη (και ίσως, ακόμη και την τέταρτη) πλήρη επαναγραφή του κώδικα. Αρχικά, το έργο είχε γραφτεί σε Ruby-on-Rails ακόμη και στα μακρινά μηδενικά. Η αρχιτεκτονική ήταν μονολιθική, έτσι κάθε αίτημα χρήστη «έσυρε» μαζί του τεράστιο αριθμό πρόσθετων ερωτημάτων στη βάση δεδομένων και τη φόρτωση όλων των δυνατών βιβλιοθηκών. Για να εξασφαλιστεί η λειτουργία του πόρου με 100 χιλιάδες επισκέπτες την ημέρα, χρειάστηκε να χρησιμοποιηθούν πέντε ισχυροί διακομιστές, να χρησιμοποιηθούν memcache, Redis και να αναπαραχθούν οι βάσεις δεδομένων σε πολλούς διακομιστές. Αυτό επέτρεψε κάπως να επιβιώσουμε μέχρι το 2018, όταν στην εταιρεία άρχισαν προβλήματα χρηματοδότησης και η ομάδα προγραμματιστών διαλύθηκε.

Γύρω στο 2020, ο ιστότοπος έχασε το SSL πιστοποιητικό του. Η ανανέωσή του αποδείχθηκε αδύνατη, καθώς η παλιά έκδοση του Ruby-on-Rails εξαρτιόταν από παλιά έκδοση του openssl, ενώ τα νέα πιστοποιητικά απαιτούσαν μια πιο πρόσφατη έκδοση. Κανείς δεν ανησυχούσε ιδιαίτερα — ο ιστότοπος συνέχιζε να λειτουργεί, έστω και με δυσκολίες. Από το 2015 έως το 2025, η επισκεψιμότητα μειώθηκε σταδιακά από 100 χιλιάδες σε 1 χιλιάδα άτομα την ημέρα. Σε κρυφά μπλογκ και σχόλια άρχισε να εμφανίζεται τεράστιος όγκος spam, συμπεριλαμβανομένων μηνυμάτων με όχι και τόσο κατάλληλο περιεχόμενο. Η Yandex έχασε εντελώς το ενδιαφέρον της για εμάς, ενώ στο webmaster υπήρχε ένα μονοχρωματικό κόκκινο χαλί κρίσιμων σφαλμάτων.

Τι κάναμε για να διορθώσουμε τα πάντα

Ο ιστότοπος χρειάζονταν σοβαρή βελτιστοποίηση, καθώς η παλιά αρχιτεκτονική δεν ανταγωνιζόταν πια τις πραγματικότητες. Στη βάση συσσωρεύτηκαν περίπου 100 χιλιάδες αναρτήσεις και 1,6 εκατομμύρια σχόλια, τα οποία έπρεπε να μεταφερθούν προσεκτικά σε νέο μηχανισμό. Αποφασίσαμε να περάσουμε σε μικροϋπηρεσίες τόσο στο backend όσο και στο frontend, ενώ ταυτόχρονα χρησιμοποιήσαμε σύγχρονες τεχνολογίες, συμπεριλαμβανομένων των μοντέρνων HTMLElement.

Το έργο επανασχεδιάστηκε πλήρως από μηδενική βάση σε NodeJS χωρίς τη χρήση εξωτερικών βιβλιοθηκών, κάτι που μας εξασφαλίζει ήρεμη ζωή για τα επόμενα 10–20 χρόνια. Τώρα μπορούμε να μην φοβόμαστε ότι μια αναβάθμιση κάποιου μοντέρνου βιβλιοθήκης όπως το ExpressJS ή το React θα σπάσει τον ιστότοπο και θα απαιτήσει μια άλλη εκτενή αναδιάρθρωση. Ακόμη και τον οπτικό επεξεργαστή των αναρτήσεων αναγκαστήκαμε να τον γράψουμε μόνοι μας, καθώς δεν μπορέσαμε να βρούμε τίποτα έτοιμο που να ανταποκρίνεται στις ταπεινές μας απαιτήσεις. Τώρα ο μηχανισμός αποδίδει HTML σε σελίδες για παλιές συσκευές και μηχανές αναζήτησης, ενώ δίνει περιεχόμενο στους χρήστες μέσω AJAX.

Μέχρι σήμερα, ο ιστότοπος αντέχει με επιτυχία μέση φόρτιση περίπου 150 αιτημάτων ανά δευτερόλεπτο, με το μεγαλύτερο μέρος της κίνησης να προέρχεται από αναζητητές και άλλους crawler. Ιδιαίτερα ενεργά συμπεριφέρονται οι crawlers semrush και openai, οι οποίοι φαίνεται ότι προσπαθούν να εξαγάγουν ολόκληρο τον ιστότοπο σε μια μέρα. Εάν η Yandex μας ευρετηριάζει αργά, με ρυθμό 1-2 αιτημάτων ανά δευτερόλεπτο, αυτοί οι τύποι μπορούν να ζητήσουν και 50.

Ωστόσο, ο μηχανισμός έχει βγει τόσο βελτιστοποιημένος, που αυτή η στρατιά bots εξυπηρετείται εύκολα από μία μόνο οικονομική virtual machine κοστίζουσα περίπου 500 ρούβλια το μήνα.

Φυσικά, περιοδικά ο ιστότοπος μας θυμίζει τη σημασία του με σφάλματα 502 και 504, που σταδιακά εντοπίζονται και διορθώνονται. Μερικές φορές αποδεικνύεται ότι κάποιος έχει ξεχάσει να προσθέσει δείκτη στη βάση δεδομένων, μερικές φορές μια πολύπλοκη ερώτηση πρέπει να χωρίζεται σε αρκετές απλές, και μερικές φορές απλά τελειώνει ο χώρος στον διακομιστή. Αλλά δεν τα παρατάμε — η δουλειά συνεχίζεται, και η διαδικασία, όπως λένε, «είναι υπό έλεγχο».