【AWS Solution Days 2017 ~ AWS DB Day フォローアップ】シェアードナッシング型 Web アプリケーションと Kinesis Firehose による大規模データストリーム処理


こんにちは。Cygames 技術顧問 兼 Cygames Research所長の倉林です。

2017年7月5日(水)に開催された AWS Solution Days 2017 ~ AWS DB Day ~ にて、「シェアードナッシング型 Web アプリケーションと Kinesis Firehose による大規模データストリーム処理」というタイトルで基調講演をさせていただきました。講演に参加いただいた皆さまには、改めて御礼申し上げます。

このAWS Solution Days 2017は、ゲーム業界のみをターゲットにしたものではなく、クラウドにおけるデータベース、あるいは、データインテンシブな処理に興味を持つ、幅広い技術者の方を対象にしたものであるため、本講演では、ゲーム業界のみならず様々な分野の技術者の方のお役に立つ知見を共有できればと考え、これまでに外部に紹介したことのなかった、グランブルーファンタジー スカイコンパスに搭載されている、Cygamesが独自開発した技術の事例紹介を中心した講演を行いました。

しかしながら、20分という講演時間のため、技術的な詳細を省略しながらの講演となってしまい、少し消化不良の方もいらっしゃったかもしれません。そこで、今回、フォローアップ記事として、当日お話しできなかった細部について、補足させていただければと思います。講演資料へのリンクもございますので、当日お越しいただけなかった方も、是非、御笑覧くださいませ。

まず、当日の講演資料は下記になります。

本講演では、スケーラビリティを実現するためのコンセプトとして、「Closure-like CGIによるShared-Nothing型Webアプリ」と、ゲーム本体の負荷に影響を与えずに高負荷のプロモーションサービスを実行するための「実行と書き込みの分離(Separation of Exec/Write)」の二つを紹介しました。

Closure-like CGIによるShared-Nothing型Webアプリ

シェアードナッシング(Shared-Nothing)とは、サーバサイドシステムを構成する各ノード、データベース等のリソースを共有せずに、それぞれが、完全に独立かつ自律的に動作する状態を意味します。このように、すべてのノードが独立かつ自律の状態では、単一障害点(SPOF: Single Point of Failure, その1点に障害が発生するとシステム全体が影響を受けるような要素の事)が発生しにくく、負荷に応じて処理ノードを追加するだけでスケールするシステムを構成することができます。本講演では、Closure-Like CGIと当社が名付けた、「必要なデータをすべて定数値としてバイナリ内に埋め込んだ、C++で書かれたCGI」を用いて、このシェアードナッシングを実現する方法を示しました。

具体的には、当社のアニメチェックイン システムでは、クライアントから送信されるチェックイン情報を照合するために必要なすべてのデータを、都度、C++ソースとして自動生成し、CGI実行ファイルとしてコンパイルしています。これらのCGIは、一切の外部リソースにアクセスしないようになっており、結果出力時には、O_APPENDフラグを付けて結果ファイルを開く、アトミックなファイル書き込みのシステムコールを用いているため、完全単独動作可能な、Closure-Like CGIとして動作します。

このC++を用いたClosure-Like CGIには、次の3つの利点があります。

  • 完全単独動作可能な、すなわち、ロックフリーであるため、マルチコアCPUを用いた場合の並列性が高い点。
  • UNIXのメモリ管理におけるCopy-On-Writeの仕組みにより、実行中のCGIプロセスは、そのほとんどのメモリを他のプロセスと共有するため、全CGIプロセスで共通のリードオンリーのオンメモリデータベースを構成することになる点
  • C++のSIMD Intrinsicsを用いて、Intel AVX2命令などのSIMD命令を活用し、シングルコア内での処理の並列性を高めることができる点。すなわち、マルチコアで並列化したうえに、さらに、SIMDでの並列性を実現できます。Amazon EC2におけるC4世代のインスタンスは、256bitのSIMD命令であるIntel AVX2をサポートしており、大規模行列演算を高速に実行可能です。

これにより、Closure-Like CGIは、メモリ効率の最大化と並列性の最大化を実現することができます。C++で、古式ゆかしい、プロセスベースのCGIを実装する方式は、かなり奇抜に聞こえるかもしれませんが、CGIの仕組みは極めて枯れて安定したものであるため、高負荷環境においては有効に機能しました。

Separation of Exec/Write

実行と書き込みの分離とは、リクエストへの応答に必要な計算処理と、データベースへの書き込み処理を完全に分離させ、非同期的に実行することにより、ゲームの外側の付加的なプロモーションサービスを起点に発生するデータベース書き込みが、ゲーム本体に影響しないようにする方式です。当然のことながら、メディアチェックインサービスへの負荷が、ゲーム本体のプレイアビリティに影響してはいけません。一方で、メディアチェックインをお使いのユーザ様には、チェックイン結果を直ちにレスポンスすることが求められます。そこで、「チェックインの可否そのものを決定する処理フロー」と、「チェックイン結果を、ゲーム内に反映させるフロー」を独立させ、キューイングシステムで、非同期に疎結合させました。講演では、Amazon Kinesis FirehoseとAmazon SQSを組み合わせ、各ノードから収集したチェックイン成功情報をキューイングし、非同期的にMySQLへ反映する方式を示しました。これにより、どんなに大量のチェックインリクエストが発生しても、ゲームシステムのデータベースが輻輳することはありません。

講演の締め括りでは、急激に成長するビジネスの現場においては、スケーラビリティの達成方法をサービスのモデルに合わせて柔軟に構築する、“システム・アーキテクチャ設計”が最も重要なファクターであることを再確認し、Cygamesでは、今後もクラウドを活用し、最高のコンテンツを安定したプレイ環境で、グローバルに提供していくことを示しました。

Cygames Researchでは、そのコンテンツ開発を支えるための次世代の技術開発を大学・企業と連携しながら推進していきます。

最後に、Cygames Researchでは、一緒にこのような研究を進めていく研究員を募集しています。興味のある方は、是非、下記サイトからご連絡ください。お待ちしています!