# マイグレーション

## 概要

本ページでは Diarkis サーバーにおけるマイグレーションの挙動について説明します。

## マイグレーションとは

Diarkis サーバーはクラスタ構成されており、ユーザーはその中のどれか1つのサーバーに接続しています。 接続している Diarkis サーバーがスケールインしてユーザーが接続しているサーバーが停止するケースを考えます。 サーバーが停止するため一般的なサーバーであればその時接続しているユーザーは切断されることとなります。 しかし、Diarkis サーバーはクラスタ内の他のサーバーへ移動し、サーバーから切断されることなくサービスを継続することができます。\
この、接続中のサーバーから別のサーバーへ接続しなおしてサービスを維持する仕組みを**マイグレーション**と呼びます。

わかりやすい例としてスケールインを用いて説明しましたが、スケールイン時以外にも様々な要因でマイグレーションが発生する可能性があります。 マイグレーション発生時はサーバーとクライアント・アプリケーションが協調してマイグレーションのプロセスを進める必要があります。次項からはマイグレーション発生時の具体的な処理について説明します。

Room に参加している場合は、下記の機能は使用せず [Room 専用のマイグレーション](/diarkis-modules/room/setup-client.md#room-nomaigurshon) をご確認ください。

## マイグレーション・プロセス全体の流れ

マイグレーションはサーバーからの通知によって始まります。\
様々な要因によりサーバーがマイグレーションが必要と判断すると、サーバーはクライアントへマイグレーションが必要なことを通知し、クライアントでは `DiarkisTcpBase::OnOffline`/`DiarkisUdpBase::OnOffline()` が発火します。このイベントによってマイグレーションが必要なことを認識したクライアントは `DiarkisTcpBase::SendMigrate()`/`DiarkisUdpBase::SendMigrate()` を実行することでサーバーへマイグレートの開始を要求します。 サーバーはマイグレート要求を受け取ると要求したクライアントを切断し、サーバー上のユーザーのデータを新たな接続先のサーバーへ移動し、その後クライアントは新たなサーバーへ再接続します。\
これらの一連のプロセスがマイグレーション時に行われます。

## マイグレーション時のクライアントの対応

前項で説明したように、クライアント側では `DiarkisTcpBase::OnOffline`/`DiarkisUdpBase::OnOffline()` を受け取った後、`DiarkisTcpBase::SendMigrate()`/`DiarkisUdpBase::SendMigrate()` を実行してマイグレーション・プロセスを進める必要があります。

SDK 付属のサンプルでは以下のように `OnOfflien()` 発火後、すぐに `SendMigrate()` を呼ぶように実装されています。

```
void DiarkisTcp::OnOffline()
{
    DiarkisTcpBase::OnOffline();

    // サーバのスケールインにより、接続しているサーバが offline になります。
    // アプリ側の実装に合わせて、適したタイミングで SendMigrate を呼び出して サーバの移動を行ってください。
    this->SendMigrate();
}
```

```
void DiarkisUdp::OnOffline()
{
    DiarkisUdpBase::OnOffline();

    // サーバのスケールインにより、接続しているサーバが offline になります。
    // アプリ側の実装に合わせて、適したタイミングで SendMigrate を呼び出して サーバの移動を行ってください。
    this->SendMigrate();
}
```

なお、`DiarkisTcpBase::SendMigrate()`/`DiarkisUdpBase::SendMigrate()` を実行して再接続処理が開始するとサーバーとの接続が一度切断されるため一時的に通信できなくなります。 切断が発生するタイミングは `DiarkisTcpBase::SendMigrate()`/`DiarkisUdpBase::SendMigrate()` を実行するタイミングでコントロールすることができますので、アプリケーションの都合に合わせて調整してください。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.diarkis.io/diarkis-client/diarkis-module/migration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
