Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ポケラボ内製リアルタイム通信エンジンの昇華

gree_tech
October 25, 2022

 ポケラボ内製リアルタイム通信エンジンの昇華

GREE Tech Conference 2022で発表された資料です。
https://techcon.gree.jp/2022/session/TrackB-5

gree_tech

October 25, 2022
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. 3
 自己紹介 齋藤 冬斗 (Fuyuto Saito) • モバイルゲーム会社にてモバイルゲーム、コンシューマゲーム、 リアルタイム通信エンジンの開発を経て2015年10月にポケラボに入社 戦姫絶唱シンフォギアXD

    UNLIMITED の開発などを担当 山口 拓郎 (Takuro Yamaguchi) • 2016年新卒エンジニアとしてポケラボに入社 • 『AKB48ステージファイター2 バトルフェスティバル』 • 『SINoALICE -シノアリス-』 などを担当
  2. 現在運用タイトルは2本で • SINoALICE ーシノアリスー ..2022年6月で5周年 • アサルトリリィ Last Bullet ..2022年7月で1.5周年

    を迎えています ポケラボの紹介 4
 © SQEX ©AZONE INTERNATIONAL・acus/アサルトリリィプロジェクト ©Pokelabo, Inc. ©SHAFT
  3. 通称:Reflector 8
 長きにわたってポケラボのGvGエンジンの一翼を担う ポケラボ内製リアルタイム通信エンジン 過去のポケラボタイトルから シノアリス そして アサルトリリィ と ©

    SQEX ©AZONE INTERNATIONAL・acus/アサルトリリィプロジェクト ©Pokelabo, Inc. ©SHAFT 2012年リリースタイ トルA 2012年リリースタイ トルB 2018年リリースタイ トルC
  4. Reflectorにおけるバトルシステム紹介(構成) 10
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached • Reflector ◦ コードはJavaで記載 ◦ クライアントと常時接続 ◦ App サーバが提供する HTTP サービスを定期的に実行 ◦ データストアとして Hazelcast を 使用 • Hazelcast ◦ 以下のデータを管理 ▪ ルームのメンバー情報
  5. Reflectorにおけるバトルシステム紹介(構成) 11
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached • App ◦ Apache / PHP(7.3) ◦ Reflector からの HTTP 通信を 受け、バトルの処理を実行 • Amazon Aurora ◦ 以下のデータを管理 ▪ ルームの状態 ▪ メンバーのHP, バフなどの ステータス状態 • Memcached ◦ 分散型キャッシュシステム ◦ DB の読み込み負担を軽減
  6. Reflectorにおけるバトルシステム紹介(ルーム参加) 13
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. ルーム参加通信を送信 2. Hazelcast にメンバー登録 1 2
  7. Reflectorにおけるバトルシステム紹介(ルーム参加) 14
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. ルーム参加通信を送信 2. Hazelcast にメンバー登録 3. 参加メンバーの情報を App サーバから取得 1 3 2
  8. Reflectorにおけるバトルシステム紹介(ルーム参加) 15
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. ルーム参加通信を送信 2. Hazelcast にメンバー登録 3. 参加メンバーの情報を App サーバから取得 4. 参加メンバーの情報を DB から取得 1 3 4 2
  9. Reflectorにおけるバトルシステム紹介(ルーム参加) 16
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. ルーム参加通信を送信 2. Hazelcast にメンバー登録 3. 参加メンバーの情報を App サーバから取得 4. 参加メンバーの情報を DB から取得 5. 参加メンバーの情報を返却 1 3 4 5 2
  10. Reflectorにおけるバトルシステム紹介(ルーム参加) 17
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. ルーム参加通信を送信 2. Hazelcast にメンバー登録 3. 参加メンバーの情報を App サーバから取得 4. 参加メンバーの情報を DB から取得 5. 参加メンバーの情報を返却 6. 返却された結果を 同バトルの ルームに所属する client に broadcast 1 3 4 5 6 2
  11. Reflectorにおけるバトルシステム紹介(状態同期) 18
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. App サーバへ現在の状態を取得する HTTP サービスを実行 1
  12. Reflectorにおけるバトルシステム紹介(状態同期) 19
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. App サーバへ現在の状態を取得する HTTP サービスを実行 2. 現在の状態を DB から取得し 定期処理を実行 1 2
  13. Reflectorにおけるバトルシステム紹介(状態同期) 20
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. App サーバへ現在の状態を取得する HTTP サービスを実行 2. 現在の状態を DB から取得し 定期処理を実行 3. 処理の実行結果を Reflector に返却 1 2 3
  14. Reflectorにおけるバトルシステム紹介(状態同期) 21
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. App サーバへ現在の状態を取得する HTTP サービスを実行 2. 現在の状態を DB から取得し 定期処理を実行 3. 処理の実行結果を Reflector に返却 4. App サーバから返却された結果を client に転送 1 2 3 4
  15. Reflectorにおけるバトルシステム紹介(ユーザー行動) 22
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. スキル使用などのユーザーの 行動メッセージを送信 1
  16. Reflectorにおけるバトルシステム紹介(ユーザー行動) 23
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. スキル使用などのユーザーの 行動メッセージを送信 2. App サーバへユーザーの行動を 登録する HTTP サービスを実行 1 2
  17. Reflectorにおけるバトルシステム紹介(ユーザー行動) 24
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. スキル使用などのユーザーの 行動メッセージを送信 2. App サーバへユーザーの行動を 登録する HTTP サービスを実行 3. 行動に基づいた処理を実行しDB に 結果を保存、 Reflector に返却 1 2 3
  18. Reflectorにおけるバトルシステム紹介(ユーザー行動) 25
  client Android iOS Windows ALB Reflector Hazelcast App

    ALB Amazon Aurora Memcached 1. スキル使用などのユーザーの 行動メッセージを送信 2. App サーバへユーザーの行動を 登録する HTTP サービスを実行 3. 行動に基づいた処理を実行しDB に 結果を保存、 Reflector に返却 4. 返却された結果を Client に転送 1 2 3 4
  19. Reflectorの課題点② ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある • 処理をPHP Ingame Logicで実行するため • ソロ(Reflector接続なし) ..C#で記述 •

    マルチ(Reflector接続あり) ..PHPで記述 と、仮にソロとマルチが全く同じインゲームであっても 別途PHP用に実装が必要 • そのため、実装工数も確認工数も倍になってしまう • プロダクトによっては • C# ..クライアントエンジニア領域 • PHP ..サーバエンジニア領域 必要なスキルセットが異なるので担当者も分かれてしまい、   不具合発生のリスクも増えてしまっている 31
  ゲームサーバ   バトルロジック(マルチ)  Reflector       バトルロジック(ソロ) アプリ
  20. Reflectorの課題点の解決策 35
 大項目 言語 (課題①) 開発工数減 (課題②) DB削減 (課題③) リアルタイム性

    発生コスト サポート 拡張性 Reflectorの改修 自由 〇 〇 〇 なし(人的コストのみ) 不要 〇 外部有料サービスを採用 サービスで 固定 △ 〇 〇 高(固定費 + 従量課金) 〇 △(制限あり) 課題の解決可能性、その他項目の観点で比較し、 自社でReflectorを改修することが最善と判断。 その上でポケラボ内製リアルタイムエンジンを昇華させた 「新しい内製リアルタイム通信エンジン」を開発する方針に決定
  21. ReflectorNextとは ポケラボの次世代リアルタイム通信エンジン • 既存のReflector機能は基本的に維持 • MessageのPub/Sub、Appサーバーとの通信、監視機能など • 使用言語はC# • インゲームを記述するLogicModuleを新たに追加

    • 新しい機能モジュールで、受け入れ側の開発者による機能拡張ができる • PHPではなくC#で記載できるため、クライアント側のインゲームのロジックを そのまま移植し、動作させることができる ※ただし、クライアント側はVector3といった  Unity標準のスクリプトを使用することはできない 38

  22. ReflectorNext バトルシステム紹介(構成) 40
  client Android iOS Windows Cloud Load Balancing

    ReflectorNext Hazelcast App Cloud Spanner Memcached Cloud Load Balancing
  23. ReflectorNext バトルシステム紹介(構成) 41
  client Android iOS Windows Cloud Load Balancing

    ReflectorNext Hazelcast App Cloud Spanner Memcached Cloud Load Balancing • ReflectorNext ◦ クライアントと常時接続 ◦ データストアは引き続き Hazelcast を使用 • Hazelcast ◦ 以下のデータを管理 ▪ ルームのメンバー情報 ▪ ルームの状態 ▪ メンバーのHP, バフなど のステータス状態 • DB に Spanner を採用
  24. ReflectorNext バトルシステム紹介(ルーム参加) 42
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 ReflectorNext ① ルーム参加通信を送信
  25. ReflectorNext バトルシステム紹介(ルーム参加) 43
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 ① ルーム参加通信を送信 ② Hazelcast にメンバー登録 2 ReflectorNext
  26. ReflectorNext バトルシステム紹介(ルーム参加) 44
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 3 ① ルーム参加通信を送信 ② Hazelcast にメンバー登録 ③ 参加メンバーの情報を   App サーバから取得 2 ReflectorNext
  27. ReflectorNext バトルシステム紹介(ルーム参加) 45
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 3 ① ルーム参加通信を送信 ② Hazelcast にメンバー登録 ③ 参加メンバーの情報を   App サーバから取得 ④ 参加メンバーの情報を DB から取得 4 2 ReflectorNext
  28. ReflectorNext バトルシステム紹介(ルーム参加) 46
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 3 ① ルーム参加通信を送信 ② Hazelcast にメンバー登録 ③ 参加メンバーの情報を   App サーバから取得 ④ 参加メンバーの情報を DB から取得 ⑤ 参加メンバーの情報を返却 4 5 2 ReflectorNext
  29. ReflectorNext バトルシステム紹介(ルーム参加) 47
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 3 ① ルーム参加通信を送信 ② Hazelcast にメンバー登録 ③ 参加メンバーの情報を   App サーバから取得 ④ 参加メンバーの情報を DB から取得 ⑤ 参加メンバーの情報を返却 ⑥ 返却された結果を 同バトルの ルームに所属する client に broadcast 4 5 6 2 ReflectorNext
  30. ReflectorNext バトルシステム紹介(状態同期) 48
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 1 ① 現在の状態を hazelcast から取得し   定期処理を実行 ReflectorNext
  31. ReflectorNext バトルシステム紹介(状態同期) 49
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 2 1 ① 現在の状態を hazelcast から取得し   定期処理を実行 ② 定期処理の実行結果を同バトルの ルームに所属する client に broadcast ReflectorNext
  32. ReflectorNext バトルシステム紹介(状態同期) 50
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing 2 1 ReflectorNext
  33. ReflectorNext バトルシステム紹介(プレイヤー行動) 51
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing ① スキル使用などのプレイヤー行動 メッセージを送信 1 ReflectorNext
  34. ReflectorNext バトルシステム紹介(プレイヤー行動) 52
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing ① スキル使用などのプレイヤー行動 メッセージを送信 ② バトル状況を Hazelcast から取得し、   プレイヤー行動処理を実行 1 2 ReflectorNext
  35. ReflectorNext バトルシステム紹介(プレイヤー行動) 53
  client Android iOS Windows Cloud Load Balancing

    Hazelcast App Cloud Spanner Memcached Cloud Load Balancing ① スキル使用などのプレイヤー行動 メッセージを送信 ② バトル状況を Hazelcast から取得し、   プレイヤー行動処理を実行 ③ 処理の実行結果を同バトルの ルームに所属する client に broadcast 1 2 3 ReflectorNext
  36. • Socket.IO ◦ SocketIOSharp • http client ◦ .NET HttpClient

    • Hazelcast ◦ Hazelcast .NET Client • 監視 ◦ Prometheus .NET、 Prometheus .NET dotnet Runtime ReflectorNext 使用ライブラリ一覧 54

  37. • Socket.IO ◦ SocketIOSharp • http client ◦ .NET HttpClient

    • Hazelcast ◦ Hazelcast .NET Client • 監視 ◦ Prometheus .NET、 Prometheus .NET dotnet Runtime ReflectorNext 使用ライブラリ一覧 55

  38. • Socket.IO ◦ SocketIOSharp • http client ◦ .NET HttpClient

    • Hazelcast ◦ Hazelcast .NET Client • 監視 ◦ Prometheus .NET、 Prometheus .NET dotnet Runtime ReflectorNext 使用ライブラリ一覧 57

  39. • Socket.IO ◦ SocketIOSharp • http client ◦ .NET HttpClient

    • Hazelcast ◦ Hazelcast .NET Client • 監視 ◦ Prometheus .NET、 Prometheus .NET dotnet Runtime ReflectorNext 使用ライブラリ一覧 59

  40. 使用しているライブラリ:.Hazelcast .NET Client ReflectorNext 使用ライブラリ • Hazelcast を利用するために使用 • Java

    や .NETなど様々な言語の接続用クライアントライブラリがある • ReflectorではJavaのHazelcast Java Clientを使用しており、 これのC#対応版として使用 60

  41. • Socket.IO ◦ SocketIOSharp • http client ◦ .NET HttpClient

    • Hazelcast ◦ Hazelcast .NET Client • 監視 ◦ Prometheus .NET、 Prometheus .NET dotnet Runtime ReflectorNext 使用ライブラリ一覧 61

  42. 使用しているライブラリ:Prometheus .NET、 Prometheus .NET dotnet Runtime ReflectorNext 使用ライブラリ • 内部の状況を確認するために使用

    • Counter/Gauge/Histogramなどの基本メトリクス収集機能SDK • dotnet Runtime で dotnet アプリケーションの runtime メトリクスを収集 • ex) GC, Thread, Network • .NET の既知の EventCounter も組み合わせて使用 62

  43. ReflectorNext におけるメトリクスの検討 63
 • 既存Reflector は稼働状況を正確に把握するための メトリクスが少なかったため、メトリクスの拡充を実施 • 取得するメトリクスで注視したポイント •

    処理のボトルネックを検知しやすくするために duration を細かく計測 • 異常検知を容易に行うために duration, rate を sucess / error 別に計測
  44. ReflectorNext におけるメトリクスの検討 67
 Client ReflectorNext Hazelcast Logic Module app send

    message exec logic function exec API exec broadcast Message Duration 例1
  45. ReflectorNext におけるメトリクスの検討 68
 Client ReflectorNext Hazelcast Logic Module app send

    message exec logic function exec API exec broadcast logic Duration 例1
  46. ReflectorNext におけるメトリクスの検討 69
 Client ReflectorNext Hazelcast Logic Module app send

    message exec logic function exec API exec broadcast http Duration 例1
  47. ReflectorNext におけるメトリクスの検討 70
 Client ReflectorNext Hazelcast Logic Module app send

    message exec logic function exec API exec broadcast broadcast Duration 例1
  48. Reflector Next まとめ 課題① 現在はJavaを使えるENが少ないためメンテナンスしづらい ⇒Unity で馴染みのある C# に変更することでメンテナンスがしやすくなる 課題②

    ソロとマルチが同じインゲームでも、別途PHPでロジックを書く必要がある ⇒ソロとマルチでインゲームが同じであれば、使用プログラム言語が同じため開発効率が上がる 課題③ Appサーバで処理を実行している仕組み上、サーバ費が大幅に増加してしまう ⇒ バトル中にDBを利用しないため、サーバコスト削減が見込める(コストの約20%カット) 73
 解決 解決 解決
  49.  Reflector Next こんなことも将来的にはやっていきたい 78
  ゲームサーバ   バトルロジック      

    アプリ • 機械学習の導入 ◦ バトルバランスの調整サポート ◦ 賢いAIの創出 • バックオフィス上でバトルシミュレーション機能 ◦ 実機無しでバトルのバランス調整や 動作確認ができる