メインコンテンツまでスキップ

WebSocket再接続戦略

Last updated on February 4, 2026

注釈:本資料はAI技術を用いて翻訳されています。

概要

AccelByte Gaming Services(AGS)Game SDKを使用すると、ゲーム開発者は特定のニーズに基づいた戦略でWebSocket再接続を実装できます。この戦略は、Lobby、Chat、AMS、DSHubを含むすべてのWebSocketサービスに適用されます。戦略のデフォルトの推奨設定はすでに設定されており、ゲームレベルのコード内で構成を更新できます。

以下に、提供されるさまざまな戦略について詳しく説明します。

BALANCEDAGGRESSIVELIMITLESS
指定されたタイムアウト期間まで、バランスの取れた再試行間隔で再接続を試みます。指定されたタイムアウト期間まで、積極的な再試行間隔で再接続を試みます。接続が確立されるまで常に再接続を試みます。
デフォルトの再接続遅延パターン:
- 初期バックオフ遅延: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_GAMECLIENTCHAT_GAMECLIENTDS_HUB_GAMESERVERAMS_GAMESERVERなどの値が含まれます。

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秒です。
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秒です。
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秒です。
FReconnectionStrategy::FInitialBackoffDelay InitialBackoffDelay = FReconnectionStrategy::FInitialBackoffDelay(
FTimespan::FromSeconds(120.0f)
);
FReconnectionStrategy LimitlessReconnectStrategy = FReconnectionStrategy::CreateLimitlessStrategy(
InitialBackoffDelay
);

バックオフメカニズムのベース係数の更新

ニーズに基づいて、バックオフメカニズムのベース係数を設定または更新できます。ベース係数を4秒に設定すると、再接続遅延パターンは次のようになります。

~1、~4、~16、~64、…

constexpr uint32 BASE_FACTOR = 4;
auto BalancedStrategy = FReconnectionStrategy::CreateBalancedStrategy();
BalancedStrategy.SetBackoffMechanism(BASE_FACTOR);

デフォルトの再接続戦略の設定

再接続戦略の作成後、デフォルトの戦略を設定できます。作成したLobbyWebsocketConfiguration変数を使用して、SetDefaultReconnectionStrategy関数を呼び出すことができます。関数パラメータは、以前に作成した再接続戦略(バランスの取れた、積極的な、または無制限の戦略のいずれか)である必要があります。

バランスの取れた再接続戦略の設定:

LobbyWebsocketConfiguration.GetValue()->SetDefaultReconnectionStrategy(BalancedReconnectStrategy);

積極的な戦略の設定:

LobbyWebsocketConfiguration.GetValue()->SetDefaultReconnectionStrategy(AggressiveReconnectStrategy);

無制限の戦略の設定:

LobbyWebsocketConfiguration.GetValue()->SetDefaultReconnectionStrategy(LimitlessReconnectStrategy);

特定の再接続戦略の設定

さまざまな対象切断クロージャータイプに対して再接続戦略を指定することもできます。SetSpecificReconnectionStrategy関数を使用してこれを設定できます。関数パラメータには、次のようなWebSocketクロージャーコードも含まれます。

  • ClosedAbnormally - WebSocket開示コード1006
  • DisconnectServerShutdown - WebSocket開示コード4000
LobbyWebsocketConfiguration.GetValue()->SetSpecificReconnectionStrategy(
AccelByte::EWebsocketClosureCodeForSpecificRetry::ClosedAbnormally, //1006 code
AggressiveReconnectStrategy
);
LobbyWebsocketConfiguration.GetValue()->SetSpecificReconnectionStrategy(
AccelByte::EWebsocketClosureCodeForSpecificRetry::DisconnectServerShutdown, //4000 code
LimitlessReconnectStrategy
);

大規模障害期間の更新

大規模障害の期間を指定できます。これは、さまざまなニーズのためにコールバックを通知し、追加情報を提供するために使用されます。大規模障害のコールバックは、再接続試行がまだ消耗していない場合、またはまだあきらめていない場合にのみ受信されます。

大規模障害の秒数を40に設定すると、再接続試行が消耗していない場合、40秒ごとに大規模障害のコールバックが通知されます。コールバック委譲の概要については、再接続戦略のコールバック委譲の設定セクションを参照してください。

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のラムダを作成します。
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のラムダを作成します。
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_Handle
    • FAccelByteOnAMSReconnectAttemptedDelegateのラムダを作成します。
  • AddAccelByteOnAMSMassiveOutageEventDelegate_Handle
    • FAccelByteOnAMSMassiveOutageEventDelegateのラムダを作成します。
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_Handle
    • FAccelByteOnDSHubReconnectAttemptedDelegateのラムダを作成します。
  • AddAccelByteOnDSHubMassiveOutageEventDelegate_Handle
    • FAccelByteOnDSHubMassiveOutageEventDelegateのラムダを作成します。
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());
}));