ゲーム

サーバメンテナンスの延長について思うこと

仕事をさぼってTwitterを見ていたら、トレンドに「メンテ延長」が入っていた。私はついついツイートラインを追いかけてしまった。今はスマホゲームを一切やらないので、そのゲームのことや具体的に何が起きているかはよく分からない。でも、ユーザがイライラしてやり場のない怒りをTwitterにぶつけているというのだけは分かる。

しかし、私はかつては「言われる側」の人間だった。私は度々「メンテ延長」を犯し、ユーザから非難される側の人間だった(私はサーバエンジニアのまとめ役的な立ち位置で、サーバメンテナンスを取り仕切る立場であった)。なので、どうしてもツイートラインの批判的な意見、とくに「こうすればいいのに」的な意見を見ても「それはできないんよ・・」「そうはいってもそれは無理なんだよね・・」という切ない気持ちになってしまうのである。

メンテ時間の見積もり

Twitterの
ご意見番

毎回メンテ延長するくらいなら、サーバメンテの時間をあらかじめ長く見積もっておけよ!!

なるほど、ごもっともな意見である。ではなぜ度々メンテ延長が起きるか?であるが、何度もサーバメンテを延長させてきた私なりの答えは以下になる。

そんなこと言われるまでもなく、サーバメンテ時間は常にかなり長く見積もっている。予定時間が1時間くらいのメンテならば、実作業は10分くらいで終わっていることが多い。

ひとえにサーバメンテナンスと言っても、実際にやる作業は多種多様だ。ネットワークを利用するゲーム(主にスマホゲー)なら以下のような作業があるだろう。

  1. メンテナンスモードへの移行と解除(ユーザのゲーム画面をメンテナンス画面に切り替えたり、ゲームできる画面に戻したり)
  2. ゲームクライアント(iOS、Androidのアプリ)の更新など
  3. ゲームサーバプログラムの更新(新機能や新アイテム、新イベントの追加、不具合の修正、リファクタリング)など
  4. イベントの集計処理、イベントの報酬付与処理など
  5. サーバの調整(サーバの追加や削除、データストレージの追加や削除、ログデータの待避や削除、OSのアップデート、使用ライブラリのアップデート、セキュリティの調整、ハードウェアの交換)など
  6. データベースの調整(新イベントデータの挿入、終了したイベントデータの後処理、負荷調整、インデックスの調整)など
  7. キャッシュデータの装填(取得頻度が多いデータなどはサーバのメモリにぶち込んで、すこしでも快適に遊べるようにする)
  8. ネットワーク機器の調整(追加、交換)
  9. ユーザの個別対応(返金処理、アイテム付与、ログ調査)
  10. メンテナンスの進捗告知
  11. その他(たぶん他にも色々とあるが、もう5年現場から離れているので忘れた・・・)

5年前の知識で止まっているので、もしかすると古いといわれる可能性もあるが、おそらくは今もそれほどは変わってないと思う。

1回のメンテと言ってもこなさなければならないタスクはそれなりに多い。並列作業できるものもあれば、そうでないもの(●の作業が終わらないと▲の作業はできないなど)もあったりで、大型のアップデートの場合などはメンテナンスの段取りを考えるだけでも数日作業だったりする。

メンテの段取りをつくる際は、できるだけミスが起きにくく、効率的に、なるべくはメンテ時間が短くなるように・・・、と試行錯誤する。行う作業の内容を精査して整理し、作業の順番を考え、一つ一つの作業時間を見積もり、それに対して適切なバッファ(余裕、ゆとり)も考慮して、メンテナンス全体の時間を見積もる。また、だいたいの場合は「ステージング環境」と呼ばれる、実際にサービスを提供する本番環境とほぼ同じ構成の別環境が存在していて、そこでメンテの予行演習をしてかかった時間を計測する。そこでの時間も加味し、全体にさらにバッファを入れて最終的なメンテの時間を決める。

私の場合は実作業にかかる時間の約2〜3倍くらいをサーバメンテの時間として告知するようにしていたと思う。ディレクターに「なんでそんなに時間かかるの?」と文句っぽいことを言われたりすることもたびたびあった。だが、エンジニアの立場としては作業担当が時間に追われて焦ってミスをして、そのエンジニアが責められるようなことはあってはならないし、何より「メンテ延長」をユーザに伝えるのは苦痛である(バタバタしてる中でのメンテ延長の告知ってのも結構大変なのよ)。

実際にサーバメンテをした際の8〜9割くらいは時間内で終わっていたと思う。メンテ終了後にイベントがないときなどは、早めにメンテを終わらせることもできるが、メンテ終了後にイベントが走る場合はそれができないので、数時間なにもすることがなくボケーっとしていたことも多々あった。

