Gaming

Quilkin の紹介: ゲームサーバー通信向けに構築されたオープンソース UDP プロキシ

Quilkin.jpg

※この投稿は米国時間 2021 年 7 月 16 日に、Google Cloud blog に投稿されたものの抄訳です。

従来、リアルタイム マルチプレーヤー型ゲーム向け専用ゲームサーバーは、ゲーム内のプレイヤー間のゲームプレイの通信と同期にカスタムメイドの UDP プロトコルを使用してきました。この通信は、カスタム ネットワークの物理的な同期、セキュリティ、アクセス制御、テレメトリー、指標などの通信プロトコルの技術的機能を、物理シミュレーションの非常に優れた演算要件、AI 演算などと組み合わせて、モノリシックなゲームサーバーとクライアントにバンドルされるのが最も一般的です。

Quilkin は Embark Studios と共同で開発され、高性能なリアルタイム マルチプレーヤー型ゲーム向けにカスタマイズされた UDP プロキシです。その目的は次の 2 つです。

  1. モノリシックな専用ゲームサーバーとクライアントから、セキュリティ、アクセス制御、テレメトリー、指標などの共通機能を引き出す。

  2. 組み立てと構成が可能な方法でこの共通機能を提供し、さまざまなマルチプレーヤー型ゲーム間で再利用できるようにする。

この再利用可能な基盤を使うことで、ゲーム デベロッパーは、マルチプレーヤー通信プロトコルの構築に際して、一般的な要素よりもゲーム固有の要素の構築により多くの時間を使えるようになります。

マルチプレーヤー型ゲームサーバー通信に関する課題

変化の速いマルチプレーヤー型ゲームでは、ゲームプレイのセッションの完全シミュレーションは一般的に、モノリシックな専用ゲームサーバーのメモリ内で発生します。このサーバーは、ネットワーク物理、AI シミュレーションから、クライアントからサーバーに戻る通信まで、すべてをカバーします。

1 Quilkin.jpg

ゲームの全体の状態はメモリに常駐するため、各クライアントはプレイヤーがプレイしている専用ゲームサーバーに直接接続します。ただしこの通信には、次のような問題があります。

  • 各専用ゲームサーバーが単一障害点となっている。サーバーがダウンすると、ゲーム セッション全体(ときとして複数のセッション)に障害が波及します。これは悪意のあるユーザーにとって格好のターゲットになります。

  • ゲームサーバーへの接続 IP とポートが公開され、ゲーム クライアントに露出しているので、ターゲットの検出が容易である。

  • ゲームサーバーのシミュレーションとネットワーク通信の複数の側面が同じプロセスで緊密に連携しているため、再利用とモジュール化がより困難になり、パフォーマンス上の問題が発生するリスクが高まる。

この中には、この数年のウェブ テクノロジーとモバイル テクノロジーでよく見られた問題もあります。専用サーバーのワークロードをより冗長な分散オーケストレーションに引き上げるために役立つソリューションの一つとして、トラフィック プロキシの使用があります。

2 Quilkin.jpg

マルチプレーヤー型 UDP トラフィック用プロキシを Google Cloud が提供するネットワークなど、低レイテンシ ネットワーク内にある専用ゲームサーバーの前で使用することで、重要な問題に以下のように対処できます。

  • より高い信頼性。プロキシは通信エントリの冗長ポイントを提供します。UDP パケットは任意の数のプロキシに送られ、専用ゲームサーバーにルーティングされます。専用ゲームサーバーは依然として単一障害点となりますが、プロキシは通信レイヤで冗長性と潜在的なフェイルオーバーを改善します。

  • より高い安全性。専用ゲームサーバーの IP とポートが公開されなくなります。ゲーム クライアントが確認できる箇所をプロキシプールのサブセットに限定することで、潜在的な攻撃サーフェスも制限されます。

  • より高いスケーラビリティ。通信プロトコル、指標、通信セキュリティ、アクセス制御の側面をプロキシに移すことができるので、単一プロセスの分割が開始されます。これによりゲームサーバーのプロセスループからゲーム固有でない演算が排除されます。

