配信サーバをクラウド化する実験をしてみた REALITY Advent Calendar 2023
こんにちは〜!ということでREALITY Advent Calendar 2023 7日目担当、サーバチームのダイダイこと小田大輔です。今回は、開発合宿でREALITYの配信サーバをクラウド化する実験に挑戦してみたので、ご紹介していきます。
REALITYの配信サーバについて
REALITYのライブ配信は、配信 & 視聴者がそれぞれWebSocket配信サーバに接続し、Protocol Buffers形式で音声とアバターのモーションデータをブロードキャストする、という作りになっています。
REALITYのWebSocketサーバは、送受信データの冗長化をするためRedis Pub/Subを利用しています。ただし一般的なWebSocket + Redis Pub/Subのアーキテクチャでは大きくスケールアウトすることができません。そこで次のようなアーキテクチャを採用しています。
まず配信者がWebSocketサーバにストリームを打ち上げると、冗長化のため内部の全Redis Pub/Subインスタンスに対してデータをPublishします。同様に視聴者側でも、サーバ内部で全Redis Pub/Subのインスタンスに対してSubscribeすることで、容易にスケールのしやすい構成をとっています。
詳しくは、下記の記事をご参考ください。
参考:REALITY低遅延モード配信を支えるリアルタイムサーバとデータパイプライン GREE Tech Conference 2020
ということで、REALITYの配信サーバは工夫の末効率よくスケールできる構成になっていることがお分かりいただけたかなと思います。
クラウド化して提供してみたい
REALITYには、REALITY XR Cloud株式会社という兄弟会社があります。XR Cloudでは外部の法人やIPとコラボして、オリジナルのワールドをREALITYアプリ内で提供できる事業などを展開しています。
REALITYでは「内製の仕組みを外部に売り出す」といった取り組みは先述の通りXR Cloudによって既に成されています。しかしもっと技術面で同じような取り組みができないかと考え、配信サーバをクラウド化してみたら面白そう、というところに辿り着きました。
そこで今回は、配信サーバをマルチテナント構成で技術者向けに提供したらどうなるか、という実験をしてみました!
できたもの
こちらが今回実際に作った機能のアーキテクチャです!
まずREALITYの配信サーバはGoogle Kubernetes Engine(GKE)上でホストしているので、GKE上でマルチテナント構成をとってみました。マルチテナントとは、同一のシステムを複数のユーザ(法人・個人など)で共有するサービス提供モデルです。
マルチテナントにも種類がありますが、今回はnamespaceやNodePool、ネットワークは完全に共通のものを使ったテナント構成としてみました。これらは分離すればするほど他のテナントに及ぼす影響を遮断しやすいので、独立性の観点では良いのですが、もちろんその分開発コストや料金は上がります。ですので、サービス要求や開発状況に応じて適宜変えていくのが良いと思われます。今回はプロトタイプとして開発するだけ & マルチテナント構成の大局観を掴みたいという目的で、工数の少なさをとってあえて大部分を共用する構成にしてみました。
またデプロイについては、ArgoCDのApplicationSet を利用し、スクリプトで動的にそのテナント専用のArgoCD Applicationが作成されるようになっています。
API構成は下記のようになっています。全ユーザ共通の基盤APIがあり、そこに対してAPIリクエストすることでWebsocketの配信チャンネルを動的に発行・削除することができます。
次に、かなり簡素ですが管理画面のプロトタイプも実装しました(下記の画像参照)。メトリクスの確認と、現在の配信チャンネルの一覧が確認できます。
メトリクスについては、GKE上で稼働している全テナントのPodがそれぞれPrometheusメトリクスを吐き出し、GCPのCloud Monitoringに保存されます。管理画面での表示の際はそれをCloud MonitoringのAPIで取得し、JavaScriptで描画する、といった作りとなっています。
Cloud Monitoringのメトリクスはテナントごとに違うラベル名で集計するようになっており、「特定のテナントのメトリクスだけ観測したい」場合にフィルタしやすくなっています。
さらにチャンネル一覧の確認機能も下記に載せています。プロトタイプなので単に表示するだけですが、やろうと思えば通信内容を管理画面上から確認するなど、込み入った機能も作ることが可能です。
まとめ
今回は配信サーバをマルチテナント構成で提供する、という開発を試みました。構成的にはクラウド on クラウドとなるので、もちろん料金的には外部のリアルタイム通信サービスと比較すると高めになってしまいます。しかしマルチテナント構成の勉強にもなって楽しかったです!
実際にサービスとして提供する予定はないですが、普段の業務ではなかなか触れ合うことのない技術に触れられたので、かなり有意義でした。また来年もやりたいですね。
明日 12月8日 はゲーム事業部のやまださんのターンです。お楽しみに!