Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
cocone TECH TALK Vol.6 - リアルタイム対戦xバックエンドアーキテクチャ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
cocone
May 08, 2023
Technology
700
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
cocone TECH TALK Vol.6 - リアルタイム対戦xバックエンドアーキテクチャ
cocone
May 08, 2023
More Decks by cocone
See All by cocone
Cocone_Research_Center_2025.pdf
cocone
0
320
20240301_cocone_EMゆるミートアップvol6_LT資料
cocone
0
940
2024_cocone-wellbeing
cocone
0
5.1k
2023夏季合同企業説明会ココネ
cocone
0
410
cocone TECH TALK Vol.6 - ココネグループのブロックチェーン MOOI Network とのバックエンド連携
cocone
0
630
cocone TECH TALK Vol.6 - Kotlin バックエンドアーキテクチャ of アバターサービス
cocone
0
630
cocone corporation(JPN)/Handbook2022
cocone
1
31k
cocone Tech Talk vol.5 - Unity Dotsを使ってみた
cocone
0
2.5k
cocone corporation(JPN)/Letter to Planner
cocone
0
590
Other Decks in Technology
See All in Technology
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
190
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
4
2.3k
20260619 私の日常業務での生成 AI 活用
masaruogura
1
230
Oracle Cloud Infrastructure:2026年6月度サービス・アップデート
oracle4engineer
PRO
0
100
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
150
FPGAの開発コンペでZephyrを使ってみた
iotengineer22
0
120
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
220
【2026年版】 ベクトル検索とEmbedding最前線
mocobeta
14
3.9k
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
410
RAG を使わないという選択肢
tatsutaka
1
270
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
140
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
4
1.5k
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
66
55k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
The browser strikes back
jonoalderson
0
1.3k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
The Cost Of JavaScript in 2023
addyosmani
55
10k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
Building AI with AI
inesmontani
PRO
1
1.1k
Faster Mobile Websites
deanohume
310
31k
Transcript
リアルタイム対戦 × バックエンドアーキテクチャ RYO TOMARU
自己紹介 職歴 ゲーム系企業でクライアント /サーバーを主軸に しつつ、配信サービスのフロントエンド実装など も経験。 趣味 個人ゲーム開発、ドット絵、最近引退気味です が光の戦士。最近はGolangとFlutterが好き。 戸丸
良 / RYO TOMARU
本日の内容 • どのような技術を用いて「リアルタイム対戦」を実現したか • 通信フローについてのご紹介 • 苦労したポイント ※詳細なインフラ構成については今回の範囲外となります ...。
目次 1. リアルタイム通信をどの技術で実現するか 2. 今回採用した技術 3. 苦労したポイント 4. まとめ
リアルタイム通信をど の技術で実現するか
多彩な選択肢 最近では、ゲームエンジン側でもサポートが進むなど、開発がしやすい環境となってきてい る。 • 純粋なSocketを用いて構築する • Unity+MLAPI/Mirror/DOTSNET … • Unity
+ Photon/モノビットエンジン/MagicOnion • gRPC Bidirectional Streaming RPC • WebSocketやDatagram … etc …
選択肢が多い上に、一つ一つが難しい
多彩な選択肢 「リアルタイム通信対戦がしたい」だけであれば、どの手段でも実現は可能。 ここに「サービス・ゲームデザインとしてはどうか 」「運用保守の面でどうか」「UXとしてどう か」など、様々な要素を加えて選択していく必要がある。 (難しい・・・) 今回は担当プロダクトにおいて、どのような選択をしたのか、苦労話と合わせてご紹介しま す。
今回採用した技術
gRPCを利用 • 他の機能(API)はgRPCで実装していたため、同一の運用で対応したかった • Unary RPC ◦ Request/Response ◦ 一般的なAPI
• Client Streaming RPC ◦ Clientから任意にデータ送信が可能 ◦ ファイルアプロードなど • Server Streaming RPC ◦ Serverから任意にデータ送信可能 ◦ 通知など • Bidirectional Streaming RPC ◦ 双方向通信 ◦ 相互に任意のタイミングでデータ送信が可能
初期に採用したのは・・・ • 初期(モック)時点では、ゲームデザインが完全に FIXしていなかった • 単純に双方向を選択しておけば大抵なんとかなるよね、から選択 • 慣れていた gRPC Bidirectional
Streaming RPC
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) {} … }
順調に実装は進んでいったが・・・
実装自体は進んだが、次第に様々な問題が発生 複雑化するコード Client/Server間のやり取りの増加 操作に対して必ず結果が必要 テストの複雑化 増えるoneof 開発コスト増加 send/recvそれぞれのgoroutineを 管理する必要 このメソッドってクライアントに何か投
げるんだっけ・・・? 増え続けるoneof 増え続けるoneof 増え続けるoneof
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 {...} … }
まだ間に合う・・・はず! (そもそもゲームデザイン的にあっていないのでは? )
最終的な着地点 • gRPC + Unary RPC + Server Streaming RPC
• 各種操作については、Unary RPC(Request/Response)へ変更 • 自身の操作などはServer Streaming RPCを利用して通知 • より詳細な情報が必要であれば Unary RPCで取得 gRPC + Unary RPC + Server Streaming RPC 意外とすんなりいけるはず
最終的な着地点 • gRPC + Unary RPC + Server Streaming RPC
• 各種操作については、Unary RPC(Request/Response)へ変更 • 自身の操作などはServer Streaming RPCを利用して通知 • より詳細な情報が必要であれば Unary RPCで取得 gRPC + Unary RPC + Server Streaming RPC 全部書き直した
gRPC + Unary RPC + Server Streaming RPC
Redis PubSubを利用
結果としてどうなったか • 基本的にUnary RPCを利用するため、フローがシンプルになった ◦ いつも通りの実装、テスト手法が通用した • Request/ReponseがIDLにて明示的に定義されるため、読みやすい ◦ この操作きたら何を返すんだっけ・・・が無くなった
• Unaryは操作、Streamingはサーバーからの通知と役割を切り分けられた ◦ CRUDとNotifyを切り離せたので、可読性が上がった
苦労したポイント
苦労したポイント 再接続時の復帰処理 復帰時の進行状況に応じて状態を再現する必要があった。 また切断中は自動行動を行うため、タイミングによっては進行不能になるなど、 リリース直前まで頭を悩ませられた。 細かいエッジケース対応 〜の時に〜をするとバグる、という様な話が初期は特に多かった。 最終的にはBOTを作成し、自動的にバトルを繰り返す仕組みでカバーした。 ローンチ後、大きな問題は起きていないので、良い結果が出せた。 参考:
https://qiita.com/maruc/items/2393647be5caa32623e3
苦労したポイント PubSubに悩まされた go-redisを使用していたが、コネクション数が多大になったり、 ConnectionPoolとPubSubの接続状態連携が行われていないなど ...。 最終的にはある程度自前でコントロールを行った。 負荷対策 システム上、最新のデータを取得するケースが多く、 Primaryアクセスが頻発。 キャッシュアサイドパターンを用いることで、負荷軽減を行った。
(整合性を担保する必要があるので、可能であれば避けたい所ではあった)
pickup go-redis pubsub • 1購読=1コネクションが貼られる • アクティブが1万人いたら1万コネクション ◦ パフォーマンスが著しく低下 ◦
ElasctiCacheの上限にもかかる • 最終的にAPでコネクションを自前プールするよう実装 • 一つのコネクションで複数サブスクライブできるように変更 • 内部的に各Sessionのgo:channelへpush ◦ ch <- event
まとめ
まとめ • 当たり前ですが「ゲームデザインにあった」技術選定、設計が重要。 • 表面上動くものはすぐに作れる時代ではあるが、その先が深い。 ◦ このタイミングで切断されたら・・・ ◦ 地下鉄で瞬断したら・・・ ◦
バイナリが改造されたら・・・ etc • 「どのようにテストを行うか」も初期段階で考えておくと良い。 • 開発中はクライアント担当とずっと「うーん・・・」と唸ることになる。 • ・・・とはいえ、開発自体は楽しい!
ご静聴ありがとうございました