データストアへのリクエストは、接続性の低下やその他の問題により失敗することがあります。エラーを処理し、エラーコードを含むメッセージを返すには、データストア関数を 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()またはオーダー付きデータストアの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()またはオーダー付きデータストアの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()または順序付きデータストアのUpdateAsync()の読み取りリクエストがOrderedRead体験レベルの制限を超えました。 |
| OrderedWriteExperienceThrottled | 順序付き書き込みリクエストレートが体験の許可された最大値を超えています。 | SetAsync(), IncrementAsync(), または順序付きデータストアのUpdateAsync()の書き込みリクエストがOrderedWrite体験レベルの制限を超えました。 |
| OrderedListExperienceThrottled | 順序付きリストリクエストレートが体験の許可された最大値を超えています。 | GetSortedAsync()の順序付きデータストアへのリクエストがOrderedList体験レベルの制限を超えました。 |
| OrderedRemoveExperienceThrottled | 順序付き削除リクエストレートが体験の許可された最大値を超えています。 | RemoveAsync()のリクエストが順序付きデータストアでOrderedRemove体験レベルの制限を超えました。 |
制限
データモデルには制限があります。体験がこれらの制限を超えると、サービスは自動的に体験のデータストアの使用をスロットリングし、今後のリクエストを次のいずれかのキューに置きます:
- セット
- 古いセット
- 取得
- 古い取得
キュー内のリクエストは、受信した順に処理されます。呼び出された関数は、リクエストがまだキューにある限り、引き続き待機します。データストアキー自体がスロットリングされている場合、リクエストはキューに置かれますが、一時的にスキップされます。
各キューの制限は30リクエストです。キューの制限に達すると、リクエストは301-306の範囲内のエラーコードで失敗し、リクエストが完全にドロップされたことを示します。
アクセス制限
データストアには経験とサーバーレベルの制限の両方が適用されます。経験レベルの制限は、体験全体の同時ユーザー数に応じてスケールしますが、サーバーレベルの制限は構成可能で、クリエイターがツールとして使用することを目的としています。
経験制限
各体験には、データストアの種類、リクエストの種類、および同時ユーザー数に基づいて、一定数のデータストアリクエストが許可されています。各データストアタイプおよびリクエストタイプに対する制限は、すべてのリストされた関数の間で共有されます。
- UpdateAsync()は、読み取りおよび書き込みリクエスト予算の両方から消費されます。1回の呼び出しで両方の制限が減少します。
- ゲームサーバーとオープンクラウドは共有予算を持っています。オープンクラウドのトラフィックは、体験内での使用によってスロットリングされる可能性があります(その逆も同様です)。詳細なガイダンスについては、制御率制限を参照してください。
標準データストア
| リクエストタイプ | ゲームサーバーAPI | オープンクラウドAPI | 共有制限(1分あたりのリクエスト数) |
|---|---|---|---|
| 読み取り | 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 | 共有制限(1分あたりのリクエスト数) |
|---|---|---|---|
| 読み取り | GetAsync() UpdateAsync() | 順序付きデータストアエントリを取得 | 300 + concurrentUsers × 40 |
| 書き込み | SetAsync() IncrementAsync() UpdateAsync() | 順序付きデータストアエントリを作成、更新、増加 | 300 + concurrentUsers × 20 |
| リスト | GetSortedAsync() | 順序付きデータストアエントリをリスト | 300 + concurrentUsers × 2 |
| 削除 | RemoveAsync() | 順序付きデータストアエントリを削除 | 300 + concurrentUsers × 40 |
制御率制限
オープンクラウドとゲームサーバーのリクエストは共有されるため、それぞれが予算からどれだけ消費できるかを独立して制御することが重要です。
ゲームサーバー
個々のサーバーには、上記のように組み込みの制限があります。SetRateLimitForRequestType()とGetRequestBudgetForRequestType()を組み合わせて、個々のサーバーの総予算への貢献を詳細に制御できます。
オープンクラウド
オープンクラウドリクエストは、外部のレート制限ソリューションを必要とします。以下のアプローチのいずれかを推奨します:
- (シンプル)特に、同じAPIを連続ループで呼び出す場合、各リクエストの後に短いタイムアウトを追加します。このタイムアウトは、60 / (1分あたりの希望する予算消費)の秒数と等しくすることで上限を設定します。このアプローチは、一度にリクエストをバーストして送信することを許可しないことに注意してください。
- (堅牢)漏れバケット戦略を使用したローカルレートリミッターを実装します。
以下の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/';
// --- 操作ごとのレート制限設定(1分あたりのリクエスト数) ---
const LIST_RATE_PER_MIN = 60;
const GET_RATE_PER_MIN = 120;
const UPDATE_RATE_PER_MIN = 60;
// 操作ごとの上限間隔:60 / (1分あたりのリクエスト数)秒。
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を使用することで、クリエイターは各リクエストタイプに対して独自のデータストアのレート制限を設定できます。
APIが呼び出されない場合、次のデフォルトレート制限が適用されます:
標準データストア
| リクエストタイプ | DataStoreRequestType列挙体 | ゲームサーバーAPI | 1分あたりのリクエスト数 |
|---|---|---|---|
| 読み取り | 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 | 1分あたりのリクエスト数 |
|---|---|---|---|
| 読み取り | OrderedRead | GetAsync() 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 |
メタデータ制限
ユーザー定義メタデータの文字数制限。
| コンポーネント | 最大文字数 |
|---|---|
| キー名 | 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日間の削除処理期間中はストレージ使用量にカウントされ続け、永久に削除されるまでカウントされます。