SDKを使用したDS Hubの設定
Last updated on July 15, 2026
注釈:本資料はAI技術を用いて翻訳されています。
Overview
AccelByte Gaming Services(AGS)DS Hubは、The WebSocket Protocolを使用して、ゲームサーバーとバックエンドサービスの間の継続的な接続を提供します。WebSocketは、サーバーとバックエンドの間で双方向通信を可能にすることで、信頼性の高いリアルタイムデータ転送を実現します。
この記事では、AGS Game SDKを使用してDS Hubを設定する方法について説明します。
目標
この記事の目標は、AGS Game SDKを使用して以下を行う方法を示すことです。
- AGS DS Hubへの接続
- 接続イベントと切断イベントの処理
- 通知の受信
前提条件
この記事の手順を完了するには、以下が必要です。
- AGS Admin Portalへのアクセス
- ゲームサーバーにインストールされたAGS Game SDK
- DS Hubの認証情報(ゲームサーバーのデプロイ時に取得)
DS Hubへの接続
このセクションでは、ゲームサーバーをDS Hubに接続する方法を説明します。
- Unreal OSS
- Unity
FOnlineSubsystemAccelByte* AccelByteSubsystemPtr = static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
if (AccelByteSubsystemPtr == nullptr)
{
return;
}
const FOnlineSessionV2AccelBytePtr SessionInterface = StaticCastSharedPtr<FOnlineSessionV2AccelByte>(AccelByteSubsystemPtr->GetSessionInterface());
if (SessionInterface == nullptr)
{
return;
}
const FOnRegisterServerComplete OnRegisterServerComplete =
FOnRegisterServerComplete::CreateLambda([&](bool bWasSuccessful) {
bRegisterSuccess = bWasSuccessful;
bRegisterServerDone = true;
});
SessionInterface->RegisterServer(NAME_GameSession, OnRegisterServerComplete);
WaitUntil(bRegisterServerDone, TEXT("Wait until register server success ..."));
string serverId = "ds_65a24d80-0fc2-413c-b87c-1429f08edc4e";
var dsHubClient = AccelByteSDK.GetServerRegistry().GetApi().GetDsHub();
dsHubWrapper.OnConnected += () =>
{
//Do Something when this is connected
};
dsHubWrapper.Connect(serverId);
通知の受信
DS Hubは、AGSサービスからさまざまな通知を受信できます。以下では、これらの通知を受信する方法を説明します。
- Unity
- Unreal OSS
var dshubClient = AccelByteSDK.GetServerRegistry().GetApi(notifications.ApiId).GetDsHub();
// AMSサーバーのクレーム通知を受信する。ゲームサーバーはAGSサービスに対して必要なアクションを実行できます
dshubClient.MatchmakingV2ServerClaimed += (result) =>
{
if (result.IsError)
{
Debug.LogWarning($"Failed to claim DS. Error: {result.Error.Message}");
}
else
{
Debug.Log($"Success to claim DS: {result.Value}");
}
};
// Matchmaking v2のバックフィル提案を受信する。ゲームサーバーはその提案を受け入れる/拒否できます
dshubClient.MatchmakingV2BackfillProposalReceived += (result) =>
{
if (result.IsError)
{
Debug.LogWarning($"Failed to receive backfill proposal. Error: {result.Error.Message}");
}
else
{
Debug.Log($"Success to receive backfill proposal: {result.Value}");
}
};
// ゲームセッション終了通知を受信する。ゲームサーバーはAGSサービスに対して必要なアクションを実行できます
dshubClient.GameSessionV2Ended += (result) => {
if (result.IsError)
{
Debug.LogWarning($"Failed to receive game session ended notification. Error: {result.Error.Message}");
}
else
{
Debug.Log($"Success to game session ended notification: {result.Value}");
}
};
// ゲームセッションメンバー変更通知を受信する。ゲームサーバーはAGSサービスに対して必要なアクションを実行できます
dshubClient.GameSessionV2MemberChanged += (result) => {
if (result.IsError)
{
Debug.LogWarning($"Failed to receive game session ended notification. Error: {result.Error.Message}");
}
else
{
Debug.Log($"Success to receive game session member changed notification: {result.Value}");
}
};
// バインドの方法
FOnlineSubsystemAccelByte* AccelByteSubsystemPtr =
static_cast<FOnlineSubsystemAccelByte*>(IOnlineSubsystem::Get(ACCELBYTE_SUBSYSTEM));
if (AccelByteSubsystemPtr == nullptr) return;
FOnlineSessionV2AccelBytePtr SessionInterface =
StaticCastSharedPtr<FOnlineSessionV2AccelByte>(AccelByteSubsystemPtr->GetSessionInterface());
if (!SessionInterface.IsValid()) return;
// 1. 接続に失敗した場合
FDelegateHandle FailedToConnectHandle =
SessionInterface->AddAccelByteOnDSHubFailedToConnectDelegate_Handle(
FAccelByteOnDSHubFailedToConnectDelegate::CreateLambda(
[](const FString& Message)
{
UE_LOG(LogTemp, Error, TEXT("DSHub connection failed: %s"), *Message);
}
)
);
// 2. 再接続の試行
FDelegateHandle ReconnectAttemptHandle =
SessionInterface->AddAccelByteOnDSHubReconnectAttemptedDelegate_Handle(
FAccelByteOnDSHubReconnectAttemptedDelegate::CreateLambda(
[](const AccelByte::FReconnectAttemptInfo& Info)
{
UE_LOG(LogTemp, Warning, TEXT("DSHub reconnecting, attempt #%d"), Info.AttemptCount);
}
)
);
// 3. 大規模障害
FDelegateHandle MassiveOutageHandle =
SessionInterface->AddAccelByteOnDSHubMassiveOutageEventDelegate_Handle(
FAccelByteOnDSHubMassiveOutageEventDelegate::CreateLambda(
[](const AccelByte::FMassiveOutageInfo& Info)
{
UE_LOG(LogTemp, Error, TEXT("DSHub massive outage, total timeout: %s"),
*Info.TotalTimeoutDuration.ToString());
}
)
);
// クリーンアップ(重要)
// リークを防ぐため、常にバインドを解除してください。
SessionInterface->ClearAccelByteOnDSHubFailedToConnectDelegate_Handle(FailedToConnectHandle);
SessionInterface->ClearAccelByteOnDSHubReconnectAttemptedDelegate_Handle(ReconnectAttemptHandle);
SessionInterface->ClearAccelByteOnDSHubMassiveOutageEventDelegate_Handle(MassiveOutageHandle);
受信できる通知の一覧
DS Hubは、AGSサービスからさまざまな通知を受信できます。DS Hubが一般的に受信する通知は以下のとおりです(ペイロードの詳細については、各通知をクリックしてください)。
- BACKFILL_PROPOSAL — マッチメイキングのバックフィル提案。実装ガイドライン: AGS OSSでのバックフィルチケットの管理。ペイロードの詳細: サーバー通知 — BACKFILL_PROPOSAL
- BACKFILL_TICKET_EXPIRE — バックフィルチケットの期限切れ。ペイロードの詳細: サーバー通知 — BACKFILL_TICKET_EXPIRE
- serverClaimed — サーバーがセッションに割り当て/クレームされた。参照: サーバー通知 — serverClaimed
- SESSION_MEMBER_CHANGED — セッションメンバーシップの更新。参照: サーバー通知 — SESSION_MEMBER_CHANGED
- SESSION_ENDED_NOTIF — セッション終了通知。参照: サーバー通知 — SESSION_ENDED_NOTIF
- SESSION_SERVER_SECRET — セッションシークレット情報。参照: サーバー通知 — SESSION_SERVER_SECRET
- DSHUB_CONNECTED / DSHUB_DISCONNECTED — DS Hubの接続ライフサイクルイベント(接続/切断)
- AGSからのその他のセッション/パーティー/ロビー通知(詳細は下記の完全なリストを参照)
ペイロードの完全な例とサーバー通知の完全なリストについては、サーバー通知を参照してください。
ベストプラクティス
-
接続管理
- 指数バックオフを使用した再接続ロジックを実装する
- 接続タイムアウトを適切に処理する
- デバッグのために接続イベントをログに記録する
- 再接続戦略を参照: WebSocket再接続戦略
-
通知の処理
- 通知を非同期で処理する
- 処理前に通知のペイロードを検証する
- 不正な形式のメッセージに対するエラー処理を実装する
- ByteWarsゲームの実装例を参照
-
セキュリティ
- 認証情報を安全に保管する
- 初回接続にはHTTPSを使用する
- サーバー証明書を検証する
よくある問題と解決策
-
接続の失敗
- DS HubのURLと認証情報を確認する
- ネットワーク接続を確認する
- ファイアウォールの設定が適切であることを確認する
-
メッセージの処理
- 適切なJSON解析エラー処理を実装する
- 想定外のメッセージ形式を適切に処理する
- デバッグのために問題のあるメッセージをログに記録する
サーバーへの通知の送信
必要な権限:
- Private Cloudで必要な権限
ADMIN:NAMESPACE:{NAMESPACE}:DSNOTIFICATION 
管理者またはサービスは、このエンドポイントを使用して、サーバーにカスタム通知を送信できます。
レスポンスコード
このエンドポイントは、以下のHTTPステータスコードを返します。
200- 成功。通知がサーバーに正常に送信されました。404- Not Found。これは以下の場合に発生します。- 指定されたサーバー(serverId/DS ID/サーバー名)が見つからない
- サーバーがDS Hubに接続されていない
- 無効なサーバーIDが指定された
リクエストの例
curl -X POST \
https://{domain}/dshub/v1/admin/namespaces/{namespace}/servers/{serverId}/notify \
-H 'Authorization: Bearer {token}' \
-H 'Content-Type: application/json' \
-d '{
"topic": "CUSTOM_NOTIFICATION",
"payload": "{\"message\": \"test notification\"}"
}'