WebSocket再接続戦略
注釈:本資料はAI技術を用いて翻訳されています。
概要
AccelByte Gaming Services(AGS)Game SDKを使用すると、ゲーム開発者は特定のニーズに基づいた戦略でWebSocket再接続を実装できます。この戦略は、Lobby、Chat、AMS、DSHubを含むすべてのWebSocketサービスに適用されます。戦略のデフォルトの推奨設定はすでに設定されており、ゲームレベルのコード内で構成を更新できます。
以下に、提供されるさまざまな戦略について詳しく説明します。
| BALANCED | AGGRESSIVE | LIMITLESS |
|---|---|---|
| 指定されたタイムアウト期間まで、バランスの取れた再試行間隔で再接続を試みます。 | 指定されたタイムアウト期間まで、積極的な再試行間隔で再接続を試みます。 | 接続が確立されるまで常に再接続を試みます。 |
| デフォルトの再接続遅延パターン: - 初期バックオフ遅延:1秒 - バックオフベース係数:2 - バランスの取れた最大再試行間隔:30秒 ~1、~2、~4、~8、~16、~30、~30、…タイムアウトまで | デフォルトの再接続遅延パターン: - 積極的な再試行間隔:3秒 ~3、~3、~3、~3、…タイムアウトまで | デフォルトの再接続遅延パターン: - 初期バックオフ遅延:1秒 - バックオフベース係数:2 - 最大再試行間隔:120秒 ~1、~2、~4、8、~16、~32、~64、~120、~120、…タイムアウトなし |
| クライアントWebSocket再接続に推奨されます。 | 積極的な方法でクライアントWebSocket再接続に推奨されます。 | サーバーWebSocket再接続に推奨されます。 |
| この戦略は、LobbyおよびChat WebSocketのデフォルトとして設定されています。 | - | この戦略は、AMSおよびDSHub WebSocketのデフォルトとして設定されています。 |
実装
このガイドラインは、LobbyサービスのWebSocket構成を設定および変更するためのものですが、Chat、AMS、DSHubなどの他のサービスにも同様に適用されます。
WebSocket戦略構成の取得
AGS OSSからTryConfigureWebsocketConnection関数を使用して、WebSocket戦略構成を取得できます。LocalUserNumとターゲットWebsocketServiceTypeを関数パラメータに指定します。WebSocketサービスタイプには、LOBBY_GAMECLIENT、CHAT_GAMECLIENT、DS_HUB_GAMESERVER、AMS_GAMESERVERなどの値が含まれます。
- Unreal OSS
- Unity
FOnlineSubsystemAccelByte* OnlineSubsystemAccelByte = static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
// Obtain configurable WebSocket interface of AGS Lobby
TOptional<IWebsocketConfigurableReconnectStrategy*> LobbyWebsocketConfiguration = OnlineSubsystemAccelByte->TryConfigureWebsocketConnection(LocalUserNum, AccelByte::EConfigurableWebsocketServiceType::LOBBY_GAMECLIENT);
// Check WebSocket interface configuration
if (!LobbyWebsocketConfiguration.IsSet())
{
// AGS Lobby WebSocket configuration is not valid
return false;
}
実装は近日公開予定です。
バランスの取れた再接続戦略の作成
FReconnectionStrategyクラスを使用してCreateBalancedStrategyを呼び出し、再接続戦略を作成できます。バランスの取れた戦略の作成では、次の3つのパラメータを指定できます。
FBalancedMaxRetryInterval- 最大再試行間隔を指定します。デフォルト値は30秒です。FTotalTimeoutDuration- 再接続のタイムアウト期間を指定します。デフォルト値は60秒です。FInitialBackoffDelay- 最初の再接続を開始する初期期間を指定します。デフォルト値は1秒です。
- Unreal OSS
- Unity
FReconnectionStrategy::FBalancedMaxRetryInterval BalancedMaxRetryInterval = FReconnectionStrategy::FBalancedMaxRetryInterval(
FTimespan::FromSeconds(60.0f)
);
FReconnectionStrategy::FTotalTimeoutDuration TotalTimeoutDuration = FReconnectionStrategy::FTotalTimeoutDuration(
FTimespan::FromSeconds(120.0f)
);
FReconnectionStrategy::FInitialBackoffDelay InitialBackoffDelay = FReconnectionStrategy::FInitialBackoffDelay(
FTimespan::FromSeconds(5.0f)
);
FReconnectionStrategy BalancedReconnectStrategy = FReconnectionStrategy::CreateBalancedStrategy(
BalancedMaxRetryInterval, TotalTimeoutDuration, InitialBackoffDelay
);
実装は近日公開予定です。
積極的な再接続戦略の作成
FReconnectionStrategyクラスを使用してCreateAggressiveStrategyを呼び出し、再接続戦略を作成できます。積極的な戦略の作成では、次の3つのパラメータを指定できます。
FAggressiveRetryInterval- 再接続遅延間隔を指定します。デフォルト値は3秒です。FTotalTimeoutDuration- 再接続のタイムアウト期間を指定します。デフォルト値は20秒です。FInitialBackoffDelay- 最初の再接続を開始する初期期間を指定します。デフォルト値は1秒です。
- Unreal OSS
- Unity
FReconnectionStrategy::FAggressiveRetryInterval AggressiveRetryInterval = FReconnectionStrategy::FAggressiveRetryInterval(
FTimespan::FromSeconds(5.0f)
);
FReconnectionStrategy::FTotalTimeoutDuration TotalTimeoutDuration = FReconnectionStrategy::FTotalTimeoutDuration(
FTimespan::FromSeconds(120.0f)
);
FReconnectionStrategy::FInitialBackoffDelay InitialBackoffDelay = FReconnectionStrategy::FInitialBackoffDelay(
FTimespan::FromSeconds(120.0f)
);
FReconnectionStrategy AggressiveReconnectStrategy = FReconnectionStrategy::CreateAggressiveStrategy(
AggressiveRetryInterval, TotalTimeoutDuration, InitialBackoffDelay
);
実装は近日公開予定です。
無制限の再接続戦略の作成
FReconnectionStrategyクラスを使用してCreateLimitlessStrategyを呼び出し、再接続戦略を作成できます。無制限の戦略の作成では、次のパラメータを指定できます。
FInitialBackoffDelay- 最初の再接続を開始する初期期間を指定します。デフォルト値は1秒です。
- Unreal OSS
- Unity
FReconnectionStrategy::FInitialBackoffDelay InitialBackoffDelay = FReconnectionStrategy::FInitialBackoffDelay(
FTimespan::FromSeconds(120.0f)
);
FReconnectionStrategy LimitlessReconnectStrategy = FReconnectionStrategy::CreateLimitlessStrategy(
InitialBackoffDelay
);
実装は近日公開予定です。
バックオフメカニズムのベース係数の更新
ニーズに基づいて、バックオフメカニズムのベース係数を設定または更新できます。ベース係数を4秒に設定すると、再接続遅延パターンは次のようになります。
~1、~4、~16、~64、…
- Unreal OSS
- Unity
constexpr uint32 BASE_FACTOR = 4;
auto BalancedStrategy = FReconnectionStrategy::CreateBalancedStrategy();
BalancedStrategy.SetBackoffMechanism(BASE_FACTOR);
実装は近日公開予定です。
デフォルトの再接続戦略の設定
再接続戦略の作成後、デフォルトの戦略を設定できます。作成したLobbyWebsocketConfiguration変数を使用して、SetDefaultReconnectionStrategy関数を呼び出すことができます。関数パラメータは、以前に作成した再接続戦略(バランスの取れた、積極的な、または無制限の戦略のいずれか)である必要があります。
バランスの取れた再接続戦略の設定:
- Unreal OSS
- Unity
LobbyWebsocketConfiguration.GetValue()->SetDefaultReconnectionStrategy(BalancedReconnectStrategy);
実装は近日公開予定です。
積極的な戦略の設定:
- Unreal OSS
- Unity
LobbyWebsocketConfiguration.GetValue()->SetDefaultReconnectionStrategy(AggressiveReconnectStrategy);
実装は近日公開予定です。
無制限の戦略の設定:
- Unreal OSS
- Unity
LobbyWebsocketConfiguration.GetValue()->SetDefaultReconnectionStrategy(LimitlessReconnectStrategy);
実装は近日公開予定です。
特定の再接続戦略の設定
さまざまな対象切断クロージャータイプに対して再接続戦略を指定することもできます。SetSpecificReconnectionStrategy関数を使用してこれを設定できます。関数パラメータには、次のようなWebSocketクロージャーコードも含まれます。
ClosedAbnormally- WebSocket開示コード1006DisconnectServerShutdown- WebSocket開示コード4000
- Unreal OSS
- Unity
LobbyWebsocketConfiguration.GetValue()->SetSpecificReconnectionStrategy(
AccelByte::EWebsocketClosureCodeForSpecificRetry::ClosedAbnormally, //1006 code
AggressiveReconnectStrategy
);
LobbyWebsocketConfiguration.GetValue()->SetSpecificReconnectionStrategy(
AccelByte::EWebsocketClosureCodeForSpecificRetry::DisconnectServerShutdown, //4000 code
LimitlessReconnectStrategy
);
実装は近日公開予定です。
大規模障害期間の更新
大規模障害の期間を指定できます。これは、さまざまなニーズのためにコールバックを通知し、追加情報を提供するために使用されます。大規模障害のコールバックは、再接続試行がまだ消耗していない場合、またはまだあきらめていない場合にのみ受信されます。
大規模障害の秒数を40に設定すると、再接続試行が消耗していない場合、40秒ごとに大規模障害のコールバックが通知されます。コールバック委譲の概要については、再接続戦略のコールバック委譲の設定セクションを参照してください。
- Unreal OSS
- Unity
constexpr uint32 MASSIVE_OUTAGE_SETTING_SECONDS = 40;
LobbyWebsocketConfiguration.GetValue()->GetDefaultReconnectionStrategy().SetMassiveOutageDuration(FTimespan::FromSeconds(MASSIVE_OUTAGE_SETTING_SECONDS));
実装は近日公開予定です。
再接続戦略のコールバック委譲の設定
WebSocketが現在再接続中であることをゲームに通知し、さまざまなニーズのために追加情報を渡すための委譲コールバックを提供します。再接続戦略用に2つの委譲があります。
ReconnectAttempted- この委譲は、再接続を試みるときに起動されます。MassiveOutage- この委譲は、大規模障害期間が満たされたときに常に起動されます。大規模障害は、再接続試行がまだ消耗していない場合、またはまだあきらめていない場合にのみ受信されます。
Lobbyサービス
Identity Interfaceを使用してから委譲を呼び出してコールバックの登録を開始できます。次のようなものがあります。
AddAccelByteOnLobbyReconnectAttemptedDelegate_Handle- 現在のローカルプレイヤーコントローラーの
LocalUserNumパラメータを指定します。 FAccelByteOnLobbyReconnectAttemptedDelegateのラムダを作成します。
- 現在のローカルプレイヤーコントローラーの
AddAccelByteOnLobbyMassiveOutageEventDelegate_Handle- 現在のローカルプレイヤーコントローラーの
LocalUserNumパラメータを指定します。 FAccelByteOnLobbyMassiveOutageEventDelegateのラムダを作成します。
- 現在のローカルプレイヤーコントローラーの
- Unreal OSS
- Unity
TSharedPtr<FOnlineIdentityAccelByte, ESPMode::ThreadSafe> IdentityInterface = StaticCastSharedPtr<FOnlineIdentityAccelByte>(OnlineSubsystemAccelByte->GetIdentityInterface());
if (!IdentityInterface.IsValid())
{
return false;
}
FDelegateHandle ReconnectAttemptedHandle = IdentityInterface->AddAccelByteOnLobbyReconnectAttemptedDelegate_Handle(
LocalUserNum, FAccelByteOnLobbyReconnectAttemptedDelegate::CreateLambda([&](int32 /*LocalUserNum*/, const FReconnectAttemptInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("ReconnectAttempt! AttemptCount %d, NextRetry %s"), Info.AttemptCount, *Info.NextRetryAttemptIn.ToString());
}));
FDelegateHandle MassiveOutageHandle = IdentityInterface->AddAccelByteOnLobbyMassiveOutageEventDelegate_Handle(
LocalUserNum, FAccelByteOnLobbyMassiveOutageEventDelegate::CreateLambda([&](int32 /*LocalUserNum*/, const FMassiveOutageInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("MassiveOutage! TotalTimeoutDuration %s"), *Info.TotalTimeoutDuration.ToString());
}));
実装は近日公開予定です。
Chatサービス
Chat Interfaceを使用してから委譲を呼び出してコールバックの登録を開始できます。次のようなものがあります。
AddAccelByteOnChatReconnectAttemptedDelegate_Handle- 現在のローカルプレイヤーコントローラーの
LocalUserNumパラメータを指定します。 FAccelByteOnChatReconnectAttemptedDelegateのラムダを作成します。
- 現在のローカルプレイヤーコントローラーの
AddAccelByteOnChatMassiveOutageEventDelegate_Handle- 現在のローカルプレイヤーコントローラーの
LocalUserNumパラメータを指定します。 FAccelByteOnChatMassiveOutageEventDelegateのラムダを作成します。
- 現在のローカルプレイヤーコントローラーの
- Unreal OSS
- Unity
TSharedPtr<FOnlineChatAccelByte, ESPMode::ThreadSafe> ChatInterface = StaticCastSharedPtr<FOnlineChatAccelByte>(OnlineSubsystemAccelByte->GetChatInterface());
if (!ChatInterface.IsValid())
{
return false;
}
FDelegateHandle ReconnectAttemptedHandle = ChatInterface->AddAccelByteOnChatReconnectAttemptedDelegate_Handle(
LocalUserNum, FAccelByteOnChatReconnectAttemptedDelegate::CreateLambda([&](int32 /*LocalUserNum*/, const FReconnectAttemptInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("ReconnectAttempt! AttemptCount %d, NextRetry %s"), Info.AttemptCount, *Info.NextRetryAttemptIn.ToString());
}));
FDelegateHandle MassiveOutageHandle = ChatInterface->AddAccelByteOnChatMassiveOutageEventDelegate_Handle(
LocalUserNum, FAccelByteOnChatMassiveOutageEventDelegate::CreateLambda([&](int32 /*LocalUserNum*/, const FMassiveOutageInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("MassiveOutage! TotalTimeoutDuration %s"), *Info.TotalTimeoutDuration.ToString());
}));
実装は近日公開予定です。
AMSサービス
Session V2 Interfaceを使用してから委譲を呼び出してコールバックの登録を開始できます。次のようなものがあります。
AddAccelByteOnAMSReconnectAttemptedDelegate_HandleFAccelByteOnAMSReconnectAttemptedDelegateのラムダを作成します。
AddAccelByteOnAMSMassiveOutageEventDelegate_HandleFAccelByteOnAMSMassiveOutageEventDelegateのラムダを作成します。
- Unreal OSS
- Unity
TSharedPtr<FOnlineSessionV2AccelByte, ESPMode::ThreadSafe> SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(OnlineSubsystemAccelByte->GetSessionInterface());
if (!SessionInterface.IsValid())
{
return false;
}
FDelegateHandle ReconnectAttemptedHandle = SessionInterface->AddAccelByteOnAMSReconnectAttemptedDelegate_Handle(FAccelByteOnAMSReconnectAttemptedDelegate::CreateLambda([&](const FReconnectAttemptInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("ReconnectAttempt! AttemptCount %d, NextRetry %s"), Info.AttemptCount, *Info.NextRetryAttemptIn.ToString());
}));
FDelegateHandle MassiveOutageHandle = SessionInterface->AddAccelByteOnAMSMassiveOutageEventDelegate_Handle(FAccelByteOnAMSMassiveOutageEventDelegate::CreateLambda([&](const FMassiveOutageInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("MassiveOutage! TotalTimeoutDuration %s"), *Info.TotalTimeoutDuration.ToString());
}));
実装は近日公開予定です。
DSHubサービス
Session V2 Interfaceを使用してから委譲を呼び出してコールバックの登録を開始できます。次のようなものがあります。
AddAccelByteOnDSHubReconnectAttemptedDelegate_HandleFAccelByteOnDSHubReconnectAttemptedDelegateのラムダを作成します。
AddAccelByteOnDSHubMassiveOutageEventDelegate_HandleFAccelByteOnDSHubMassiveOutageEventDelegateのラムダを作成します。
- Unreal OSS
- Unity
TSharedPtr<FOnlineSessionV2AccelByte, ESPMode::ThreadSafe> SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(OnlineSubsystemAccelByte->GetSessionInterface());
if (!SessionInterface.IsValid())
{
return false;
}
FDelegateHandle ReconnectAttemptedHandle = SessionInterface->AddAccelByteOnDSHubReconnectAttemptedDelegate_Handle(FAccelByteOnDSHubReconnectAttemptedDelegate::CreateLambda([&](const FReconnectAttemptInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("ReconnectAttempt! AttemptCount %d, NextRetry %s"), Info.AttemptCount, *Info.NextRetryAttemptIn.ToString());
}));
FDelegateHandle MassiveOutageHandle = SessionInterface->AddAccelByteOnDSHubMassiveOutageEventDelegate_Handle(FAccelByteOnDSHubMassiveOutageEventDelegate::CreateLambda([&](const FMassiveOutageInfo& Info)
{
UE_LOG(LogTemp, Log, TEXT("MassiveOutage! TotalTimeoutDuration %s"), *Info.TotalTimeoutDuration.ToString());
}));
実装は近日公開予定です。