【CEDEC 2020】『シノアリス』クリスマスイベント&図鑑機能に起きたトラブルとは?…特定困難な障害と向き合うコツと対策を伝授


コンピュータエンターテインメント協会(CESA)は、9月2日~4日の期間、オンラインにて、国内最大のゲーム開発者向けカンファレンス「コンピュータ・エンターテインメント・デベロッパーズ・カンファレンス 2020」(CEDEC 2020)を開催している。

本稿では、9月3日に実施された講演「SINoALICE-シノアリス- それは緊急の”障害対応”」のレポートをお届け。

セッションには、ポケラボ ゲーム事業本部エンジニアを務める山口拓郎氏が登壇。2017年6月6日にリリースされた『SINoALICE-シノアリス-』(以下、『シノアリス』)において、インフラ障害や発生原因の特定が困難な障害などから、全体への影響範囲が大きかった障害について、説明とその対策について語られた。


▲ポケラボ ゲーム事業本部エンジニアの山口拓郎氏。2016年新卒としてポケラボに入社。エンジニアとして『AKB48ステージファイター2 バトルフェスティバル』に配属。現在は『SINoALICE -シノアリス-』の開発・運用に参加。
 

●長期運用が原因で起こった障害と、その対応について


『SINoALICE -シノアリス-』とは、スクウェア・エニックスとポケラボで共同開発している、童話をモチーフとしたキャラクターたちが登場するファンタジーRPGだ。『NieR』シリーズで知られるヨコオタロウ氏原案によるダークな世界観のシナリオと、ギルドメンバーと協力して敵のギルドを倒す、最大30人でのリアルタイムバトルのコロシアムがメインコンテンツとなっている。


▲コロシアムは毎日開催されており、自分のギルドは好きな時間帯をひとつ選ぶことが出来る。

『シノアリス』で起きた障害について最初に紹介されたのが、イベント負荷の緊急対応についてだ。2019年12月16日に行われたクリスマスイベントだったが、イベントのためのメンテナンス直後に、想定を大きく上回るアクセスが発生しまったという。

せっかくのイベント中に、ゲームに影響を出してしまうような負荷は避けなければならない。負荷を下げるために必要なDBスペックアップにはメンテナンスを必要するため、コロシアムが中止になってしまう。かといってフェイルオーバーを発生させていまうと数十秒の接続障害が発生するため、リアルタイムバトルにおいて致命的な影響を与えてしまう。


▲クリスマス衣装に身を包んだキャラクターたちが登場するガチャが目玉のイベント。


▲データベースのCPU使用率を現したグラフ。左の図では、22時~23時あたりでグラフが跳ねているのが分かる。これはコロシアムのプレイ終了後、ユーザーたちが一斉にホーム画面に集中して報酬を受け取る行動を取ることにより、CPU使用率が60%ほど上昇することが原因。

そこで、『シノアリス』はゲームをストップさせないために、プレゼントBOXの受け取りを3回に1回の割合で通すという暫定の対応を行った。プレゼントBOXの受け取りの処理が遅くなっていることを確認できたので、確率で通す処理に切り替え、負荷を回避したというわけだ。


▲対応後のグラフ。負荷自体は以前高い状態が続いているが、メンテナンスを入れず、フェイルオーバーよりもゲームへの影響が少ない対応でコロシアム終了後のスパイクを乗り切ることが出来た。

さらに調査を行う中で、長期運用でのサーバー削減やデータの増加により、writerへのSELECTの負荷が顕著化しているのが分かったそうだ。

このような問題は、他のシステムでも起こっていたと山口氏は話す。その例として、『シノアリス』の図鑑機能を挙げる。長期運用を続けるうちに図鑑テーブルが肥大化してしまい、SELECTのコストが高くなってしまったというのだ。

そんな問題を解消するために、『シノアリス』では図鑑登録とミッション判定を別々のタイミングで行うという対応をしたと説明。ミッション画面で整合性が取れていれば良いため、処理をAPI単位で分離することで、writerへのコストが高いSELECTの削減を図ったのだ。

イベント開始直後こそ、ガチャが最も引かれるタイミング。持ってない武器を受け取るという処理を多く呼び出されることにもなったため、ミッションの達成度を更新するアップデートの回数の削減にも成功したと山口氏は続けた。


▲図鑑機能では、プレイ中に入手した武器を見返すことができる。関連するミッションとして武器を10種類集めるなどのミッションがあり、達成すると報酬がもらえる。




▲クリスマスイベントに比べて、現在のイベント開始時はリーダーの方に負荷を逃がすことに成功していることが分かる。


 

●データ型のオーバーフローについて


山口氏は『シノアリス』で不要なデータが肥大化しやすいテーブルとして、終了したバトルデータによる「バトル系データ」、既に終了したモノガタリの「チャットデータ」、受け取り期限を過ぎているデータによる「プレゼントデータ」の3つを挙げる。

そのうち、バトル系データはリアルタイムバトルでは頻繁にSQLが投げられるため、テーブルをできるだけ小さく保っておく必要がある。データは曜日単位で管理しており、毎日深夜に5日前のデータを退避してテーブルのデータを小さくしてると山口氏は話す。チャットデータとプレゼントデータは裏でバッチを回し、テーブルを作り直すといった2つの方法で実施をしているそうだ。

このようにデータの増加に関して万全の体制を整えていたはずだったのだが、2020年3月10日にモノガタリでチャットが使用不可能になってしまう。さらに、モノガタリが進行不能になってしまうといったトラブルを立て続けに発生させてしまった。



調査の結果、チャットデータのintの最大値を超えたあたりから障害が発生ていることが判明。『シノアリス』は、リリース時よりアプリ側はサーバーからのレスポンスでチャットのIDをint型で受け取って使用していた。そのチャットのIDがintを超えてしまったため、アプリが誤作動誤作動を起こしたのが原因だったようだ。

モノガタリのチャットデータは定期的に退避を行っており、テーブルには空き領域があった。そのため、山口氏は暫定対応としてint範囲の空き領域でチャットデータの作成を行うようサーバー側で対応。この対応後はアプリの誤作動が直ったため、その間にアプリ側で恒久対応を行って問題の関係解決に至ったと山口氏は説明した。




山口氏はトラブルが発生した原因について、データのシリアライズにはMessagePackを使用しており、レスポンス型は、サーバーサイドエンジニア・クライアントエンジニアが手動入力をしていたことにあると話す。チャットデータのIDの型を変更した際にコミュニケーションミスが発生し、サーバー側とアプリ側のレスポンスに型の差が生まれてしまったと続けた。

その対策として山口氏は、スキーマ定義からサーバとクライアントのコードを同時に生成する仕組みがあれば、このようなミスが防ぐことができると説明する。根本解決として、スキーマ情報を持ったprotocolbuffers、avroなどのIDL、DBのスキーマ情報から、クライアントのコードのレスポンスの型をチェックする仕組みの導入を検討していると結論した。



最後に、ゲームを運用するための課題に対する最適な道を模索しつつ、ゲームユーザーに安定したサービスを届けるための運用をしっかりと取り組みたいとまとめ、本公演を締めくくった。

 
(取材・文 ライター:島中一郎)
 

CEDEC 2020

 
■『SINoALICE(シノアリス)』
 

公式サイト

公式twitter

App Store

Google Play



©2017 Pokelabo Inc./SQUARE ENIX CO., LTD. All Rights Reserved.
株式会社ポケラボ
http://pokelabo.co.jp/

会社情報

会社名
株式会社ポケラボ
設立
2007年11月
代表者
代表取締役社長 前田 悠太
企業データを見る