1
/
5

とある遅咲きエンジニアの歩み 〜その4〜

追加した新機能でサーバ負荷が跳ね上がる

無事にリリースできた新ゲームですが、実はリリース日を遅延させないために、当初実装予定だった機能を実装していない状況でした。
それはフレンド機能です。

ゲーム内でフレンドを作り、そのフレンドと協力してゲームを進めていくという機能なのですが、これがサーバ負荷との戦いの始まりでした。


↑↑↑の画像のようにゲーム画面下部にフレンドの名前などと一緒に、フレンドのゲーム内のレベルやゲームの状況を簡易表示させるのですが、仮にフレンドが100人いた場合、100人分のデータをデータベースから取得してこなければなりません。

当初はここがサーバ負荷に直結するとは考えていなかったため、ゲームの仕様としてはフレンド数に制限がなく、また基本的にフレンドが多ければ多いほどゲームを進めやすくなるということになっていました。

そのため、中にはフレンド数が数百というユーザもおり、そのユーザがゲーム画面を開くたびに数百というフレンドのゲーム情報をデータベースから取得することになってしまいます。
ユーザ名などは読み込みが早いキャッシュサーバに持たせたりもしておりましたが、リアルタイムでデータが書き換わるものについてはデータベースで保持していたため、フレンド機能をリリースすると早々にサーバ負荷が高まりサーバからのレスポンスが遅くなりだし、ユーザから問い合わせがくるということになりました。

私も含めて、チーム内にインフラ専門のエンジニアがいるわけではなく、本格的なゲーム開発経験があるものもいないため、とにかく暗中模索の中で対策を練らなければなりません。
データの保存場所をキャッシュサーバにすれば読み込み時間は短くなりますが、そうするとデータを更新する際にデータベースだけでなくキャッシュサーバ上のデータも書き換える必要が出てくるため、かえって状況が悪化する可能性があります。
ゲーム内のデータのうち、どのデータが頻繁に書き換えられるのか、どのデータは更新頻度が少ないのかなどを調べて設計し直していく必要があります。

ここから数年経過すると、ioDriveという高速でデータの読み書きができるサーバやベアメタルという物理サーバを利用したり、AWSのRDSで高スペックのインスタンスを使うなど、サーバインフラ側の対応でサーバ負荷を乗り越えることができるようになったのですが、当時はそのようなものがまだ存在しないか、存在していたとしてもそれを使える知識がなかったため、そこまでスペックが高くないクラウドのサーバで、とにかくプログラムによる処理分散とデータベースのチューニングという、今から思うととても泥臭いやり方でどうにか日々を乗り切っておりました。

結果として処理遅延なども何度か発生し、ゲームをプレイしていたユーザには不快な思いをさせてしまったので申し訳ない気持ちでいっぱいではありますが、エンジニアとしてはこのように泥臭くサーバ負荷と格闘できたことは、大きな財産になったと今でも思っています。

新ゲームの開発が始まる

Yahoo!モバゲーで新しくゲームを開発することになり、そのサーバサイドの開発を私が担当させて頂けることになりました。
さすがに、リリース済みのゲームの保守、運用をしながら新ゲームの開発は不可能なので、新たにアサインしたメンバーにリリース済みのゲームを引き継ぎ、新ゲーム開発に専念します。
新たなゲームは映画公開のプロモーションを兼ねるとのことでしたので、リリース日の大幅遅延などは許されません。
また、既にリリース済みのゲームよりも多くのユーザがプレイしてくれることが予想されるため、今度は最初から負荷対策をした設計で開発を進めていきます。

結果として、ゲームは無事にリリースできたもの、予想以上のユーザ数となったため、またもサーバ負荷との戦いが始まることになります。

そして、今までのエンジニア人生の中でダントツで1位の大障害を起こしてしまうわけですが、それはまた別のお話。

株式会社フジゲームス's job postings

Weekly ranking

Show other rankings
If this story triggered your interest, go ahead and visit them to learn more