マイグレーション

概要

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

マイグレーションとは

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

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

Room に参加している場合は、下記の機能は使用せず Room 専用のマイグレーション をご確認ください。

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

マイグレーションはサーバーからの通知によって始まります。 様々な要因によりサーバーがマイグレーションが必要と判断すると、サーバーはクライアントへマイグレーションが必要なことを通知し、クライアントでは 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() を実行するタイミングでコントロールすることができますので、アプリケーションの都合に合わせて調整してください。

最終更新