この結果、プロキシを個別にスケーリングできるので、システム全体の復元性が向上し、パフォーマンスの改善だけでなく、悪意のある攻撃を受けた際に負荷を分散させる効果が得られます。

Quilkin の紹介: ゲームサーバー向け UDP プロキシ

Embark StudiosGoogle Cloud は連携して Quilkin を構築し、標準のオープンソース ソリューションを提供します。Embark Studios はストックホルムに拠点を置き、経験豊富な業界のベテランで構成された(比較的)新しいスタジオです。同社は Quilkin を創り出すための最高のコラボレーション パートナーであり、チームは大規模なリアルタイム マルチプレーヤー型ゲームの豊富な経験を持っています。

Quilkin はオープンソースの非透過 UDP プロキシであり、セキュリティ、アクセス制御、テレメトリー データ、指標などを確保するため、特に大規模なマルチプレーヤー型専用ゲームサーバーのデプロイでの使用を目的として設計されています。

Quilkin はゲーム クライアントの背後と専用ゲームサーバーの前で使用する目的で設計されています。主なメリットは次のとおりです。

  • 難読化。UDP データの非透過プロキシによって、ゲーム アーキテクチャの内部状態を悪意のあるユーザーから見えにくくします。

  • すぐに使用できる指標。UDP パケット トラフィックと通信用です。

  • 可視性。ルーティング、アクセス制御、レート制限などに適用できる処理フィルタの構成可能なセット。

  • 柔軟性。システム統合の密度や構築するカスタム処理フィルタの要件に応じて、クライアントまたはサーバーの変更が不要なスタンドアロン バイナリまたは Rust ライブラリとして利用できます。

  • 互換性。既存の C言語 / C++ コードベースと統合できます。必要に応じて Rust FFI を経由します。

  • オンボーディング。複数の統合パターンによって、アーキテクチャと既存のプラットフォームに合った統合レベルを選択できます。


今までこの種の機能は、専用のテクノロジーを構築できるリソースを備えている大手のゲームスタジオでしか使用できませんでした。

当社はゲーム業界のすべての人々が公平に競争できるような環境の構築は、価値がある重要な取り組みだと考えています。そのため当社は Google Cloud と連携し、このプロジェクトに共同で着手しました。

当社は、会社の規模に関係なくすべてのスタジオが同じ水準の技術力を獲得できるオープンソースがゲーム業界の未来であり、進むべき方向はオープンで会社の枠を超えたコラボレーションであると考えています。- Embark Studios テクニカル リード Luna Duclos 氏


Google Cloud はゲーム向けオープンソース ソリューション ポートフォリオの最新ツールとして Quilkin を発表いたします。Quilkin は Google の既存の OSS ソリューション(ゲームサーバー向けの Agones、マッチメイキング向けの Open Match、永続性向けの Open Saves など)を補完するものです。これらのソリューションは、ゲーム向けにオープンで統合されたエコシステムとして連携するように設計されています。Google は、Embark Studios を Ubisoft、Unity、2K Games と同様にゲーム向けの最新のオープンソース コラボレーターとしてお迎えします。Google Cloud は世界最大規模のゲームを強化する世界規模のソリューションを提供するため、業界およびコミュニティのパートナーと引き続き緊密に連携します。- ゲームのための Google Cloud 担当チーフ アーキテクト Rob Martin


Quilkin を使ってみる

Quilkin は上述のようなより高度なデプロイに対応できますが、Quilkin の利用を開始する最も簡単な方法は、既存の専用ゲームサーバーにサイドカーとしてデプロイする方法です。最初は Quilkin のメリットの一部が制限される可能性がありますが、UDP 通信に関する指標とテレメトリー データを簡単に取得し、段階的に拡張できる、参入障壁の低い Quilkin の始め方です。

3 Quilkin.jpg