つまり、これを逆に言うと、

サーバメンテを入れると、その1〜2割の確率で、我々人類が想像もできないような不幸な事故が発生し、メンテ延長をせざるを得なかった!

のである。

なぜ想像もつかない事故が起きるのか

Twitterの
ご意見番の
リプライ

金取ってるんだから、それくらいのこと想像しろ、アホが!

うーん、これもごもっともである。想像力の欠如といわれると反論はできない。でも、やっぱりどうしても想像できないことは起きるんですよ。人間の想像力には限界があるし、できないことはできない。いずれ、AIがサーバメンテをすれば、数百億のパターンを想像して、メンテ延長のない時代がくるかもしれない。

どんなことでサーバメンテが延長せざるを得なかったかを思い出してみる。

  1. iOSやAndroidのゲームクライアントのバージョンの切替をしても、なかなか反映されない
  2. とにかくデータベースまわりで諸々不具合が出る
  3. 新しく追加したイベントやアイテムがなぜかうまく動かない

①は私が現場にいた2010年代前半は度々おきていたと思う。通常ならAppleやGoogleにアプリのバージョンアップの切替申請をすると30分とか1時間とかでアップデートプログラムが落とせるようになるのあが、まれに数時間かかることがあったり、半日くらい反映されないこともあった。とにかく待つことしかできない。これは当時はどうやっても防げない事故だったと思う。

このような事故を防ぐ手立てとして、アプリのバージョンアップに頼らずにゲームクライアント内のプログラムを勝手に切り替えることができるような仕組みをいれる(イベントデータやアイテムデータの更新のふりして、こっそりゲーム内プログラムをサーバから落とし、こっそりとアプリ内のプログラムを更新する)というのをやったりするのだが、基本的にはAppleやGoogleはこのようなことを許していなかったりするし、なによりこの仕組みを作ること自体が結構大変である。今の時代はどうなっているのか分からないけど、同じような問題が起きている可能性はある。

②について書くと、今のゲームはとにかく膨大なデータとの戦いなのである。ゲームの仕様やイベントが複雑化し、それを動かすべくの必要になるデータも比例して大きくなり、かつそれらのイベントの経過や状態を保存するデータも保存しなければならいので、データベース内のデータは盛り盛りと溜まっていく。そして、当初の見積もりよりも大きなデータになってしまい、必要なデータの検索に時間がかかようになったりする。それを時間がかからないようにするためにデータベース内にある「インデックス」と呼ばれる辞書で言う索引みたいなものを調整したりするのだが、その調整をしようとしたら思いのほか時間がかかってしまった、みたいなことが起きたりするのである(何百万件の索引を作り直すのだから、時間がかかるのある程度は織り込み済みだったりするんですけど・・)。これは一つの例で、データに関しての想像もできない事象はこれ以外にも色々とあった・・・

③は「テストが足りない!」と言われればその通りなのだが、往々にしてイベントというのはまだイベントのプログラムが完成してない数週間前に告知され、それに間に合わせるべくエンジニアやデザイナーがギリギリの時間で実装するのだから、実装に手間取ったりしてテストの時間が少なくなってしまうことも多々ある。また、何千人規模が同時に動くようなイベントのテストというのをリアルにやるのはなかなか難しい(ある程度の仮想クライアントを立ててシミュレートしたりはするけど、人間の行動パターンまでを実装してのシミュレートはまず無理)。

ゲーム=娯楽である、ということに寄りかかっている感はたしかにある

医療機器とかであれば、ちょっとしたことが人の命に関わるし、万全を期すまで何度も何度もテストをし、99.999%事故は起きないというところまで突き詰めるだろう。そのコストは製品価格に当然乗せるので、医療機器は高くて当たり前である。

しょせんゲームであり娯楽である。医療機器メーカーのような考え方でゲームを運営したら、ガチャ1回で1万円とかになっちゃうかもしれないし、そうなるとゲームにはならない。「ある程度の事故は起きるよねー、起きたらごめんねー、返金や詫び石で許してねー」という感覚がないとゲームなんて運営できない時代になっている。

もちろん「ユーザがメンテ延長を批判するな」とは言ってない。プレイヤーである以上、無課金であれ批判する権利はある。ただ、もしメンテ延長が許容されない世界があったなら、その世界では決して楽しいゲームが生まれることはないだろう。

「メンテ延長が起きる」=「自分は楽しいゲームを遊べる世界にいるのだな」

という感じで生暖かく見守ってあげるのがいいのだと思う。

サーバメンテナンスと称してユーザを遊べなくさせる時間を取る必要があるのか?

という話がある。ユーザに遊んでもらいながら、裏でこっそりやればいいじゃない。たしかに、そうだ。これについて、もし書けたら書いてみたい。