Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
中嶋 謙互(取締役CTO)
安田 京人(ミドルウェア事業部部長)
新しくなったモノビットエンジンを使って
10万人規模のサーバを構築するノウハウを公開!
モノビットエンジン勉強会
in
サイバーコネクトツー様
株式会社モノビット
第二部
MRS...
1
■ MRSゲームサーバ構成例
MRSサーバにおける最小構成
・ mrs_room : MRSで提供している最小構成のルーム管理サーバ。
ルーム入退室制御と、ルーム内外でのデータ送信を可能にする。
Global Section
Private...
2
■ MRSゲームサーバ構成例
特徴
・リアルタイム処理を必要とされる部分について、簡単なデータ送受信とルーム管理機能を提供
・簡単な通信対戦、小規模ネットワークゲームであれば実装可能
・サーバ、クライアントともにCネイティブのAPIを用意し...
3
■ MRSゲームサーバのコーディング例
簡単な送受信サンプルの実装例
・MRSのコードは至ってシンプルで、簡単なECHO送受信のコードをCで記述すると以下のように書けます。
クライアント側 サーバ側
#include <mrs.hpp>
b...
4
■ 10万人規模のサーバ構成
まず性能分析から
・サーバプロセス1つにつき、MRS単体で以下のレコード処理性能(ECHO送受信性能)を持ちます
TCP では 54万レコード/秒
(約60Mbps)
UDP では 35万レコード/秒
(約22...
5
■ 10万人規模のサーバ構成
サーバインスタンスの役割構成を設定する場合
・MRS自体はサーバ構成情報を持っていないため、別途データベースサーバなどを設けて、サーバの役割構成の
情報を付与する必要があります。
・付与されたインスタンス情報は...
6
■ 10万人規模のサーバ構成
サーバインスタンスの役割構成の実装例
・MRSクライアントから、一般的なゲームサーバのサービス(ロビーサーバ, マッチングサーバ, バトルサーバ)
などに接続する場合の構成例は以下の通りです。
7
■ 最小限のMUNゲームサーバ構成例
MUNサーバにおける最小構成
・ mun_resolver : 接続する mun_proxy への接続アドレス通知
・ mun_proxy : ルーム外における一連の通信制御(ルーム入退室, ルーム/プ...
8
■ 最小限のMUNゲームサーバ構成例
特徴
・リアルタイム処理を必要とされる部分について、マッチング処理からゲームシーンの完全同期までを提供
簡単な小規模ネットワークゲーム、MOレベルのネットワークゲームなど運用可能
・MUNを利用すること...
9
■ MUNのコーディング例
簡単な送受信サンプルの実装例
・MUNのコードも至ってシンプルで、簡単なECHO送受信のコードを記述すると以下のように書けます。
クライアント側
using System;
using MonobitEngine...
10
■ MUNによる10万人大規模サービスの構成
MUNサーバで「同時接続者数10万」を実現するには
・MUNは原則として、以下の用途におけるネットワークゲームに適しています。
a) オンライン対戦型のターン制カードゲーム、パズルゲームなど
...
11
■ MUNによる10万人大規模サービスの構成
複数の MUN サーバセットによる 10万人同時接続の実現(概略)
・複数の MUN サーバセットによる、 10万人同時接続を実現するためのサーバ構成例として、以下に示します。
・1つの MU...
12
■ MUNによる10万人大規模サービスの構成
複数の MUN サーバセットによる 10万人同時接続の実現(詳細)
・Webサーバでは、複数の MUN サーバセット内に含まれる mun_resolver のクライアント接続アドレス情報を
事...
13
■ MRS&MUN+サーバ監視システム(Mackerel)
MRS&MUNはMackerelに対応しています
・MackerelのUI+APIを利用して、統括的なサーバ監視とインフラ構築の自動化が可能
・ロードアベレージ、システムリソース...
14
■ MUNによるMMOサーバの提供
MUNの制約
・MMOのサービス提供を視野に入れる場合、約10万人の同時接続を可能にしなければならない
・しかし、MUNには「同時ルーム入室者数255人まで」という制約がある
・通常のクライアント接続方...
15
■ MUNによるMMOサーバの提供
MUNでMMOを実現する方法1
・ルームホストのクライアントが、ルームゲストのクライアント情報を集約して、「他のルームのホストに転送する」
ための専用ルームを用意する方法
この方法のメリット・デメリット...
16
■ MUNによるMMOサーバの提供
MUNでMMOを実現する方法2
・サーバ側でワールド情報を別段データベースで保存して、情報を共有する方法
この方法のメリット・デメリット
・ネットワークトラフィックや、クライアントの負荷を掛けずに、MM...
17
■ まとめ
お手軽に開発するのであれば「MUN」がおすすめです!
・何よりクライアントベースで開発できます。
・ネットワークゲームのモック、プロット開発、小規模なゲームであれば、機能として十分です。
・Unity のクライアント負荷を軽減...
Upcoming SlideShare
Loading in …5
×

【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

422 views

Published on

2017年10月27日、モノビットエンジン勉強会inサイバーコネクトツーにて、安田京人が講演しました「MRS/MUN 10万接続サーバ構成実例」のスライドになります。ネットワークゲームを製作する際にご参考頂けますと幸いです。

▼講演概要
2017年に完全新作、超高性能に生まれ変わったモノビットエンジンの製品群を用いて、10万人規模の大規模同時接続を行うMO型、MOBA型、MMORPGなどのネットワークゲームについて、どのようにプログラムとサーバを構築し、安全に運用することが出来るようになったのか、実際にコーディング実例やサーバ構成図、運用管理画面を表示しつつ、ご説明いたしました。
また、「ネットワークゲームにおけるTCPとUDPの使い分け」と称して中嶋謙互がTCP/UDPの性能を実際の計測値をもとに徹底比較しつつ、解説しました。
なお、今回はCEDEC2017に公開したセッションに加えて、これまでに頂いたご質問とその回答などを交えてお届けいたしました!

Published in: Technology
  • Be the first to comment

【モノビットエンジン勉強会inサイバーコネクトツー】 第二部「MRS/MUN 10万接続サーバ構成実例」

  1. 1. 中嶋 謙互(取締役CTO) 安田 京人(ミドルウェア事業部部長) 新しくなったモノビットエンジンを使って 10万人規模のサーバを構築するノウハウを公開! モノビットエンジン勉強会 in サイバーコネクトツー様 株式会社モノビット 第二部 MRS/MUN 10万接続サーバ構成実例 (安田)
  2. 2. 1 ■ MRSゲームサーバ構成例 MRSサーバにおける最小構成 ・ mrs_room : MRSで提供している最小構成のルーム管理サーバ。 ルーム入退室制御と、ルーム内外でのデータ送信を可能にする。 Global Section Private Section MRS Server Machine MRS Server Process MRS Server mrs_room mrs_room がルームの管理、ルーム内外のデータ送信を 一括制御 Internet ・・・ MRS Client MRS Client ・・・ MRS Client Machine MRS Client Process MRS Client MRS Client MRS Client MRS Client MRS Client MRS Client MRS Client MRS Client mrs_room MRS Server mrs_room ・・・mrs_room ・・・ MRS Server mrs_room mrs_room ・・・ MRS Server mrs_room mrs_room ・・・ CネイティブのAPIを用意 言語バインディングで多言語対応 Frontend MRS Room Servers
  3. 3. 2 ■ MRSゲームサーバ構成例 特徴 ・リアルタイム処理を必要とされる部分について、簡単なデータ送受信とルーム管理機能を提供 ・簡単な通信対戦、小規模ネットワークゲームであれば実装可能 ・サーバ、クライアントともにCネイティブのAPIを用意しており、言語バインディングにより、多種多様な プログラミング言語に対応可能(弊社サンプルでは C, C++, C#, Java, JavaScript, PHP を用意) ・ルームを跨いだ通信ができないので注意が必要 リアルタイムサーバ間、サーバ⇔クライアントとの接続 ・TCP/UDP/WebSocketによるソケット接続が可能で、完全同期通信を実現。 なぜAPIがCネイティブである必要があるのか ・リアルタイム通信を行うゲームでは、サーバサイドで多くの処理を行う必要があるので、サーバプログラムの 実行速度が大変重要 ・そのため、例えWebブラウザで動かすようなゲームであっても、Web言語よりも数十倍の実行効率を持つ C++言語でサーバー側の処理を記述する事により、素早い通信を実現し、なおかつサーバー台数を大幅に 削減可能 ・かつ、C++言語で書かれたライブラリをCネイティブのAPIとしてWrapすることで、より多くの言語バイン ディングに対応することを可能にしている
  4. 4. 3 ■ MRSゲームサーバのコーディング例 簡単な送受信サンプルの実装例 ・MRSのコードは至ってシンプルで、簡単なECHO送受信のコードをCで記述すると以下のように書けます。 クライアント側 サーバ側 #include <mrs.hpp> bool g_Run = true; // ループフラグ // 接続後処理 void onConnect( MrsConnection _con, void* _data ) { // ECHO 送信 mrs_write_record( _con, MRS_RECORD_OPTION_NONE, 0x01, “Hello, MRS!”, strlen(“Hello, MRS!”) + 1 ); } // ECHO受信後処理 void onRead( MrsConnection _con, void* _data, uint32 _seq, int16 _option, uint16 _type, const void* _payload, uint32 _len ) { // 受信結果表示 printf(“data=%s, datalen=%d”, (const char *)_payload, _len); // ループ終了 g_Run = false; } //メイン処理 int main() { // 初期化 mrs_initialize(); // 接続処理 MrsConnection client = mrs_connect(MRS_CONNECTION_TYPE_TCP, “192.168.1.253”, 3456, 10000 ); // コールバック設定 mrs_set_connect_callback( client, OnConnect ); mrs_set_read_record_callback( client, OnRead ); // ループ処理 while(g_Run) { mrs_update(); mrs_sleep(1); } // 終了処理 mrs_close(client); mrs_finalize(); return 0; } #include <mrs.hpp> // 接続後処理 void onConnect( MrsServer _server, void* _data, MrsConnection _client ) { // コールバック設定 mrs_set_read_record_callback( _client, OnRead ); } // ECHO受信後処理 void onRead( MrsConnection _con, void* _data, uint32 _seq, int16 _option, uint16 _type, const void* _payload, uint32 _len ) { // ECHO返信 mrs_write_record( _con, _option, _type, _payload, _len); } //メイン処理 int main() { // 初期化 mrs_initialize(); // リスニング開始処理 MrsConnection server = mrs_server_create(MRS_CONNECTION_TYPE_TCP, “192.168.1.253”, 3456, 2000 ); // コールバック設定 mrs_set_new_connection_callback( server, OnConnect ); // ループ処理 while(true) { mrs_update(); mrs_sleep(1); } // 終了処理 mrs_close(server); mrs_finalize(); return 0; }
  5. 5. 4 ■ 10万人規模のサーバ構成 まず性能分析から ・サーバプロセス1つにつき、MRS単体で以下のレコード処理性能(ECHO送受信性能)を持ちます TCP では 54万レコード/秒 (約60Mbps) UDP では 35万レコード/秒 (約22.4Mbps) ・原則として、上記を基準にプロセス内の処理性能を考慮してサーバ構成を検討すれば問題ありません。 耐用しうる同時接続数について ・接続数の限界は、理論上「2の64乗」までは可能です。 ・上記の通信処理性能と合わせて考えれば、例えばMMOなど「同時接続10万接続」が要求される場合でも 余裕で捌けます。 ・なお、公式の無料頒布版では「同時接続者数制限 100CCU まで」の制約がありますが、弊社との契約により この上限を段階的に開放することができますので、別途ご相談ください。
  6. 6. 5 ■ 10万人規模のサーバ構成 サーバインスタンスの役割構成を設定する場合 ・MRS自体はサーバ構成情報を持っていないため、別途データベースサーバなどを設けて、サーバの役割構成の 情報を付与する必要があります。 ・付与されたインスタンス情報はWebサーバ(mrs_pusher)を介してクライアントに通知します。 ・手順は以下の通りです 1. あらかじめKVSやデータベース等のデータストアに接続サーバのアドレス情報を退避しておく 2. MRS クライアントから「最初に接続するサーバ」のアドレス情報を、下図 a → b → c の順に取得 3. 取得した情報により、「最初に接続するサーバ」との情報の送受信(下図 d) 4. MRS クライアントから「次に接続するサーバ」 のアドレス情報を、下図 a → b → c の順に取得 5. 取得した情報により、「次に接続するサーバ」との情報の送受信(下図 e) Web Server mrs_pusher Database database First Server mrs_room Second Server mrs_room MRS Client MRS Client a c d e b
  7. 7. 6 ■ 10万人規模のサーバ構成 サーバインスタンスの役割構成の実装例 ・MRSクライアントから、一般的なゲームサーバのサービス(ロビーサーバ, マッチングサーバ, バトルサーバ) などに接続する場合の構成例は以下の通りです。
  8. 8. 7 ■ 最小限のMUNゲームサーバ構成例 MUNサーバにおける最小構成 ・ mun_resolver : 接続する mun_proxy への接続アドレス通知 ・ mun_proxy : ルーム外における一連の通信制御(ルーム入退室, ルーム/プレイヤー検索, etc...) ・ mun_room : ルーム内における一連の通信制御(RPC, オブジェクト同期, etc...) ・ mun_master : mun_proxy, mun_room の情報を統制管理する、オンメモリ上のデータベース制御
  9. 9. 8 ■ 最小限のMUNゲームサーバ構成例 特徴 ・リアルタイム処理を必要とされる部分について、マッチング処理からゲームシーンの完全同期までを提供 簡単な小規模ネットワークゲーム、MOレベルのネットワークゲームなど運用可能 ・MUNを利用することにより、サーバサイドを一切コードを書かずに、クライアントサイドのみ実現可能 ・MRS同様、ルームを跨いだ通信ができないので注意が必要 リアルタイムサーバ間、サーバ⇔クライアントとの接続 ・内部エンジンで MRS を利用しているので、特性は MRS に準じる ・MUN では MRS-API を Unity 向けに C# でバインディングして、TCP/UDPによるソケット接続が可能 MUN ルームサーバの制限 ・1ルームに入室できるプレイヤー人数は 255 人まで、1サーバプロセスで十分に捌ける人数は3万クライアント程度 ・提供するゲームの規模に応じて、mun_room サーバのスケールアウトが必要
  10. 10. 9 ■ MUNのコーディング例 簡単な送受信サンプルの実装例 ・MUNのコードも至ってシンプルで、簡単なECHO送受信のコードを記述すると以下のように書けます。 クライアント側 using System; using MonobitEngine; namespace MUN_EchoSample { class EchoSample : MonobitEngine.MonoBehaviour { void Start() { MonobitNetwork.ConnectServer(“EchoSample”); // サーバ接続 } void Update() { if( !MonobitNetwork.isConnect ) return; if( !MonobitNetwork.inRoom ) { MonobitNetwork.JoinOrCreateRoom(“MyRoom”, new RoomSettings(), null); // ルーム入室 } } // ルーム入室時の処理 void OnJoinedRoom() { if( !MonobitNetwork.isHost ) { monobitView.RPC(“SendMsg”, MonobitTarget.Others, MonobitNetwork.player, “Hello, MUN!” ); // ECHO送信 } } // ECHO送信の受信 [MunRPC] void SendMsg(MonobitPlayer sender, string msg) { UnityEngine.Debug.Log(“SendMsg : “ + msg ); // 受信結果表示 monobitView.RPC(“EchoMsg”, sender, msg ); // ECHO返信 } // ECHO返信の受信 [MunRPC] void EchoMsg(string msg) { UnityEngine.Debug.Log(“EchoMsg : “ + msg ); // 返信結果表示 MonobitNetwork.DisconnectServer(); // サーバ切断 } } }
  11. 11. 10 ■ MUNによる10万人大規模サービスの構成 MUNサーバで「同時接続者数10万」を実現するには ・MUNは原則として、以下の用途におけるネットワークゲームに適しています。 a) オンライン対戦型のターン制カードゲーム、パズルゲームなど b) MO(中小規模の、参加人数限定型マルチプレイヤーオンラインゲーム) c) MOBA(参加人数限定型の戦略対戦型オンラインゲーム) ・1つの MUN サーバセットあたりで、同時接続、およびルーム内各種メッセージを捌けるのは おおよそ3万人程度です(弊社調べ:1ルームあたり、秒間平均200メッセージの送受信を想定)。 ・10万人規模の同時接続者数を捌くためには、MUNサーバの横展開(スケール)が必要になりますが、MUN の サーバセットは密結合のサーバプロセスで構成されているため、スケールする場合、このサーバセットを1組として 複数のサーバセットを並列配置することになります。 ・サーバセットをスケールすることにより、実質的に無限数のMUN クライアントに対し、同時接続処理を捌けます。 ・次ページで、具体的なサーバ構成例を示します。 MUN Room MUN Proxy mun_proxy ・・・mun_resolver MUN Master mun_master MUN Resolver mun_proxy mun_room ・・・mun_room 「MUN サーバセット」のこの1組を単位として、 複数サーバセットを並列配置する
  12. 12. 11 ■ MUNによる10万人大規模サービスの構成 複数の MUN サーバセットによる 10万人同時接続の実現(概略) ・複数の MUN サーバセットによる、 10万人同時接続を実現するためのサーバ構成例として、以下に示します。 ・1つの MUN サーバセットに対して同時に捌くことのできるクライアント数は3万クライアントまでですが、若干 余裕を持たせて、サーバセットを5セット程度用意します。 ・どの MUN サーバセットに接続するかを管理し、クライアントを誘引するための、Webサーバを複数台用意します。 Global Section MUN Server Machine MUN Server Process Internet MUN Client MUN Client ・・・ MUN Client Machine MUN Client Process Web Server mrs_pusherdatabase MUN Client MUN Client MUN Client MUN Client MUN Client MUN Client MUN Client MUN Client MUN Resolver mun_resolver MUN Master mun_master MUN Proxy ・・・ mun_proxy mun_room MUN Room ・・・ ・・・ mun_proxy mun_room ・・・ MUN Resolver mun_resolver MUN Master mun_master MUN Proxy ・・・ mun_proxy mun_room mun_proxy mun_room ・・・ MUN Room Private Section MUN Server Set 1 MUN Server Set 2 ・・・
  13. 13. 12 ■ MUNによる10万人大規模サービスの構成 複数の MUN サーバセットによる 10万人同時接続の実現(詳細) ・Webサーバでは、複数の MUN サーバセット内に含まれる mun_resolver のクライアント接続アドレス情報を 事前にデータベース情報として、複数台で同一の内容を保持します。 かつ、MUNクライアントは mun_resolver に接続する前にこの Web サーバに接続し、MUN サーバセットのうち 「最も既存クライアントの接続数の少ない」 mun_resolver のアドレス情報を mrs_pusher で返します。 ※ MUN では MRS が内包されていますので、MRSでの情報のやり取りも可能です。 ・MUN サーバセットでは、MO/MOBAをはじめとする、中小規模の人数が参加するゲームルームを設置し、そこで ルーム内プレイヤー同士で、RPCによるデータの送受信、キャラクタなどのオブジェクト位置情報の同期などを 行います。 MUN Resolver に接続するためのアドレス情報を退避したデータベースを持つWebサーバ。 MUNクライアントとのやり取りのためにmrs_pusherを利用し、かつ最もクライアント接続数が 少ない、MUNサーバセットへの誘導を行なう Web Server mrs_pusherdatabase MUN サーバセット自体は通常の MUN サーバとして運用する サーバのスケールアウトは、原則このサーバセットを1単位として、全体をスケールする形をとる 接続するクライアントは、適宜必要に応じたルームに入室させ、 その中に所属するプレイヤー同士で、メッセージのやり取り、キャラクタの位置情報の同期、 各種パラメータの共有などを行なう。 比較的セキュリティ性を求められない通信対戦/MOであればクライアントベースで開発し、 セキュリティ性の高い通信対戦/MOや、複雑なロジックを必要とするMOBAなどであれば サーバサイドでのプログラムを実装し、なるべく保守性・安定性に優れたシステムを構築する
  14. 14. 13 ■ MRS&MUN+サーバ監視システム(Mackerel) MRS&MUNはMackerelに対応しています ・MackerelのUI+APIを利用して、統括的なサーバ監視とインフラ構築の自動化が可能 ・ロードアベレージ、システムリソース、ネットワークリソースの監視、サーバプロセスのモニタリング、 同時利用者数(CCU)の監視などが可能。
  15. 15. 14 ■ MUNによるMMOサーバの提供 MUNの制約 ・MMOのサービス提供を視野に入れる場合、約10万人の同時接続を可能にしなければならない ・しかし、MUNには「同時ルーム入室者数255人まで」という制約がある ・通常のクライアント接続方法ではワールド間どころかフィールド内の同時接続すら実現できず、 MMO のサービス提供には耐えられないので、システム設計上の工夫が必要
  16. 16. 15 ■ MUNによるMMOサーバの提供 MUNでMMOを実現する方法1 ・ルームホストのクライアントが、ルームゲストのクライアント情報を集約して、「他のルームのホストに転送する」 ための専用ルームを用意する方法 この方法のメリット・デメリット ・これだけで、MUNクライアントのみでのMMOのシステム自体の実現はできる ・ただし、ネットワークトラフィックは尋常ではない ・ネズミ式にユーザーが増えると、ホストクライアントの負荷も尋常ではなくなる
  17. 17. 16 ■ MUNによるMMOサーバの提供 MUNでMMOを実現する方法2 ・サーバ側でワールド情報を別段データベースで保存して、情報を共有する方法 この方法のメリット・デメリット ・ネットワークトラフィックや、クライアントの負荷を掛けずに、MMOのシステムを実現可能 ・MMOのサービスのほぼすべてをサーバ内で補完できるため、安定した動作、安全な運用を可能にする ・ただし、サーバサイドの知識は不可欠で、MRS-APIの知識や、mrs_pusher の利用方法など、覚えることは多い ・が、総合的には方法1よりもおすすめできる方法
  18. 18. 17 ■ まとめ お手軽に開発するのであれば「MUN」がおすすめです! ・何よりクライアントベースで開発できます。 ・ネットワークゲームのモック、プロット開発、小規模なゲームであれば、機能として十分です。 ・Unity のクライアント負荷を軽減するために実装した一部のロジックについてサーバサイドに移植したり、アプリ 利用者側の操作に依存しないゲームロジックをサーバサイドに記述することも可能です。 ・有償プランをお使いの場合、原則1つのサーバセットで捌けるクライアントの上限は3万程度ですが、Webサーバを 伴った並列制御が可能で、同時接続者数制限は実質ほぼありません。ぜひご検討ください。 最初から本格的・大規模なネットワークゲームを作るのであれば 「MRS」一択です! ・低遅延かつ高レイテンシの、最高級のネットワーク環境でゲームを実装できます。 ・CベースのAPIを覚える必要がありますが、数あるネットワークライブラリの中でもかなり平易です。 ・加えて、MRSの同梱サンプルや、大規模なものだと「MUNサーバ」など、有効なサンプルは揃っています。 ・C/C++ 対応はもちろん、C#, JavaScript のバインディングコードも同梱しています。Cからの言語バインディング を理解しているのであれば、お客様の環境であらゆる言語に対応することもできます。

×