Quilkin はバイナリ イメージとコンテナ イメージの両方として公開され、特定のホスティング プラットフォームに関連付けられていませんが、この例では AgonesGoogle Cloud Game Servers をゲームサーバー ホスティング プラットフォームとして使用します。

最初に ConfigMap を作成します。これは、ポート 26001 での接続を了承する Quilkin の静的な構成の yaml を保管するためのものです。続いて Xonotic(オープンソース、マルチプレーヤー型 FPS ゲーム)専用ゲームサーバーをポート 26000 にルーティングします。

  apiVersion: v1
kind: ConfigMap
metadata:
  name: quilkin-config
data:
  quilkin.yaml: |  # quilkin configuration
    version: v1alpha1
    proxy:
      port: 26001
    static:
      endpoints:
        - address: 127.0.0.1:26000

次に、Agones が提供する Xonotic 専用ゲームサーバー用のサンプル コンテナを指定し、以下のようにゲームサーバーの Agones フリートで専用ゲームサーバーごとに Quilkin をサイドカーとして実行します。

  apiVersion: "agones.dev/v1"
kind: Fleet
metadata:
  name: xonotic-sidecar
spec:
  replicas: 2
  template:
    spec:
      container: xonotic
      ports:
        - name: default
          containerPort: 26001
          container: quilkin
      health:
        initialDelaySeconds: 30
        periodSeconds: 60
      template:
        spec:
          containers:
            - name: xonotic
              image: gcr.io/agones-images/xonotic-example:0.8
            - name: quilkin  # quilkin sidecar
              image: us-docker.pkg.dev/quilkin/release/quilkin:0.1.0
              volumeMounts:
                - name: config
                  mountPath: "/etc/quilkin"
              livenessProbe:
                httpGet:
                  path: /live
                  port: 9091
                initialDelaySeconds: 3
                periodSeconds: 2
          volumes:
            - name: config
              configMap:
                name: quilkin-config

これが適用されると、稼働中のゲームサーバーのクラスタを照会したときに、すべてが Quilkin がない場合と同じに見えるようになります。トラフィックがインターセプトされていることをシステムの他の要素が意識する必要なく、クライアント コードまたはサーバーコードを調整することもなく、Quilkin の機能を自由に活用できます。

  $ kubectl get gameservers
NAME                          STATE   ADDRESS         PORT   NODE           AGE
xonotic-sidecar-gdpgn-2pfkc   Ready   34.95.106.201   7929   gke-0f7d8adc   25m
xonotic-sidecar-gdpgn-c8bds   Ready   34.95.106.201   7028   gke-0f7d8adc   25m

興味をお持ちの場合は、同じシナリオを使って説明しているチュートリアルをご覧ください。このチュートリアルでは、プログラムを変更せずにゲーム クライアントからサーバーへの UDP パケットを圧縮する方法を説明します。

このブログでご紹介したのは Quilkin のほんの一部の機能です。xDS 準拠の管理 API、さまざまな既存のフィルタで UDP パケットを操作、ルーティングするなどの機能もあります。

Quilkin の次のステップ

Quilkin はまだ 0.1.0 アルファ版リリースという初期段階ですが、Google はその基本機能に非常に満足しています。

指標とテレメトリーの強化、新しいフィルタとフィルタタイプなど、さまざまな機能の追加が予定されています。

このリリースを試してみたい場合は、Google のリリースページでバイナリ イメージまたはコンテナ イメージを取得し、クイックスタートを読んで、お使いの専用ゲームサーバーとのさまざまな統合オプションを確認してください。

プロジェクトへの参加には次の方法があります。

Embark Studios にも独自の発表ブログ記事があります。こちらの記事では、同社独自の本番環境のゲーム バックエンド インフラストラクチャに対する計画と、Quilkin との関連についてさらに深く掘り下げられています。


Quilkin の未来に期待すると同時に、Google Cloud と Embark Studios が連携したこのプロジェクトにかかわるすべての人に感謝します。

-デベロッパー アドボケイト Mark Mandel