データストアへのリクエストは、接続の不良やその他の問題により失敗する可能性があります。エラーを処理し、エラーコードと共にメッセージを返すには、データストア関数を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は事前定義された範囲内でなければなりません。 | 最大ページサイズは1です。 | |
| 106 | PageSizeLesser | PageSizeは事前定義された範囲内でなければなりません。 | 最大ページサイズは100です。 | |
| 107 | MinMaxOrderInvalid | MaxValueはMinValue以上でなければなりません。 | 最大値は最小値以上である必要があります。GetSortedAsync()を使用する場合。 | |
| 301 | GetAsyncThrottle | GetAsyncリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | GetAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 302 | SetAsyncThrottle | SetAsyncリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | SetAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 303 | IncreAsyncThrottle | IncrementAsyncリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | IncrementAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 304 | UpdateAsyncThrottle | UpdateAsyncリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | UpdateAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 304 | TransformThrottle | UpdateAsyncリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | UpdateAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 305 | GetSortedThrottle | GetSortedリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | GetSortedAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 306 | RemoveAsyncThrottle | RemoveAsyncリクエストがドロップされました。リクエストはスロットルされましたが、キューが満杯でした。 | RemoveAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | |
| 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でリクエストを拒否しました。 | ロブロックスサーバーでの処理中にエラーXが発生しました。後でもう一度試してください。 | |
| 503 | InternalError | データストアリクエストは成功しましたが、キーが見つかりませんでした。 | リクエストされたキーはデータストアに存在しませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 504 | InternalError | データストアリクエストは成功しましたが、レスポンスのフォーマットが正しくありませんでした。 | サーバーはリクエストに対するレスポンスを解析することができませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 505 | InternalError | OrderedDataStoreのリクエストは成功しましたが、レスポンスのフォーマットが正しくありませんでした。 | サーバーはOrderedDataStoreリクエストに対するレスポンスを解析することができませんでした。これはデータの破損の兆候かもしれません。後でもう一度試してください。 | |
| 509 | OperationNotAllowed | データストア操作は、データの破損を防ぐためにPersonal RCCで実行中はブロックされています。 | プライベートRCCチャネルでのデータストア書き込みがブロックされています。 | |
| 511 | AttributeSizeTooLarge | メタデータ属性のサイズがX制限を超えています。 | シリアライズされたメタデータサイズがXの制限を超えています。値Xはダイナミックです。サイズが変わると、値も変わります。 | |
| 512 | UserIdLimitExceeded | UserIDのサイズがX制限を超えています。 | ユーザーが提供したユーザーIDの配列の長さがXの制限を超えています。 | |
| 513 | AttributeFormatError | 属性userIdのフォーマットが無効です。 | 提供されたユーザーIDが数値ではありません。 | |
| 513 | AttributeFormatError | 属性メタデータのフォーマットが無効です。 | メタデータはテーブルではありません。 | |
| GetVersionAsyncThrottle | GetVersionAsyncリクエストがドロップされました。リクエストはスロットルされました。 | GetVersionAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | ||
| GetVersionAtTimeAsyncThrottle | GetVersionAtTimeAsyncリクエストがドロップされました。リクエストはスロットルされました。 | GetVersionAtTimeAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | ||
| ListDataStoresAsyncThrottle | ListDataStoresAsyncリクエストがドロップされました。リクエストはスロットルされました。 | ListDataStoresAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | ||
| ListKeysAsyncThrottle | ListKeysAsyncリクエストがドロップされました。リクエストはスロットルされました。 | ListKeysAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | ||
| ListVersionsAsyncThrottle | ListVersionsAsyncリクエストがドロップされました。リクエストはスロットルされました。 | ListVersionsAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | ||
| RemoveVersionAsyncThrottle | RemoveVersionAsyncリクエストがドロップされました。リクエストはスロットルされました。 | RemoveVersionAsync()リクエストが最大キューサイズを超え、現在のスループットでリクエストを処理できません。 | ||
| 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 | 内部サーバーエラーが発生しました。 | ロブロックスサーバーで時折発生するエラー。再試行してください。理想的には指数バックオフを使用してください。 |
| 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()は、リードリクエストと書き込みリクエストの予算の両方から消費される点に注意してください。単一の呼び出しで両方の制限が減少します。
標準データストア
| リクエストタイプ | 関数 | リクエスト数/分 |
|---|---|---|
| 読み取り | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | 250 + 同時ユーザー × 40 |
| 書き込み | SetAsync() IncrementAsync() UpdateAsync() | 250 + 同時ユーザー × 20 |
| リスト | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | 10 + 同時ユーザー × 2 |
| 削除 | RemoveAsync() | 100 + 同時ユーザー × 40 |
順序データストア
| リクエストタイプ | 関数 | リクエスト数/分 |
|---|---|---|
| 読み取り | GetAsync() UpdateAsync() | 250 + 同時ユーザー × 40 |
| 書き込み | SetAsync() IncrementAsync() UpdateAsync() | 250 + 同時ユーザー × 20 |
| リスト | GetSortedAsync() | 100 + 同時ユーザー × 2 |
| 削除 | RemoveAsync() | 100 + 同時ユーザー × 40 |
サーバー制限
各サーバーには、プレイヤー数に基づいてリクエストタイプごとの設定可能なレート制限があります。サーバーが最初に作成されると、追加のリクエスト予算が一度だけ供給されます。現在のサーバーがいつでも作成できるデータストアリクエスト数を確認するには、GetRequestBudgetForRequestType()を使用してください。
これらの制限は、クリエイターがSetRateLimitForRequestType() APIを使用して設定できます。このAPIを使用することによって、クリエイターはリクエストタイプごとの自分のデータストアレート制限を設定できます。
APIが呼び出されない場合は、次のデフォルトレート制限が適用されます:
標準データストア
| リクエストタイプ | DataStoreRequestType Enum | 関数 | リクエスト数/分 |
|---|---|---|---|
| 読み取り | StandardRead | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | 60 + プレイヤー数 × 40 |
| 書き込み | StandardWrite | SetAsync() IncrementAsync() UpdateAsync() | 60 + プレイヤー数 × 40 |
| リスト | StandardList | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | 5 + プレイヤー数 × 2 |
| 削除 | StandardRemove | RemoveAsync() | 60 + プレイヤー数 × 40 |
| RemoveVersion (廃止) | RemoveVersionAsync | RemoveVersionAsync() | 5 + プレイヤー数 × 2 |
順序データストア
| リクエストタイプ | DataStoreRequestType Enum | 関数 | リクエスト数/分 |
|---|---|---|---|
| 読み取り | OrderedRead | GetAsync() UpdateAsync() | 60 + プレイヤー数 × 40 |
| 書き込み | OrderedWrite | SetAsync() IncrementAsync() UpdateAsync() | 30 + プレイヤー数 × 5 |
| リスト | OrderedList | GetSortedAsync() | 5 + プレイヤー数 × 2 |
| 削除 | OrderedRemove | RemoveAsync() | 30 + プレイヤー数 × 5 |
データ制限
データストアは、エントリごとにどれだけのデータを使用できるか制限しています。
データストア名、キー名、およびスコープはすべて特定の文字長に収める必要があります。string.len()を使用して長さを確認してください。
データ(キー値)も、初期型に関係なく文字列として保存されます。データのサイズは、LuauデータをシリアライズされたJSONテーブルに変換するJSONEncode()関数を使用して確認できます。
| コンポーネント | 最大文字数 |
|---|---|
| データストア名 | 50 |
| キー名 | 50 |
| スコープ | 50 |
| データ(キー値) | 4,194,304 per key |
メタデータ制限
ユーザー定義のメタデータにおける文字数の制限。
| コンポーネント | 最大文字数 |
|---|---|
| キー名 | 50 |
| 値 | 250 |
| キー-バリューペア | 300 |
スループット制限
キーごとのスループット制限は、ロブロックスサーバーでのパフォーマンスを最適に保つためのものです。各制限は、体験内のすべてのサーバーの単一のキーに適用され、時間と共に更新されます。
ロブロックスは、キーに関連付けられたクォータの使用状況を過去60秒間確認します。使用量がスループット制限内であれば、リクエストは承認されます。使用量が制限を超えた場合、リクエストは拒否されます。
| リクエストタイプ | 制限 |
|---|---|
| 読み取り | 25 MB/分 |
| 書き込み | 4 MB/分 |
上記のスループット制限に加えて、ロブロックスは内部スキーマに基づいてデータをパーティションに整理します。そのため、バックエンドサーバーが同じデータストアへの多数のリクエストを受け取ると、更なるスロットルが発生する可能性があります。原因に関係なく、スロットルは、スループット制限が単一のデータストアまたはキーのために超えた場合に、DatastoreThrottledまたはKeyThrottledエラーとして現れます。これらのエラーメッセージは、順序データストアと標準データストアの両方に適用されます。
ストレージ制限
将来的には、スケーラブルで安定したストレージ体験を提供するために、データストアはストレージ使用量につい体験レベルのストレージ制限を実装します。
この制限は、各体験のベース制限と、その体験におけるライフタイムユーザー数に基づくパーユーザー制限の合計になります。ライフタイムユーザーとは、少なくとも一度その体験に参加したユーザーのことを指します。
ストレージ制限は、次の式を使用して計算されます。Total latest version storage limit = 100 MB + 1 MB * lifetime user count。
削除または置き換えたキーは、バージョンAPIを通じてアクセス可能でも、体験のストレージ使用量にはカウントされません。ただし、Open CloudのDeleteDataStoreメソッドを通じて完全に削除されたデータストアは、30日の処理期間中ストレージ使用量にカウントし続け、永久に削除されるまで有効です。