Go 製リアルタイムサーバーの
Kubernetes での運用について
自己紹介
2
奥村 開里(おくむら かいり)
名前
2016年コロプラにインフラエンジニアとして入社、新作
ゲームの負荷対策やインフラ設計、クラウド間のマイグ
レーション、技術検証及び導入等を行う。2020年に
DMM.com に入社し、CTO 室で様々なプロジェクトの設
計見直し、負荷対策、新プロジェクトの立ち上げ等を行
う。2021年にDiarkis に SolutionArchitect として入
社。
経歴
Solution Architect
役割
About Diarkis
3
About Diarkis
Diarkis は マルチプレイオンラインゲームやそのほか
リアルタイムな通信を必要とするアプリケーション
を作るための Go 製の Realtime Engine です。
Diarkis の 動作環境としては kuberentes 環境を推奨して
います。
Diarkis はサーバー同士でも通信し、クラスタを構成し、
耐障害製、運用製等を担保しています。
Diarkis とは
Cloud Load
Balancing
Client
Devices
Diarkis Server Cluster
MARS
Pod
Application
Server
WebSocket
Pod
WebSocket
Pod
WebSocket
Pod
TCP
Pod
TCP
Pod
TCP
Pod
UDP/RUDP
Pod
UDP/RUDP
Pod
UDP/RUDP
Pod
HTTP
Pod
HTTP
Pod
HTTP
Pod
UDP/RUDP
TCP
WebSocket
凡
例
Diarkis 内のメッシュネットワーク
Diarkis 外のネットワーク
Diarkis Architecture
5
普段Web側で、リアルタイムサーバーに馴染みがなくてピンとこなくても…
- メモリ上にユーザーのデータを保持するために
- HTTP サーバーなどと違ってステートフルである
- 再起動等を行うとデータのロストにつながる
- エンジニア視点の感覚としては KVS に近いかも?
- 通信自体は TCP や UDP 等で行う
- 通信内容は、位置情報や、どのようなゲームコマンドを実行したか等を他のユーザーに送信する
- ロードバランシングができない
- 1 process あたりのパフォーマンスが非常に重要
- Diarkis は Go で作られている
ってあたりを押さえておいていただければ OK です!
技術スタック
インフラ
サーバー
対応ゲーム
エンジン
その他
クライアント
GCP AWS Azure Tencent Alibaba
Kubernetes Agones
Diarkis の機能
7
Diarkis 提供機能
8
P2P(*) による同期通信
高速で大量のマッチングを
実施することが可能で、
用途に応じた複雑な検索条件
にも対応できる、拡張性の高い
マッチメイキングシステムです
ユーザ同士の同期通信を
提供します
高速で大規模なユーザ同士の
位置の同期やチャット、
ボイスチャットなどが可能です
高速な P2P 通信を利用した
同期通信を提供します
一般的に P2P 通信の実現は
難易度が高く高額ですが、
Diarkis を利用することで
容易に P2P が実現可能です
機能概要
高速/大規模なマッチング
同期通信機能
高速/大規模な同期通信
機能
カテゴリ
マッチング機能
Diarkis
製品名
Diarkis
MatchMaker
Diarkis P2P
Diarkis Room
Diarkis Group
Diarkis Field
Diarkis を活用したゲームの一例
9
格闘
ゲームカテゴリ
バトルロイヤル
MMORPG
概要説明
一つのワールドを数千人以上の規模で提供するためには
Diarkis Field の活用が有効。
Diarkis Field では人数制限のないワールドを作成する
ことや、複数のワールドを分割することが容易に可能。
Diarkis Group を使うことでユーザー同士のメッセージ
交換も容易に可能です。
~ 数百人が一つのセッションで高いアクション性を
実現するためには、Diarkis Room が有効です。
マッチメイキングを超高速に実現できる
Diarkis MatchMaker を活用することもユーザー体験向
上のために有効です。
格闘ゲームのような高 FPS を提供する必要がある場合
には P2P が有用。
Diarkis P2P を利用することでクロスプラットフォーム
プレイも実現可能です。
STUN/TURN にも対応
利用する
Diarkis モジュール例
Diarkis
MatchMaker
Diarkis Room
Diarkis Group
Diarkis Field
Diarkis P2P
ゲームイメージ
事例
10
事例
ゲーム内で開催されているリアルタイム
ライブ配信も Diarkis を使用して、ユー
ザー間だけではなく、演者とユーザーの
コミュニケーションを実現しています
MatchMaker でユーザーをマッチング
し、同じサーバーに接続させる
自分自身の位置情報やエモーション、
発言などを同一空間ユーザーに
ブロードキャスト
技術者目線でみた
Diarkis の強み ①
12
Diarkis はミドルウェアである一方でサーバーコード
を記述可能
- Diarkis は 拡張可能なミドルウェア
- ライブラリ形式で配布している
- go でコードを記述することができる
- 様々なイベントに対してコールバックを記
述
- Diarkis 自体はライセンス方式 + go なのでどう
実現しているのか
- import したいが、ソースは見えない
- go でバイナリパッケージを提供する術が
現在ない
- 実現したいこと
- ユーザーにコードは隠蔽
- 自由にビルド可能
- 補完機能等は使えるように
技術者目線での Diarkis の強み ①
Client
Devices
Diarkis Server Cluster
MARS
Pod
WebSocket
Pod
WebSocket
Pod
WebSocket
Pod
TCP
Pod
TCP
Pod
TCP
Pod
UDP/RUDP
Pod
UDP/RUDP
Pod
UDP/RUDP
Pod
UDP/RUDP
TCP
WebSocket
ライセンス型のソフトウェ
ア だとするならば、
サーバー側は変更不能
通常 SDK などでカスタマイズ
可能な範囲はクライアント側
のみだが…
拡張可能性の実現
14
Diarkis でのコード隠蔽+ビルドの実現
- ビルド
- ビルド用の専用 CLI を提供
- ユーザー毎に ID とToken を払い出し認証
コード隠蔽+ビルド+コード補完
import "golang.org/x/tools/go/ast/astutil"
…
n := astutil.Apply(expr, func(cr *astutil.Cursor) bool {
switch node := cr.Node().(type) {
case *ast.FuncDecl:
/*
extract function declaration
*/
case *ast.GenDecl:
/*
extract variables, consts, typedifinition
*/
}
…
Build Flow
コード補完のためのコード生成
- コード補完部分
- astutil package を使用しソースコード内
の Symbol 等を判定
(https://pkg.go.dev/golang.org/x/tool
s/go/ast/astutil)
- const や func の定義だけを抽出して、
ソースコードのスケルトンを出力
Development
Devices
Diarkis Build Server
Pod
GRPC(files & token)
Diarkis Build Server
Diarkis Authentication Server
token
技術者目線でみた
Diarkis の強み ②
16
Diarkis は kubernetes native
- Diarkis は kubernetes native に作られています
- Stateful だが autoscale 可能
- メモリ内の情報をサーバー間通信で
移動させる機能
- spot instance でも使える
- ユーザー側は
- コンテナイメージの作成
- Kubernetes の運用
- できるだけ単純にしておきたい…
技術者目線での Diarkis の強み②
Diarkis Server Cluster
UDP/RUDP Pod A
Room A
UDP/RUDP Pod B
Room A’
Diarkis +
Kubernetes
18
Diarkis + Kubernetes
- Custom Resource Definition 不使用
- Deployment, Statefulset 等標準的なもの
- ライブデプロイは実現
- クラスタの BlackBox 化を防止
- イメージの単純化
- alpine や ubuntu に単純にビルドした
バイナリを Copy するだけ
- go の恩恵
- デプロイの単純化
- kubectl apply だけで deploy が可能
- ユーザーは切断されない
- 結果としてクラスタの version up 等も気軽に行
えるようになっています
技術者目線での Diarkis の強み ②
Diarkis Server Cluster
MARS
Pod
WebSocket
Pod
WebSocket
Pod
WebSocket
Pod
TCP
Pod
TCP
Pod
TCP
Pod
UDP/RUDP
Pod
UDP/RUDP
Pod
UDP/RUDP
Pod
Diarkis を構成するすべてのプロセス
が SIGTERM を受けたときにユーザー
影響を及ぼさない設計
kuberentes cluster version up 時には
stateful なプロセスを含めてクラスタ内の
すべてのプロセスの再起動が必要となる…

Go 製リアルタイムサーバーの Kubernetes での運用について