GameAnvilサーバー構成の最も基本となる単位はノードです。各ノードは、その役割に合った機能を独立して実行します。いくつのノードでどんな役割を果たすかは自由に設定が可能です。ノードの詳細について説明する前に、役割別にノードを分けると次のようになります。
ノード | 必須/選択 | 機能 | コンテンツ実装 | ネットワークアクセス |
---|---|---|---|---|
Gateway | 必須 | クライアント接続と認証を処理 | 可能 | public |
Game | 必須 | 実際のゲームサーバーとしてコンテンツを処理 | 可能 | private |
Support | 任意 | 必要に応じて独立したサービスとして実装するようにサポート | 可能 | privateまたはpublic |
Match | 任意 | マッチメイキング実行 | 可能 | private |
Location | 必須(自動構成) | ユーザーとルームなどの位置情報を保存および管理 | 不可 | private |
Management | 必須(自動構成) | サーバー情報の収集およびConsole/Agentと通信 | 不可 | private |
Ipc | 必須(自動構成) | GameAnvilサーバーのInter-process通信を処理 | 不可 | private |
特に、ユーザーはこの中でコンテンツ実装が可能なノード(Gateway、Game、Support、Match)にのみ集中してください。残りのノードは、エンジンが内部的に使用するため、ユーザーが追加で実装する必要はありません。また、必ず1つ以上の必須ノードが存在しなければ、サーバー全体が正常に動作しません。この時、LocationノードはGameAnvilConfig.jsonに明示的に宣言する必要があります。
このようなノードの階層構造は次の図のとおりです。
GameAnvilにおいて、1つのノードは1つのスレッドで処理されます。これは非常に重要な部分で、各ノードは基本的にすべての処理を非同期で行う必要があり、このノードスレッドは、ブロッキングなしで継続的に動作することが保証されなければなりません。このような駆動モデルは、Vert.xやNode.jsのそれと非常によく似ています。
シングルスレッドの最大のメリットは、Lock-Freeです。ユーザーは特殊な場合を除き、明示的にロックを使用する必要がなく、使うべきではありません。ロックを使用した瞬間、該当ノードスレッドが処理を停止する可能性があります。これは該当ノード全体のロジックが停止することを意味するため、GameAnvilで開発する際は絶対にノードスレッドにロックを使用してはいけません。したがって、ノードスレッドと外部スレッド間に、ゲーム関連オブジェクトが共有してはいけません。ただし、別途で外部スレッドを作成し作業を委任する場合は、外部スレッド間のロックを使用しても構いません。もし外部スレッドに作業を委任した場合や、委任した作業の結果を取得する必要がある場合は、GameAnvilが提供する非同期サポートAPIを使用してください。