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

cocone TECH TALK Vol.6 - リアルタイム対戦xバックエンドアーキテクチャ

cocone TECH TALK Vol.6 - リアルタイム対戦xバックエンドアーキテクチャ

cocone

May 08, 2023
Tweet

More Decks by cocone

Other Decks in Technology

Transcript

  1. gRPCを利用 • 他の機能(API)はgRPCで実装していたため、同一の運用で対応したかった • Unary RPC ◦ Request/Response ◦ 一般的なAPI

    • Client Streaming RPC ◦ Clientから任意にデータ送信が可能 ◦ ファイルアプロードなど • Server Streaming RPC ◦ Serverから任意にデータ送信可能 ◦ 通知など • Bidirectional Streaming RPC ◦ 双方向通信 ◦ 相互に任意のタイミングでデータ送信が可能
  2. gRPC Bidirectional Streaming • 俗に言う双方向通信 • クライアント、サーバー相互に任意のタイミングでデータ送信が行える • oneofを使用し、一つのstreamで複数のコマンドを定義 message

    Notify { // どれか1つの情報がくるので、 switchなどで処理を振り分ける oneof event { ChatInfo chat_info = 1; Actor join_actor = 2; … } } service StreamingService { rpc StartNotify(...) returns (stream Notify) {} … }
  3. pickup 増え続けるoneof • Request/ResponseをC/Sのmessageへ追加する • 関係性が非常に難解 message ClientNotify { oneof

    event { Say say = 1; Foo foo = 2; Bar bar = 3; Echo echo = 4; … } message Say {...} … } message ServerNotify { oneof event { SayResult say_result = 1; FooResult foo_result = 2; BarResult bar_result = 3; EchoResult echo_result = 4; … } message SayResult {...} … }
  4. 最終的な着地点 • gRPC + Unary RPC + Server Streaming RPC

    • 各種操作については、Unary RPC(Request/Response)へ変更 • 自身の操作などはServer Streaming RPCを利用して通知 • より詳細な情報が必要であれば Unary RPCで取得 gRPC + Unary RPC + Server Streaming RPC 意外とすんなりいけるはず
  5. 最終的な着地点 • gRPC + Unary RPC + Server Streaming RPC

    • 各種操作については、Unary RPC(Request/Response)へ変更 • 自身の操作などはServer Streaming RPCを利用して通知 • より詳細な情報が必要であれば Unary RPCで取得 gRPC + Unary RPC + Server Streaming RPC 全部書き直した
  6. pickup go-redis pubsub • 1購読=1コネクションが貼られる • アクティブが1万人いたら1万コネクション ◦ パフォーマンスが著しく低下 ◦

    ElasctiCacheの上限にもかかる • 最終的にAPでコネクションを自前プールするよう実装 • 一つのコネクションで複数サブスクライブできるように変更 • 内部的に各Sessionのgo:channelへpush ◦ ch <- event
  7. まとめ • 当たり前ですが「ゲームデザインにあった」技術選定、設計が重要。 • 表面上動くものはすぐに作れる時代ではあるが、その先が深い。 ◦ このタイミングで切断されたら・・・ ◦ 地下鉄で瞬断したら・・・ ◦

    バイナリが改造されたら・・・ etc • 「どのようにテストを行うか」も初期段階で考えておくと良い。 • 開発中はクライアント担当とずっと「うーん・・・」と唸ることになる。 • ・・・とはいえ、開発自体は楽しい!