# Diarkis の概要

## Diarkis とモジュール

Diarkis はオンライン・マルチプレイヤー・ゲームなどのためのサーバーとクライアントのネットワーク・ミドルウェアです。

本ミドルウェアには、サーバー側とクライアント側の両方の SDK が付属しています。（サーバー側：Go、クライアント側：C++ および C#）

クライアント側には Unreal Engine のプラグインと Unity Engine の SDK も用意されています。

### サポートする OS

* **Linux**
* **Windows**
* **MacOS**
* **iOS**
* **Android**

### サポートする Platform:

* **PS4, PS5**
* **Xbox One, Xbox Series X, Xbox Series S**
* **Nintendo Switch**
* **Steam**

## サーバー・アーキテクチャの理念

Diarkis のサーバー設計は、サーバーの**非集中化**と**分散化**に重点を置いています。

Diarkis サーバーは、単一のサーバーのように動作するサーバークラスタを形成するように設計されています。サーバーは100％ [Golang](https://go.dev/) で書かれています。

この設計により、サーバー・クラスターは**耐障害性**（クラスター内の一部のサーバーに障害が発生しても、クラスタ内の残りのサーバーは全く影響を受けず、ゲーム・クライアントは単純に継続するために再接続する必要がある）と**水平方向にスケーラブル**（ユーザーのトラフィック量に応じて、単純にスケールイン/スケールアウトするために追加または削除）であることができます。

以下の図は、Diarkis サーバー・クラスターがどのように構成されているかを示しています。

1. Pod はサーバーです。
2. Diarkis クライアントを持つすべてのユーザー・クライアントは、UDP または TCP Pod と直接通信します。
3. Diarkis は、TCP および UDP ネットワーク・プロトコルの両方をサポートしています。
4. UDP の場合、Diarkis は再送、パケット順序制御、MTU 超過能力を備えた独自の RUDP を実装しています。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-e3b6abbb3abc0d2447bd2c3628a4b40b89d3fc24%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

## 従来のアーキテクチャとの比較

Diarkis を使用せずに、同様のネットワーク・サーバー・システムを実装する方法は多数あります。

ここでは、そのようなシステムの最も一般的な方法の一つを取り上げ、Diarkis と比較します。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-23b2c51922bb83fb44e093fe364bc995081357ab%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

### サーバーの維持管理 - 従来の方法

従来の方法では、リアルタイム・サーバーの追加や削除など、サーバーに対する変更はすべて手動でのメンテナンスと変更が必要です。これにより、人為的なエラーやその他の潜在的な問題が発生する可能性があります。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-f2be31439d03c3230972905f66d5da0c46ece3cb%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

一方、Diarkis は手動メンテナンスを全く必要としません。すべてが自動的に処理されます。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-87db81f3cc93ba1fed978f0f03176c0f8356e3e1%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

### システム全体の耐障害性

従来の方法で解決するのが非常に難しい問題が一つあります。それは、システム全体の単一障害点です。

システム全体を管理するために中央制御が必要です。この場合は、データベースになります。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-c828421ae5d2140eb268f8f6f3c1dedd820738b3%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Diarkis のサーバー・クラスターは完全に分散化されており、中央制御システムが存在しないため、Diarkis サーバーのクラスター全体を管理する中央制御システムがありません。これにより、システム全体の単一障害点の問題が効果的に解消されます。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-4a3222b194f327a5ebd9634785d0bec6895edded%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

## クライアントからサーバーへの通信

Diarkis は、主にリモート・クライアントとのサーバー・リレー同期を使用します。

つまり、Diarkis サーバーはクライアントがデータを交換するためのハブとして機能します。

### クライアントとサーバーの通信

Diarkis は主にリモート・クライアントとのサーバー・リレー同期を使用します。

これは、Diarkis サーバーがクライアント間のデータ交換のハブとして機能することを意味します。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-95d6a6367bfa6198553702551ee8546b55c3d0d6%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Diarkis が提供するもう一つの同期方法は peer-to-peer (P2P) 通信です。

クライアントはデータを peer-to-peer で直接送受信します。サーバー・リレーのようにクライアント間にサーバーは存在しません。Diarkis はクライアントが直接通信するためのディスカバリーポイントとして機能します。

peer-to-peer 通信には 2 つのステップが必要です。まず、クライアントは自分のアドレスを交換し、[ホールパンチング](https://en.wikipedia.org/wiki/Hole_punching_\(networking\))を行います。ホールパンチングが成功すると、クライアントはパケットを直接送受信することができます。

<figure><img src="https://669307705-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FlFJ89PMX2ike3NyauXNM%2Fuploads%2Fgit-blob-4ef1e15b38c0cbf6436d6729a7dc05eac4669d3e%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

## Diarkis クライアント SDK

Diarkis クライアントは C++ で書かれています。また、 C# インターフェースもあります。クライアント SDK には Unreal Engine プラグインと Unity Engine プラグインが付属しています。

## Diarkis モジュール

Diarkis にはゲーム開発者が使用できる組み込みモジュールがあります。

* [Room モジュール](https://help.diarkis.io/diarkis-modules/room)
* [MatchMaker モジュール](https://help.diarkis.io/diarkis-modules/matchmaker)
* [Field モジュール](https://help.diarkis.io/diarkis-modules/field)
* [P2P（peer-to-peer）モジュール](https://help.diarkis.io/diarkis-modules/p2p)
* [DM（Direct Message）モジュール](https://help.diarkis.io/diarkis-modules/dm)
* [Notifier モジュール](https://help.diarkis.io/diarkis-modules/notifier)
* [Session モジュール](https://help.diarkis.io/diarkis-modules/session)
* [Group モジュール](https://help.diarkis.io/diarkis-modules/group)
