データストアへのリクエストは、接続が不良であったり、その他の問題により失敗することがあります。エラーを処理し、エラーコードを含むメッセージを返すには、データストア関数を pcall() でラップします。
UpdateAsync() のような失敗した書き込み呼び出しは、ゲームサーバーが成功した応答を受け取らなかったことを意味します。バックエンドの書き込みが行われなかったことを常に保証するものではありません。いくつかの失敗シナリオでは、最終的な書き込み状態は、キャッシュなしでフォローアップの読み取りで確認されるまで呼び出し元には不明です。
エラーコードの参照
| エラーコード | エラー名 | エラー メッセージ | ノート | |
|---|---|---|---|---|
| 101 | KeyNameEmpty | キー名は空にできません。 | データストア関数に入力されたキーが空の文字列でないか確認してください。 | |
| 102 | KeyNameLimit | キー名が50文字の制限を超えています。 | データストア関数に入力されたキーが50文字を超えていないか確認してください。 | |
| 103 | ValueNotAllowed | DataStore に X を許可できません。 | 不正な更新関数が X 型の値を返しました。 | |
| 104 | CantStoreValue | DataStore に X を保存できません。 | 更新関数がシリアライズできない X 型の値を返しました。 | |
| 105 | ValueTooLarge | シリアライズされた値が X 制限を超えています。 | SetAsync() または UpdateAsync() で値を設定する場合、値のシリアライズされた長さは X を超えてはいけません。データのシリアライズされた長さを確認するには、JSONEncode() を使用してください。 | |
| 106 | MaxValueInvalid | MaxValue は整数でなければなりません。 | GetSortedAsync() に最大値を渡す場合、それは整数でなければなりません。 | |
| 106 | MinValueInvalid | MinValue は整数でなければなりません。 | GetSortedAsync() に最小値を渡す場合、それは整数でなければなりません。 | |
| 106 | PageSizeGreater | PageSize は事前定義された範囲内でなければなりません。 | OrderedDataStore の最小ページサイズは1です。 | |
| 106 | PageSizeLesser | PageSize は事前定義された範囲内でなければなりません。 | OrderedDataStore の最大ページサイズは100です。 | |
| 107 | MinMaxOrderInvalid | MaxValue は MinValue 以上でなければなりません。 | 最大値は GetSortedAsync() の最小値以上でなければなりません。 | |
| 301 | GetAsyncThrottle | GetAsync リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | GetAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 302 | SetAsyncThrottle | SetAsync リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | SetAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 303 | IncreAsyncThrottle | IncrementAsync リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | IncrementAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 304 | UpdateAsyncThrottle | UpdateAsync リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | UpdateAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 304 | TransformThrottle | UpdateAsync リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | UpdateAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 305 | GetSortedThrottle | GetSorted リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | GetSortedAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 306 | RemoveAsyncThrottle | RemoveAsync リクエストがドロップされました。リクエストはスロットリングされましたが、キューが満杯でした。 | RemoveAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | |
| 401 | DataModelNoAccess | リクエストが失敗しました。DataModel は体験がシャットダウンしている間はアクセスできません。 | DataModel は体験がシャットダウンしているため初期化されていません。 | |
| 402 | LuaWebSrvsNoAccess | リクエストが失敗しました。LuaWebService は体験がシャットダウンしている間はアクセスできません。 | LuaWebService は体験がシャットダウンしているため初期化されていません。 | |
| 403 | StudioAccessToApisNotAllowed | API アクセスが有効になっていないため、Studio から DataStore に書き込むことはできません。 | Studio でデータストアを使用するには、API アクセスを有効にする必要があります。 | |
| 404 | InternalError | OrderedDataStore が存在しません。 | このリクエストに関連付けられた OrderedDataStore が見つかりませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 501 | InternalError | データが破損している可能性があるため、応答を解析できません。 | サーバーはリクエストに対する応答を解析できませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 502 | RequestRejected | API サービスがエラー X でリクエストを拒否しました。 | Roblox サーバーで処理中にエラー X が発生しました。後でもう一度試してください。 | |
| 503 | InternalError | データストアリクエストは成功しましたが、キーが見つかりませんでした。 | リクエストされたキーがデータストアに見つかりませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 504 | InternalError | データストアリクエストは成功しましたが、応答が正しくフォーマットされていませんでした。 | サーバーはリクエストに対する応答を解析できませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 505 | InternalError | OrderedDataStore リクエストは成功しましたが、応答が正しくフォーマットされていませんでした。 | サーバーは OrderedDataStore リクエストに対する応答を解析できませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 509 | OperationNotAllowed | データストア操作は、データの破損を防ぐためにパーソナル RCC で実行中はブロックされています。 | プライベート RCC チャンネルではデータストアの書き込みがブロックされています。 | |
| 511 | AttributeSizeTooLarge | メタデータ属性のサイズが X 制限を超えています。 | シリアライズされたメタデータのサイズが X の制限を超えています。値 X は動的です。サイズが変更されると、値も変更されます。 | |
| 512 | UserIdLimitExceeded | UserID サイズが X 制限を超えています。 | ユーザーによって提供されたユーザー ID の配列の長さが X の制限を超えています。 | |
| 513 | AttributeFormatError | 属性 userId の形式が無効です。 | 提供されたユーザー ID は数値ではありません。 | |
| 513 | AttributeFormatError | 属性メタデータの形式が無効です。 | メタデータはテーブルではありません。 | |
| GetVersionAsyncThrottle | GetVersionAsync リクエストがドロップされました。リクエストはスロットリングされました。 | GetVersionAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | ||
| GetVersionAtTimeAsyncThrottle | GetVersionAtTimeAsync リクエストがドロップされました。リクエストはスロットリングされました。 | GetVersionAtTimeAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | ||
| ListDataStoresAsyncThrottle | ListDataStoresAsync リクエストがドロップされました。リクエストはスロットリングされました。 | ListDataStoresAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | ||
| ListKeysAsyncThrottle | ListKeysAsync リクエストがドロップされました。リクエストはスロットリングされました。 | ListKeysAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | ||
| ListVersionsAsyncThrottle | ListVersionsAsync リクエストがドロップされました。リクエストはスロットリングされました。 | ListVersionsAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | ||
| RemoveVersionAsyncThrottle | RemoveVersionAsync リクエストがドロップされました。リクエストはスロットリングされました。 | RemoveVersionAsync() リクエストが最大キューサイズを超え、Roblox は現在のスループットでリクエストを処理できません。 | ||
| InvalidTimestamp | タイムスタンプは正であり、未来の10分を超えてはいけません。 | GetVersionAtTimeAsync() に提供されたタイムスタンプは無効でした。 | ||
| StandardReadExperienceThrottled | StandardRead リクエストが体験の制限によりスロットリングされました。 | GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), または標準データストアの UpdateAsync() の読み取りが StandardRead 体験レベルのレート制限を超えました。 | ||
| StandardWriteExperienceThrottled | StandardWrite リクエストが体験の制限によりスロットリングされました。 | SetAsync(), IncrementAsync(), または標準データストアの UpdateAsync() の書き込みが StandardWrite 体験レベルのレート制限を超えました。 | ||
| StandardListExperienceThrottled | StandardList リクエストが体験の制限によりスロットリングされました。 | ListKeysAsync(), ListVersionsAsync(), または標準データストアの ListDataStoresAsync() に対するリクエストが StandardList 体験レベルのレート制限を超えました。 | ||
| StandardRemoveExperienceThrottled | StandardRemove リクエストが体験の制限によりスロットリングされました。 | 標準データストアの RemoveAsync() に対するリクエストが StandardRemove 体験レベルのレート制限を超えました。 | ||
| OrderedReadExperienceThrottled | OrderedRead リクエストが体験の制限によりスロットリングされました。 | GetAsync(), BatchGetAsync(), または順序付きデータストアの UpdateAsync() の読み取りが OrderedRead 体験レベルのレート制限を超えました。 | ||
| OrderedWriteExperienceThrottled | OrderedWrite リクエストが体験の制限によりスロットリングされました。 | SetAsync(), IncrementAsync(), または順序付きデータストアの UpdateAsync() の書き込みが OrderedWrite 体験レベルのレート制限を超えました。 | ||
| OrderedListExperienceThrottled | OrderedList リクエストが体験の制限によりスロットリングされました。 | GetSortedAsync() に対するリクエストが順序付きデータストアの OrderedList 体験レベルのレート制限を超えました。 | ||
| OrderedRemoveExperienceThrottled | OrderedRemove リクエストが体験の制限によりスロットリングされました。 | RemoveAsync() に対するリクエストが順序付きデータストアの OrderedRemove 体験レベルのレート制限を超えました。 | ||
| StandardReadGameServerThrottled | StandardRead リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), または標準データストアの UpdateAsync() の読み取りが StandardRead ゲームサーバーレベルのレート制限を超えました。 | ||
| StandardWriteGameServerThrottled | StandardWrite リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | SetAsync(), IncrementAsync(), または標準データストアの UpdateAsync() の書き込みが StandardWrite ゲームサーバーレベルのレート制限を超えました。 | ||
| StandardListGameServerThrottled | StandardList リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | ListKeysAsync(), ListVersionsAsync(), または標準データストアの ListDataStoresAsync() に対するリクエストが StandardList ゲームサーバーレベルのレート制限を超えました。 | ||
| StandardRemoveGameServerThrottled | StandardRemove リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | RemoveAsync() に対するリクエストが標準データストアの StandardRemove ゲームサーバーレベルのレート制限を超えました。 | ||
| OrderedReadGameServerThrottled | OrderedRead リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | GetAsync(), BatchGetAsync(), または順序付きデータストアの UpdateAsync() の読み取りが OrderedRead ゲームサーバーレベルのレート制限を超えました。 | ||
| OrderedWriteGameServerThrottled | OrderedWrite リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | SetAsync(), IncrementAsync(), または順序付きデータストアの UpdateAsync() の書き込みが OrderedWrite ゲームサーバーレベルのレート制限を超えました。 | ||
| OrderedListGameServerThrottled | OrderedList リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | GetSortedAsync() に対するリクエストが順序付きデータストアの OrderedList ゲームサーバーレベルのレート制限を超えました。 | ||
| OrderedRemoveGameServerThrottled | OrderedRemove リクエストがゲームサーバーの制限によりスロットリングされるか、リクエストキューが満杯でした。 | RemoveAsync() に対するリクエストが順序付きデータストアの OrderedRemove ゲームサーバーレベルのレート制限を超えました。 |
サーバーエラーコード
| エラー名 | エラー メッセージ | ノート |
|---|---|---|
| DatastoreDeleted | データストアは削除されています。 | データストアが以前に削除されたため、データストアに対する操作を実行できませんでした。 |
| DatastoreThrottled | リクエストレートが datastore の許可された最大値を超えています。 | 単一のデータストアに対して送信されたリクエストが多すぎます。 |
| InternalServerError | 内部サーバーエラーが発生しました。 | Roblox サーバーでの偶発的なエラーです。再試行してください。理想的には指数バックオフを使用してください。 |
| InvalidExclusiveStartKey | 提供された排他的開始キーが無効です。 | ListKeysAsync() のようなリスト操作に提供された排他的開始キー(カーソル)が無効です。 |
| InvalidPlace | 提供された場所が無効です。 | 場所に対する一致するユニバース ID がありません。後でもう一度試してください。 |
| InvalidTarget | 提供されたターゲットが無効です。 | 順序付きデータストアのキー名が50文字の制限を超えています。 |
| InvalidUniverse | 提供されたユニバースが無効です。 | ユニバースに対する一致するプレース ID がありません。後でもう一度試してください。 |
| InvalidUserIds | 提供されたユーザー ID の形式が無効です。 | ユーザー ID の解析に失敗しました。 |
| KeyThrottled | リクエストレートがキーの許可された最大値を超えています。 | 単一のキーに対する最大許可リクエストレートを超えています。 |
| KeyNotFound | リクエストされたキーは存在しません。 | キーは存在しません。 |
| N/A | 進むページがありません。 | 最後のページで Pages:AdvanceToNextPageAsync() を呼び出すとこのエラーが発生します。 |
| StandardReadExperienceThrottled | 標準読み取りリクエストレートが体験の許可された最大値を超えています。 | GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), または標準データストアの UpdateAsync() の読み取りが StandardRead 体験レベルのレート制限を超えました。 |
| StandardWriteExperienceThrottled | 標準書き込みリクエストレートが体験の許可された最大値を超えています。 | SetAsync(), IncrementAsync(), または標準データストアの UpdateAsync() の書き込みが StandardWrite 体験レベルのレート制限を超えました。 |
| StandardListExperienceThrottled | 標準リストリクエストレートが体験の許可された最大値を超えています。 | ListKeysAsync(), ListVersionsAsync(), または標準データストアの ListDataStoresAsync() に対するリクエストが StandardList 体験レベルのレート制限を超えました。 |
| StandardRemoveExperienceThrottled | 標準削除リクエストレートが体験の許可された最大値を超えています。 | 標準データストアの RemoveAsync() に対するリクエストが StandardRemove 体験レベルのレート制限を超えました。 |
| OrderedReadExperienceThrottled | 順序付き読み取りリクエストレートが体験の許可された最大値を超えています。 | GetAsync(), BatchGetAsync(), または順序付きデータストアの UpdateAsync() の読み取りが OrderedRead 体験レベルのレート制限を超えました。 |
| OrderedWriteExperienceThrottled | 順序付き書き込みリクエストレートが体験の許可された最大値を超えています。 | SetAsync(), IncrementAsync(), または順序付きデータストアの UpdateAsync() の書き込みが OrderedWrite 体験レベルのレート制限を超えました。 |
| OrderedListExperienceThrottled | 順序付きリストリクエストレートが体験の許可された最大値を超えています。 | GetSortedAsync() に対するリクエストが順序付きデータストアの OrderedList 体験レベルのレート制限を超えました。 |
| OrderedRemoveExperienceThrottled | 順序付き削除リクエストレートが体験の許可された最大値を超えています。 | RemoveAsync() に対するリクエストが順序付きデータストアの OrderedRemove 体験レベルのレート制限を超えました。 |
制限
データモデルには 制限 があります。体験がこれらの制限を超えると、サービスは自動的に体験のデータストアの使用をスロットリングし、将来のリクエストを次のいずれかのキューに配置します。
- セット
- 順序付きセット
- 取得
- 順序付き取得
キュー内のリクエストは、受信した順序で処理されます。呼び出された関数は、リクエストがまだキューにある限り、引き続き待機します。データストアキー自体がスロットリングされている場合、リクエストはキューに配置されますが、一時的にスキップされます。
各キューには30リクエストの制限があります。キューの制限に達すると、リクエストは301-306の範囲のエラーコードで失敗し、リクエストが完全にドロップされたことを示します。
アクセス制限
データストアは 体験およびサーバーレベルの制限 の対象です。体験レベルの制限は、体験全体の同時ユーザー数に応じてスケールし、サーバーレベルの制限は構成可能で、クリエイターがツールとして使用することを目的としています。
体験制限
各体験には、データストアの種類、リクエストの種類、および同時ユーザー数に基づいて、特定の数のデータストアリクエストが許可されています。各データストアの種類とリクエストの種類ごとに、制限はすべてのリストされた関数で共有されます。
- UpdateAsync() は、読み取りおよび書き込みリクエストの予算の両方から消費します。単一の呼び出しは両方の制限を減少させます。
- ゲームサーバーとオープンクラウドは 共有 予算を持っています。オープンクラウドのトラフィックは、体験内の使用によってスロットリングされる可能性があります(その逆も同様です)。詳細なガイダンスについては レート制限の制御 を参照してください。
標準データストア
| リクエストの種類 | ゲームサーバー API | オープンクラウド API | 共有制限(分あたりのリクエスト数) |
|---|---|---|---|
| 読み取り | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | データストアエントリを取得 | 300 + concurrentUsers × 40 |
| 書き込み | SetAsync() IncrementAsync() UpdateAsync() | データストアエントリを作成、更新、増加 | 300 + concurrentUsers × 20 |
| リスト | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | データストアのリスト、データストアエントリのリスト、データストアエントリのリビジョンのリスト | 300 + concurrentUsers × 2 |
| 削除 | RemoveAsync() | データストアエントリを削除、データストアを削除、データストアを復元 | 300 + concurrentUsers × 40 |
順序付きデータストア
| リクエストの種類 | ゲームサーバー API | オープンクラウド API | 共有制限(分あたりのリクエスト数) |
|---|---|---|---|
| 読み取り | GetAsync() BatchGetAsync() UpdateAsync() | 順序付きデータストアエントリを取得 | 300 + concurrentUsers × 40 |
| 書き込み | SetAsync() IncrementAsync() UpdateAsync() | 順序付きデータストアエントリを作成、更新、増加 | 300 + concurrentUsers × 20 |
| リスト | GetSortedAsync() | 順序付きデータストアエントリのリスト | 300 + concurrentUsers × 2 |
| 削除 | RemoveAsync() | 順序付きデータストアエントリを削除 | 300 + concurrentUsers × 40 |
レート制限の制御
オープンクラウドとゲームサーバーのリクエストは共有されるため、それぞれが予算からどれだけ消費できるかを独立して制御することが重要です。
ゲームサーバー
個々のサーバーには、上記のように組み込みの制限があります。SetRateLimitForRequestType() と GetRequestBudgetForRequestType() の組み合わせを使用して、個々のサーバーの総予算への貢献を細かく制御します。
オープンクラウド
オープンクラウドリクエストには、外部のレート制限ソリューションが必要です。以下のアプローチのいずれかをお勧めします。
- (シンプル)各リクエストの後に短いタイムアウトを追加します。特に同じ API を連続ループで呼び出す場合は、これを行います。このタイムアウトは、60 / (希望する予算消費量/分) 秒に等しく、上限として設定します。このアプローチでは、リクエストをバーストで送信することはできません。
- (堅牢)漏れバケツ戦略を使用してローカルレートリミッターを実装します。
以下の Node.js コードサンプルには、参照実装が含まれています。
const apiKey = process.env.API_KEY;
if (!apiKey) {
throw new Error('API_KEY 環境変数が設定されていません。');
}
const apiHeaderKey = 'x-api-key';
const universeId = '';
const dataStoreId = 'Inventory';
const baseUrl = 'https://apis.roblox.com/cloud/v2/';
// --- 操作ごとのレート制限設定(分あたりのリクエスト数) ---
const LIST_RATE_PER_MIN = 60;
const GET_RATE_PER_MIN = 120;
const UPDATE_RATE_PER_MIN = 60;
// 操作ごとの上限間隔: 60 / (リクエスト数/分) 秒。
const LIST_INTERVAL_MS = (60 / LIST_RATE_PER_MIN) * 1000;
const GET_INTERVAL_MS = (60 / GET_RATE_PER_MIN) * 1000;
const UPDATE_INTERVAL_MS = (60 / UPDATE_RATE_PER_MIN) * 1000;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
// リクエストを実行し、その後この操作の間隔を待機してから返します。
async function throttledFetch(url, options, intervalMs) {
const response = await fetch(url, options);
await sleep(intervalMs);
return response;
}
async function listEntries(universe, dataStore) {
const listPath = `universes/${universe}/data-stores/${dataStore}/entries`;
const url = baseUrl + listPath;
const response = await throttledFetch(url, {
headers: { [apiHeaderKey]: apiKey }
}, LIST_INTERVAL_MS);
return response.json();
}
async function getEntry(path) {
const url = baseUrl + path;
const response = await throttledFetch(url, {
headers: { [apiHeaderKey]: apiKey }
}, GET_INTERVAL_MS);
return response.json();
}
async function updateEntry(path, payload) {
const url = baseUrl + path;
const response = await throttledFetch(url, {
method: 'PATCH',
headers: {
[apiHeaderKey]: apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify(payload) // 本文は文字列でなければなりません
}, UPDATE_INTERVAL_MS);
return response;
}
(async () => {
try {
const entries = await listEntries(universeId, dataStoreId);
for (const entry of entries.dataStoreEntries) {
const path = entry.path;
console.log(`\nエントリを処理中: ${path}`);
const currentData = await getEntry(path);
currentData.value.currency += 10;
const payload = { value: currentData.value };
const updateResponse = await updateEntry(path, payload);
console.log(`ステータス: ${updateResponse.status}`);
console.log(`応答: ${await updateResponse.text()}`);
}
} catch (error) {
console.error('実行中にエラーが発生しました:', error);
}
})();サーバー制限
各サーバーには、そのサーバー内のプレイヤー数に基づいて、各リクエストタイプの構成可能なレート制限があります。サーバーは、最初に作成されたときに追加のリクエスト予算の一時的なバーストを受け取ります。GetRequestBudgetForRequestType() を使用して、現在のサーバーがいつでも行えるデータストアリクエストの数を確認します。
これらの制限は クリエイターによって構成可能 であり、SetRateLimitForRequestType() API を使用して、クリエイターは各リクエストタイプのデータストアのレート制限を構成できます。
API が呼び出されない場合、以下の デフォルトのレート制限 が適用されます。
標準データストア
| リクエストの種類 | DataStoreRequestType 列挙型 | ゲームサーバー API | 分あたりのリクエスト数 |
|---|---|---|---|
| 読み取り | StandardRead | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | 60 + numPlayers × 40 |
| 書き込み | StandardWrite | SetAsync() IncrementAsync() UpdateAsync() | 60 + numPlayers × 40 |
| リスト | StandardList | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | 5 + numPlayers × 2 |
| 削除 | StandardRemove | RemoveAsync() | 60 + numPlayers × 40 |
| RemoveVersion (非推奨) | RemoveVersionAsync | RemoveVersionAsync() | 5 + numPlayers × 2 |
順序付きデータストア
| リクエストの種類 | DataStoreRequestType 列挙型 | ゲームサーバー API | 分あたりのリクエスト数 |
|---|---|---|---|
| 読み取り | OrderedRead | GetAsync() BatchGetAsync() UpdateAsync() | 60 + numPlayers × 40 |
| 書き込み | OrderedWrite | SetAsync() IncrementAsync() UpdateAsync() | 30 + numPlayers × 5 |
| リスト | OrderedList | GetSortedAsync() | 5 + numPlayers × 2 |
| 削除 | OrderedRemove | RemoveAsync() | 30 + numPlayers × 5 |
データ制限
データストアは、エントリごとに使用できるデータの量を制限します。
データストア名、キー名、および スコープ はすべて特定の文字数制限内でなければなりません。string.len() を使用してその長さを確認してください。
データ(キー値)も、初期の型に関係なく文字列として保存されます。データのサイズは、Luau データをシリアライズされた JSON テーブルに変換する JSONEncode() 関数を使用して確認できます。
| コンポーネント | 最大文字数 |
|---|---|
| データストア名 | 50 |
| キー名 | 50 |
| スコープ | 50 |
| データ(キー値) | 4,194,304 per key |
メタデータ制限
ユーザー定義メタデータの文字数に対する制限。
| コンポーネント | 最大文字数 |
|---|---|
| キー名 | 50 |
| 値 | 250 |
| キー-値ペア | 300 |
スループット制限
キーごとのスループット制限は、Roblox サーバーでのパフォーマンスが最適であることを保証します。各制限は、体験内のすべてのサーバーにわたってすべてのキーに適用され、時間とともにリフレッシュされます。
Roblox は、キーに関連付けられたクォータの使用状況を過去60秒間調べます。使用状況がスループット制限内であれば、リクエストは承認されます。使用状況が制限を超えると、リクエストは拒否されます。
| リクエストの種類 | ゲームサーバー API | オープンクラウド API | 制限 |
|---|---|---|---|
| 読み取り | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() ListVersionsAsync() UpdateAsync() | データストアエントリを取得 | 25 MB per minute |
| 書き込み | SetAsync() IncrementAsync() UpdateAsync() RemoveAsync() | データストアエントリを作成、更新、増加、削除 | 4 MB per minute |
上記のスループット制限に加えて、Robloxは内部スキーマに基づいてデータをパーティションに整理します。その結果、バックエンドサーバーが同じデータストアへの高ボリュームのリクエストを受け取ると、さらなるスロットリングが発生する可能性があります。原因に関係なく、スロットリングは、スループット制限が単一のデータストアまたはキーに対して超過したかどうかに応じて、DatastoreThrottledまたはKeyThrottledエラーとして現れます。これらのエラーメッセージは、順序付きデータストアと標準データストアの両方に適用されます。
ストレージ制限
ストレージを安定かつスケーラブルに保つために、データストアはストレージ使用量に対してゲームレベルの制限を使用します。
この制限は、各ゲームに対する基本割り当てと、ライフタイムユーザーの数に基づく追加割り当てで構成されています。ライフタイムユーザーとは、あなたのゲームに少なくとも一度参加したユーザーのことです。
ストレージ制限は、次の式を使用して計算されます 最新バージョンのストレージ制限合計 = 500 MB + 1 MB × ライフタイムユーザー数。
ストレージ使用量は、各キーの最新バージョンの圧縮サイズを使用して測定されます。データストアはストレージ前に自動的にデータを圧縮するため、事前に圧縮することは避けてください。事前圧縮は不必要なCPUオーバーヘッドを追加し、データストアの組み込み圧縮の効果を減少させる可能性があります。未圧縮データを保存することで、Robloxの圧縮アルゴリズムや将来のスキーマベースの最適化の改善の恩恵を自動的に受けることができます。
各キーの最新バージョンのみがストレージ使用量にカウントされます。削除されたキーや置き換えられたバージョンは、保持期間中にバージョンAPIを通じてアクセス可能ですが、ストレージ使用量にはカウントされません。ただし、Open CloudのDeleteDataStoreメソッドを通じて削除されたデータストアは、永久に削除されるまでの30日間の削除処理期間中はストレージ使用量にカウントされ続けます。