Diarkis サーバのオートスケールはサーバのスケール・アウト(拡張)とイン(縮小)両方の側面があります。そこで重要なのは特に自動縮小の際に接続しているクライアントに影響無くハンドリングすることが重要です。
Diarkis クライアントは接続しているサーバが縮小のためにシャットダウン準備に入る際に「OnOffline」というイベントが発生します。クライアントはこのイベントを処理することでサーバの自動縮小に対しての対応が可能です。
この際に「Room Migration」を使うことで、自動伸縮の際にルームのプロパティ含めメンバーを維持したままで別のサーバにマイグレーションしサーバの自動伸縮があってもルームを完全に維持してサービスを継続するこが可能です。
NOTE: マイグレーションによってルームのオーナーが変わることはありませんが、マイグレーション後にオーナーがルームに再参加できなかった場合は他のメンバーが自動オーナーに選出されます。
IMPORTANT: ルームマイグレーションで移動した先のルーム ID は 移動する前のルーム ID と異なります。
C++ Client Code Example:
コードのサンプルはサーバからのシグナルで発生する OnOfline のイベントを受けてルームマイグレーションを実行する例です。
// UDP client
void DiarkisUdpBase::OnOffline(void)
{
SendMigrate();
}
void DiarkisRoomBase::SendMigrate()
{
// This will start Room Migration immediately.
// room.OnMemberLeave and room.OnMemberJoin will be raised respectively.
this->room->Migrate();
}
サーバでルームマイグレーションを検知する
ルームモジュールでは、ルームマイグレーションが実行された際に検知してコールバックを使って任意の処理を実行することが可能です。
Server Code Example:
import "github.com/Diarkis/diarkis/room"
room.SetOnMigrated(handleOnRoomMigration)
func handleOnRoomMigration(newRoomID string, oldRoomID string) {
// if you manage room IDs outside of Diarkis such as KVS and RDB etc.
// update the room IDs here and now
}