プログラマーのブログ:gamer.ruの背後で何が起こっているのか

content auto translated from {from}

小さな歴史的背景

gamer.ruサイトは、既に3回目(もしくは4回目)のコードの完全な書き直しを迎えています。当初、このプロジェクトは遠い2000年代初頭にRuby-on-Railsで書かれました。アーキテクチャはモノリシックであったため、ユーザーのリクエストごとに膨大な数の追加データベースリクエストと全ての可能なライブラリの読み込みが伴っていました。1日に10万人の訪問者を捌くために、5台の強力なサーバーを使用し、Memcache、Redisを利用し、データベースを複数のサーバーにレプリケートする必要がありました。これにより、2018年までなんとか持ちこたえることができましたが、その後、会社に財政的な問題が発生し、開発チームは散り散りになりました。

約2020年、サイトはSSL証明書を失いました。証明書を更新することは不可能でした。なぜなら、古いバージョンのRuby-on-Railsが古いバージョンのopensslに依存しており、新しい証明書にはより新しいバージョンが必要だったからです。しかし、誰も特に心配していませんでした — サイトはなんとか機能し続けていました。2015年から2025年の間に、訪問者数は1日10万人から1千人に徐々に減少しました。隠れたブログやコメントには大量のスパムが出現し、その中にはさほど品の良くない内容も含まれていました。Yandexは完全に私たちに興味を失い、ウェブマスターツールには一面の重大なエラーが表示されていました。

私たちが何をして問題を解決したか

サイトは、古いアーキテクチャがもはや現実に適合していなかったため、深刻な最適化が必要でした。データベースには約10万件の投稿と160万件のコメントが蓄積されており、それらを新しいエンジンに注意深く移行する必要がありました。私たちは、バックエンドとフロントエンドの両方でマイクロサービスアーキテクチャに移行し、流行のHTMLElementなどの最新技術を取り入れることにしました。

プロジェクトは完全にゼロからNodeJSで書き直され、サードパーティのライブラリは一切使用していません。それにより、今後10〜20年の間に安心して運用できることが保証されています。ExpressJSやReactのような流行のライブラリの更新が全サイトを壊し、大規模なリファクタリングを要求することを恐れる必要はありません。投稿のビジュアルエディタでさえ、私たちの控えめな要求に合ったものが見つからなかったため、自分たちで書く必要がありました。現在、エンジンは古いデバイスや検索エンジン向けにHTMLページをレンダリングし、ユーザーにはAJAXを通じてコンテンツを提供します。

現在、サイトは毎秒平均約150のリクエストを捌いており、その大部分は検索ボットやクローラーです。特にsemrushやopenaiのボットは、まるで一日で全サイトをダウンロードしようとしているかのように活発に行動しています。Yandexが1〜2のリクエストを秒速でゆっくりとインデックスするのに対し、これらの仲間は時には50リクエストを要求することがあります。

しかし、エンジンは非常に最適化されているため、このボットの大軍を処理するために、わずか500ルーブル/月の安価な仮想マシンだけで済んでいます。

もちろん、時折サイトは502や504のエラーで私たちに思い出させてきますが、それらは徐々に調査され、修正されています。時には誰かがデータベースにインデックスを追加するのを忘れていたり、複雑すぎるリクエストをいくつかの簡単なものに分ける必要があったり、サーバーのストレージが不足していたりすることがあります。しかし、私たちは決して諦めません — 作業は続いており、プロセスは「制御下にある」と言われています。