GREE Tech Conference 2022で発表された資料です。 https://techcon.gree.jp/2022/session/TrackB-5
ポケラボ内製リアルタイム通信エンジンの昇華株式会社ポケラボ エンジニアマネージャー 齋藤冬斗株式会社ポケラボ サーバサイドエンジニア 山口拓郎
View Slide
• リアルタイム通信エンジンに興味がある方• 自社製エンジンの replace に興味がある方• ポケラボ、そしてポケラボがどんなことをやっているか興味がある方本講演のターゲットについて2
3 自己紹介齋藤 冬斗 (Fuyuto Saito)• モバイルゲーム会社にてモバイルゲーム、コンシューマゲーム、リアルタイム通信エンジンの開発を経て2015年10月にポケラボに入社戦姫絶唱シンフォギアXD UNLIMITED の開発などを担当山口 拓郎 (Takuro Yamaguchi)• 2016年新卒エンジニアとしてポケラボに入社• 『AKB48ステージファイター2 バトルフェスティバル』• 『SINoALICE -シノアリス-』などを担当
現在運用タイトルは2本で● SINoALICE ーシノアリスー ..2022年6月で5周年● アサルトリリィ Last Bullet ..2022年7月で1.5周年を迎えていますポケラボの紹介4 © SQEX ©AZONE INTERNATIONAL・acus/アサルトリリィプロジェクト ©Pokelabo, Inc. ©SHAFT
シノアリス、アサルトリリィともにインゲーム(GvG)で使用本講演では、この内製リアルタイム通信エンジンについてご紹介しますこの2タイトルで内製リアルタイム通信エンジンを使用5 SINoALICE ーシノアリスーのインゲーム「コロシアム」アサルトリリィ Last Bulletのインゲーム「レギオンマッチ」©AZONE INTERNATIONAL・acus/アサルトリリィプロジェクト ©Pokelabo, Inc. ©SHAFT© P/SQEX
本日のアジェンダ1. 現行のポケラボ内製リアルタイム通信エンジンの紹介2. 運用における課題点について3. 新たなポケラボ内製リアルタイム通信エンジンの紹介4. 今後の展望6
本日のアジェンダ1. 現行のポケラボ内製リアルタイム通信エンジンの紹介2. 運用における課題点について3. 新たなポケラボ内製リアルタイム通信エンジンの紹介4. 今後の展望7
通称:Reflector8 長きにわたってポケラボのGvGエンジンの一翼を担うポケラボ内製リアルタイム通信エンジン過去のポケラボタイトルからシノアリスそして アサルトリリィ と© SQEX©AZONE INTERNATIONAL・acus/アサルトリリィプロジェクト©Pokelabo, Inc. ©SHAFT2012年リリースタイトルA2012年リリースタイトルB2018年リリースタイトルC
Reflectorにおけるバトルシステム紹介(構成)9 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached
Reflectorにおけるバトルシステム紹介(構成)10 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached● Reflector○ コードはJavaで記載○ クライアントと常時接続○ App サーバが提供する HTTPサービスを定期的に実行○ データストアとして Hazelcast を使用● Hazelcast○ 以下のデータを管理■ ルームのメンバー情報
Reflectorにおけるバトルシステム紹介(構成)11 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached● App○ Apache / PHP(7.3)○ Reflector からの HTTP 通信を受け、バトルの処理を実行● Amazon Aurora○ 以下のデータを管理■ ルームの状態■ メンバーのHP, バフなどのステータス状態● Memcached○ 分散型キャッシュシステム○ DB の読み込み負担を軽減
Reflectorにおけるバトルシステム紹介(ルーム参加)12 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. ルーム参加通信を送信1
Reflectorにおけるバトルシステム紹介(ルーム参加)13 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. ルーム参加通信を送信2. Hazelcast にメンバー登録12
Reflectorにおけるバトルシステム紹介(ルーム参加)14 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. ルーム参加通信を送信2. Hazelcast にメンバー登録3. 参加メンバーの情報をApp サーバから取得132
Reflectorにおけるバトルシステム紹介(ルーム参加)15 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. ルーム参加通信を送信2. Hazelcast にメンバー登録3. 参加メンバーの情報をApp サーバから取得4. 参加メンバーの情報を DB から取得1342
Reflectorにおけるバトルシステム紹介(ルーム参加)16 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. ルーム参加通信を送信2. Hazelcast にメンバー登録3. 参加メンバーの情報をApp サーバから取得4. 参加メンバーの情報を DB から取得5. 参加メンバーの情報を返却13452
Reflectorにおけるバトルシステム紹介(ルーム参加)17 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. ルーム参加通信を送信2. Hazelcast にメンバー登録3. 参加メンバーの情報をApp サーバから取得4. 参加メンバーの情報を DB から取得5. 参加メンバーの情報を返却6. 返却された結果を 同バトルのルームに所属する client にbroadcast134562
Reflectorにおけるバトルシステム紹介(状態同期)18 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. App サーバへ現在の状態を取得するHTTP サービスを実行1
Reflectorにおけるバトルシステム紹介(状態同期)19 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. App サーバへ現在の状態を取得するHTTP サービスを実行2. 現在の状態を DB から取得し定期処理を実行12
Reflectorにおけるバトルシステム紹介(状態同期)20 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. App サーバへ現在の状態を取得するHTTP サービスを実行2. 現在の状態を DB から取得し定期処理を実行3. 処理の実行結果を Reflector に返却123
Reflectorにおけるバトルシステム紹介(状態同期)21 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. App サーバへ現在の状態を取得するHTTP サービスを実行2. 現在の状態を DB から取得し定期処理を実行3. 処理の実行結果を Reflector に返却4. App サーバから返却された結果をclient に転送1234
Reflectorにおけるバトルシステム紹介(ユーザー行動)22 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. スキル使用などのユーザーの行動メッセージを送信1
Reflectorにおけるバトルシステム紹介(ユーザー行動)23 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. スキル使用などのユーザーの行動メッセージを送信2. App サーバへユーザーの行動を登録する HTTP サービスを実行12
Reflectorにおけるバトルシステム紹介(ユーザー行動)24 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. スキル使用などのユーザーの行動メッセージを送信2. App サーバへユーザーの行動を登録する HTTP サービスを実行3. 行動に基づいた処理を実行しDB に結果を保存、 Reflector に返却12 3
Reflectorにおけるバトルシステム紹介(ユーザー行動)25 clientAndroid iOSWindowsALB ReflectorHazelcastAppALBAmazonAuroraMemcached1. スキル使用などのユーザーの行動メッセージを送信2. App サーバへユーザーの行動を登録する HTTP サービスを実行3. 行動に基づいた処理を実行しDB に結果を保存、 Reflector に返却4. 返却された結果を Client に転送12 34
本日のアジェンダ1. 現行のポケラボ内製リアルタイム通信エンジンの紹介2. 運用における課題点について3. 新たなポケラボ内製リアルタイム通信エンジンの紹介4. 今後の展望26
Reflectorの課題点① 現在はJavaを使えるエンジニアが社内で少ないためメンテナンスしづらい② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう27
Reflectorの課題点① 現在はJavaを使えるエンジニアが社内で少ないためメンテナンスしづらい② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう28
Reflectorの課題点①現在はJavaを使えるエンジニアが社内で少ないためメンテナンスしづらい現在のポケラボにおける基本的な開発言語は• クライアント:C#(Unity)• サーバ:PHP(LAMP環境)のため、Javaは必須とされていない。採用に関してもJavaは歓迎要件としている。今まではJavaを扱えるエンジニアが各プロダクトにおり、それぞれメンテナンスを行っていたが、直近では各プロダクトにJavaを扱えるエンジニアを置くのが難しくなってきた29
Reflectorの課題点① 現在はJavaを使えるエンジニアが社内で少ないためメンテナンスしづらい② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう30
Reflectorの課題点②ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある• 処理をPHP Ingame Logicで実行するため• ソロ(Reflector接続なし) ..C#で記述• マルチ(Reflector接続あり) ..PHPで記述と、仮にソロとマルチが全く同じインゲームであっても別途PHP用に実装が必要• そのため、実装工数も確認工数も倍になってしまう• プロダクトによっては• C# ..クライアントエンジニア領域• PHP ..サーバエンジニア領域必要なスキルセットが異なるので担当者も分かれてしまい、 不具合発生のリスクも増えてしまっている31 ゲームサーバ バトルロジック(マルチ) Reflector バトルロジック(ソロ)アプリ
Reflectorの課題点① 現在はJavaを使えるエンジニアが社内で少ないためメンテナンスしづらい② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう32
Reflectorの課題点③Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう• 状態同期はReflector→Appサーバに毎秒APIを実行しており、 これにより膨大な通信量になっている• プレイヤー行動、状態同期ともにAppサーバ内で処理を行っているためユーザー数に応じたインスタンス数が常に必要• 状態同期ではRDSから都度最新の情報を取得しており、RDSもこれに耐えられるような規模の台数が必要33 ゲームサーバ Reflector RDSAmazonAurora
Reflectorの課題点の解決策中長期で開発効率向上、及び運用コスト削減の観点から• Reflectorの改修• 外部のリアルタイム通信エンジンの採用の2パターンから解決策を検討34 Reflectorをそのまま使い続けると• Reflecotr の保守性の低下• 運用コスト(開発工数・サーバ費)も高い状態が継続してしまう
Reflectorの課題点の解決策35 大項目言語(課題①)開発工数減(課題②)DB削減(課題③)リアルタイム性 発生コスト サポート 拡張性Reflectorの改修 自由 〇 〇 〇 なし(人的コストのみ) 不要 〇外部有料サービスを採用サービスで固定△ 〇 〇 高(固定費 + 従量課金) 〇 △(制限あり)課題の解決可能性、その他項目の観点で比較し、自社でReflectorを改修することが最善と判断。その上でポケラボ内製リアルタイムエンジンを昇華させた「新しい内製リアルタイム通信エンジン」を開発する方針に決定
本日のアジェンダ1. 現行のポケラボ内製リアルタイム通信エンジンの紹介2. 運用における課題点について3. 新たなポケラボ内製リアルタイム通信エンジンの紹介4. 今後の展望36
新たなポケラボ内製リアルタイム通信エンジンの紹介その名も・・・37 Reflector Next
ReflectorNextとはポケラボの次世代リアルタイム通信エンジン• 既存のReflector機能は基本的に維持• MessageのPub/Sub、Appサーバーとの通信、監視機能など• 使用言語はC#• インゲームを記述するLogicModuleを新たに追加• 新しい機能モジュールで、受け入れ側の開発者による機能拡張ができる• PHPではなくC#で記載できるため、クライアント側のインゲームのロジックをそのまま移植し、動作させることができる※ただし、クライアント側はVector3といった Unity標準のスクリプトを使用することはできない38
• インゲームを記述するLogicModuleを新たに追加ReflectorNextとは39 LogicModuleソロバトルLogicModuleマルチバトルReflectorNext
ReflectorNext バトルシステム紹介(構成)40 clientAndroid iOSWindowsCloud LoadBalancingReflectorNextHazelcastAppCloudSpannerMemcachedCloud LoadBalancing
ReflectorNext バトルシステム紹介(構成)41 clientAndroid iOSWindowsCloud LoadBalancingReflectorNextHazelcastAppCloudSpannerMemcachedCloud LoadBalancing● ReflectorNext○ クライアントと常時接続○ データストアは引き続きHazelcast を使用● Hazelcast○ 以下のデータを管理■ ルームのメンバー情報■ ルームの状態■ メンバーのHP, バフなどのステータス状態● DB に Spanner を採用
ReflectorNext バトルシステム紹介(ルーム参加)42 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing1ReflectorNext① ルーム参加通信を送信
ReflectorNext バトルシステム紹介(ルーム参加)43 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing1① ルーム参加通信を送信② Hazelcast にメンバー登録2ReflectorNext
ReflectorNext バトルシステム紹介(ルーム参加)44 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing13① ルーム参加通信を送信② Hazelcast にメンバー登録③ 参加メンバーの情報を App サーバから取得2ReflectorNext
ReflectorNext バトルシステム紹介(ルーム参加)45 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing13① ルーム参加通信を送信② Hazelcast にメンバー登録③ 参加メンバーの情報を App サーバから取得④ 参加メンバーの情報を DB から取得42ReflectorNext
ReflectorNext バトルシステム紹介(ルーム参加)46 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing13① ルーム参加通信を送信② Hazelcast にメンバー登録③ 参加メンバーの情報を App サーバから取得④ 参加メンバーの情報を DB から取得⑤ 参加メンバーの情報を返却452ReflectorNext
ReflectorNext バトルシステム紹介(ルーム参加)47 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing13① ルーム参加通信を送信② Hazelcast にメンバー登録③ 参加メンバーの情報を App サーバから取得④ 参加メンバーの情報を DB から取得⑤ 参加メンバーの情報を返却⑥ 返却された結果を 同バトルのルームに所属する client に broadcast4562ReflectorNext
ReflectorNext バトルシステム紹介(状態同期)48 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing1① 現在の状態を hazelcast から取得し 定期処理を実行ReflectorNext
ReflectorNext バトルシステム紹介(状態同期)49 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing21① 現在の状態を hazelcast から取得し 定期処理を実行② 定期処理の実行結果を同バトルのルームに所属する client に broadcastReflectorNext
ReflectorNext バトルシステム紹介(状態同期)50 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing21ReflectorNext
ReflectorNext バトルシステム紹介(プレイヤー行動)51 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing① スキル使用などのプレイヤー行動メッセージを送信1ReflectorNext
ReflectorNext バトルシステム紹介(プレイヤー行動)52 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing① スキル使用などのプレイヤー行動メッセージを送信② バトル状況を Hazelcast から取得し、 プレイヤー行動処理を実行12ReflectorNext
ReflectorNext バトルシステム紹介(プレイヤー行動)53 clientAndroid iOSWindowsCloud LoadBalancingHazelcastAppCloudSpannerMemcachedCloud LoadBalancing① スキル使用などのプレイヤー行動メッセージを送信② バトル状況を Hazelcast から取得し、 プレイヤー行動処理を実行③ 処理の実行結果を同バトルのルームに所属する client に broadcast123ReflectorNext
● Socket.IO○ SocketIOSharp● http client○ .NET HttpClient● Hazelcast○ Hazelcast .NET Client● 監視○ Prometheus .NET、 Prometheus .NET dotnet RuntimeReflectorNext 使用ライブラリ一覧54
● Socket.IO○ SocketIOSharp● http client○ .NET HttpClient● Hazelcast○ Hazelcast .NET Client● 監視○ Prometheus .NET、 Prometheus .NET dotnet RuntimeReflectorNext 使用ライブラリ一覧55
使用しているライブラリ:SocketIOSharpReflectorNext 使用ライブラリ• Socket.IOプロトコルを処理するレイヤー• Reflector では Java の Socket.IO ライブラリを使用しており、これのC#対応版として使用56
● Socket.IO○ SocketIOSharp● http client○ .NET HttpClient● Hazelcast○ Hazelcast .NET Client● 監視○ Prometheus .NET、 Prometheus .NET dotnet RuntimeReflectorNext 使用ライブラリ一覧57
使用しているライブラリ:.NET HttpClientReflectorNext 使用ライブラリ• HTTPクライアントで、非同期型でHTTPリクエストを送信できる• レスポンスはコールバックで処理• HTTPコネクションプールの機能を持ち、利用する側はリクエストの完了を待たずに次のリクエストを送ることができる• ReflectorではJavaのApache http async clientを使用しており、これのC#対応版として使用58
● Socket.IO○ SocketIOSharp● http client○ .NET HttpClient● Hazelcast○ Hazelcast .NET Client● 監視○ Prometheus .NET、 Prometheus .NET dotnet RuntimeReflectorNext 使用ライブラリ一覧59
使用しているライブラリ:.Hazelcast .NET ClientReflectorNext 使用ライブラリ• Hazelcast を利用するために使用• Java や .NETなど様々な言語の接続用クライアントライブラリがある• ReflectorではJavaのHazelcast Java Clientを使用しており、これのC#対応版として使用60
● Socket.IO○ SocketIOSharp● http client○ .NET HttpClient● Hazelcast○ Hazelcast .NET Client● 監視○ Prometheus .NET、 Prometheus .NET dotnet RuntimeReflectorNext 使用ライブラリ一覧61
使用しているライブラリ:Prometheus .NET、 Prometheus .NET dotnet RuntimeReflectorNext 使用ライブラリ• 内部の状況を確認するために使用• Counter/Gauge/Histogramなどの基本メトリクス収集機能SDK• dotnet Runtime で dotnet アプリケーションの runtime メトリクスを収集• ex) GC, Thread, Network• .NET の既知の EventCounter も組み合わせて使用62
ReflectorNext におけるメトリクスの検討63 • 既存Reflector は稼働状況を正確に把握するためのメトリクスが少なかったため、メトリクスの拡充を実施• 取得するメトリクスで注視したポイント• 処理のボトルネックを検知しやすくするためにduration を細かく計測• 異常検知を容易に行うためにduration, rate を sucess / error 別に計測
ReflectorNext におけるメトリクスの検討64 例1Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcast
ReflectorNext におけるメトリクスの検討65 例1Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcast
ReflectorNext におけるメトリクスの検討66 例1Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcast
ReflectorNext におけるメトリクスの検討67 Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcastMessageDuration例1
ReflectorNext におけるメトリクスの検討68 Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcastlogicDuration例1
ReflectorNext におけるメトリクスの検討69 Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcasthttpDuration例1
ReflectorNext におけるメトリクスの検討70 Client ReflectorNext HazelcastLogicModuleappsendmessageexeclogic functionexec APIexecbroadcastbroadcastDuration例1
ReflectorNext におけるメトリクスの検討71 例2以下の実行回数/実行時間を 成功/失敗時 それぞれ別に 取得• message event• http event• room event• broadcast event
Reflector Next まとめ72 課題① 現在はJavaを使えるENが少ないためメンテナンスしづらい課題② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある課題③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう
Reflector Next まとめ課題① 現在はJavaを使えるENが少ないためメンテナンスしづらい⇒Unity で馴染みのある C# に変更することでメンテナンスがしやすくなる課題② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある⇒ソロとマルチでインゲームが同じであれば、使用プログラム言語が同じため開発効率が上がる課題③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう⇒ バトル中にDBを利用しないため、サーバコスト削減が見込める(コストの約20%カット)73 解決解決解決
Reflector Next まとめ74 従来のポケラボ内製リアルタイム通信エンジンの課題全てを解決できるのがReflector Next
本日のアジェンダ1. 現行のポケラボ内製リアルタイム通信エンジンの紹介2. 運用における課題点について3. 新たなポケラボ内製リアルタイム通信エンジンの紹介4. 今後の展望75
今後の展望76 ReflectorNextをポケラボの新たな内製リアルタイム通信エンジンとして運用できるよう準備中
現在の進捗77 ReflectorNext 本体の実装 マスタデータの取り扱い 負荷テスト準備(モニタリングシステム、テストシナリオなど) 負荷テスト実施、及び不具合修正とリスクの洗い出し 開発を支援するデバッグ機能の作成 完了完了完了着手中着手中
Reflector Nextこんなことも将来的にはやっていきたい78 ゲームサーバ バトルロジック アプリ● 機械学習の導入○ バトルバランスの調整サポート○ 賢いAIの創出● バックオフィス上でバトルシミュレーション機能○ 実機無しでバトルのバランス調整や動作確認ができる
80