Các yêu cầu bạn gửi đến kho dữ liệu có thể thất bại do kết nối kém hoặc các vấn đề khác. Để xử lý lỗi và trả về thông điệp với mã lỗi, hãy bọc các hàm kho dữ liệu trong pcall().
Một cuộc gọi ghi thất bại, chẳng hạn như UpdateAsync(), có nghĩa là máy chủ trò chơi không nhận được phản hồi thành công. Điều này không đảm bảo rằng việc ghi ở phía backend không xảy ra. Trong một số kịch bản thất bại, trạng thái ghi cuối cùng có thể không được biết đến bởi người gọi cho đến khi nó được xác minh bằng một lần đọc tiếp theo mà không có bộ nhớ đệm.
Tham chiếu mã lỗi
| Mã lỗi | Tên lỗi | Thông điệp lỗi | Ghi chú | |
|---|---|---|---|---|
| 101 | KeyNameEmpty | Tên khóa không thể để trống. | Kiểm tra xem khóa nhập vào hàm kho dữ liệu có phải là chuỗi rỗng không. | |
| 102 | KeyNameLimit | Tên khóa vượt quá giới hạn 50 ký tự. | Kiểm tra xem khóa nhập vào hàm kho dữ liệu có vượt quá độ dài 50 không. | |
| 103 | ValueNotAllowed | Không thể cho phép X trong DataStore. | Một hàm cập nhật không hợp lệ đã trả về một giá trị kiểu X. | |
| 104 | CantStoreValue | Không thể lưu X trong DataStore. | Hàm cập nhật đã trả về một giá trị kiểu X mà không thể tuần tự hóa. | |
| 105 | ValueTooLarge | Giá trị đã tuần tự hóa vượt quá giới hạn X. | Nếu bạn đang thiết lập một giá trị với SetAsync() hoặc UpdateAsync(), độ dài đã tuần tự hóa của giá trị không thể vượt quá kích thước X. Để kiểm tra độ dài đã tuần tự hóa của dữ liệu, hãy sử dụng JSONEncode(). | |
| 106 | MaxValueInvalid | MaxValue phải là một số nguyên. | Nếu bạn đang truyền một giá trị tối đa cho GetSortedAsync() cho một OrderedDataStore, nó phải là một số nguyên. | |
| 106 | MinValueInvalid | MinValue phải là một số nguyên. | Nếu bạn đang truyền một giá trị tối thiểu cho GetSortedAsync() cho một OrderedDataStore, nó phải là một số nguyên. | |
| 106 | PageSizeGreater | PageSize phải nằm trong một khoảng đã định nghĩa trước. | Kích thước trang tối thiểu cho một OrderedDataStore là 1. | |
| 106 | PageSizeLesser | PageSize phải nằm trong một khoảng đã định nghĩa trước. | Kích thước trang tối đa cho một OrderedDataStore là 100. | |
| 107 | MinMaxOrderInvalid | MaxValue phải lớn hơn hoặc bằng MinValue. | Giá trị tối đa phải lớn hơn hoặc bằng giá trị tối thiểu cho GetSortedAsync(). | |
| 301 | GetAsyncThrottle | Yêu cầu GetAsync đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu GetAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 302 | SetAsyncThrottle | Yêu cầu SetAsync đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu SetAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 303 | IncreAsyncThrottle | Yêu cầu IncrementAsync đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu IncrementAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 304 | UpdateAsyncThrottle | Yêu cầu UpdateAsync đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu UpdateAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 304 | TransformThrottle | Yêu cầu UpdateAsync đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu UpdateAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 305 | GetSortedThrottle | Yêu cầu GetSorted đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu GetSortedAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 306 | RemoveAsyncThrottle | Yêu cầu RemoveAsync đã bị từ chối. Yêu cầu đã bị giới hạn nhưng hàng đợi đã đầy. | Yêu cầu RemoveAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | |
| 401 | DataModelNoAccess | Yêu cầu thất bại. DataModel không thể truy cập trong khi trải nghiệm đang tắt. | DataModel chưa được khởi tạo vì trải nghiệm đang tắt. | |
| 402 | LuaWebSrvsNoAccess | Yêu cầu thất bại. LuaWebService không thể truy cập trong khi trải nghiệm đang tắt. | LuaWebService chưa được khởi tạo vì trải nghiệm đang tắt. | |
| 403 | StudioAccessToApisNotAllowed | Không thể ghi vào DataStore từ Studio vì quyền truy cập API không được bật. | Quyền truy cập API phải được kích hoạt để sử dụng kho dữ liệu trong Studio. | |
| 404 | InternalError | OrderedDataStore không tồn tại. | OrderedDataStore liên kết với yêu cầu này không được tìm thấy. Điều này có thể là dấu hiệu của sự hỏng dữ liệu. Hãy thử lại sau. | |
| 501 | InternalError | Không thể phân tích phản hồi vì dữ liệu có thể bị hỏng. | Máy chủ không thể phân tích phản hồi cho yêu cầu của bạn. Điều này có thể là dấu hiệu của sự hỏng dữ liệu. Hãy thử lại sau. | |
| 502 | RequestRejected | Dịch vụ API đã từ chối yêu cầu với lỗi X. | Lỗi X đã xảy ra khi xử lý trên các máy chủ Roblox. Hãy thử lại sau. | |
| 503 | InternalError | Yêu cầu kho dữ liệu đã thành công nhưng khóa không được tìm thấy. | Khóa được yêu cầu không được tìm thấy trong kho dữ liệu. Điều này có thể là dấu hiệu của sự hỏng dữ liệu. Hãy thử lại sau. | |
| 504 | InternalError | Yêu cầu kho dữ liệu đã thành công nhưng phản hồi không được định dạng đúng. | Máy chủ không thể phân tích phản hồi cho yêu cầu của bạn. Điều này có thể là dấu hiệu của sự hỏng dữ liệu. Hãy thử lại sau. | |
| 505 | InternalError | Yêu cầu OrderedDataStore đã thành công nhưng phản hồi không được định dạng đúng. | Máy chủ không thể phân tích phản hồi cho yêu cầu OrderedDataStore của bạn. Điều này có thể là dấu hiệu của sự hỏng dữ liệu. Hãy thử lại sau. | |
| 509 | OperationNotAllowed | Các thao tác kho dữ liệu bị chặn khi chạy trên một RCC cá nhân để ngăn ngừa sự hỏng dữ liệu có thể xảy ra. | Các ghi kho dữ liệu bị chặn trên các kênh RCC riêng tư. | |
| 511 | AttributeSizeTooLarge | Kích thước thuộc tính siêu dữ liệu vượt quá giới hạn X. | Kích thước siêu dữ liệu đã tuần tự hóa vượt quá giới hạn X. Giá trị X là động. Nếu kích thước thay đổi, giá trị cũng thay đổi. | |
| 512 | UserIdLimitExceeded | Kích thước UserID vượt quá giới hạn X. | Độ dài của mảng ID người dùng do người dùng cung cấp vượt quá giới hạn X. | |
| 513 | AttributeFormatError | Định dạng thuộc tính userId không hợp lệ. | ID người dùng được cung cấp không phải là một số. | |
| 513 | AttributeFormatError | Định dạng siêu dữ liệu thuộc tính không hợp lệ. | Siêu dữ liệu không phải là một bảng. | |
| GetVersionAsyncThrottle | Yêu cầu GetVersionAsync đã bị từ chối. Yêu cầu đã bị giới hạn. | Yêu cầu GetVersionAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | ||
| GetVersionAtTimeAsyncThrottle | Yêu cầu GetVersionAtTimeAsync đã bị từ chối. Yêu cầu đã bị giới hạn. | Yêu cầu GetVersionAtTimeAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | ||
| ListDataStoresAsyncThrottle | Yêu cầu ListDataStoresAsync đã bị từ chối. Yêu cầu đã bị giới hạn. | Yêu cầu ListDataStoresAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | ||
| ListKeysAsyncThrottle | Yêu cầu ListKeysAsync đã bị từ chối. Yêu cầu đã bị giới hạn. | Yêu cầu ListKeysAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | ||
| ListVersionsAsyncThrottle | Yêu cầu ListVersionsAsync đã bị từ chối. Yêu cầu đã bị giới hạn. | Yêu cầu ListVersionsAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | ||
| RemoveVersionAsyncThrottle | Yêu cầu RemoveVersionAsync đã bị từ chối. Yêu cầu đã bị giới hạn. | Yêu cầu RemoveVersionAsync() đã vượt quá kích thước hàng đợi tối đa và Roblox không thể xử lý các yêu cầu ở thông lượng hiện tại. | ||
| InvalidTimestamp | Thời gian phải là dương và không quá mười phút trong tương lai. | Thời gian được cung cấp cho GetVersionAtTimeAsync() không hợp lệ. | ||
| StandardReadExperienceThrottled | Yêu cầu StandardRead đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), hoặc việc đọc của UpdateAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardRead. | ||
| StandardWriteExperienceThrottled | Yêu cầu StandardWrite đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến SetAsync(), IncrementAsync(), hoặc việc ghi của UpdateAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardWrite. | ||
| StandardListExperienceThrottled | Yêu cầu StandardList đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến ListKeysAsync(), ListVersionsAsync(), hoặc ListDataStoresAsync() trên các kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardList. | ||
| StandardRemoveExperienceThrottled | Yêu cầu StandardRemove đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến RemoveAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardRemove. | ||
| OrderedReadExperienceThrottled | Yêu cầu OrderedRead đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến GetAsync(), BatchGetAsync(), hoặc việc đọc của UpdateAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedRead. | ||
| OrderedWriteExperienceThrottled | Yêu cầu OrderedWrite đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến SetAsync(), IncrementAsync(), hoặc việc ghi của UpdateAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedWrite. | ||
| OrderedListExperienceThrottled | Yêu cầu OrderedList đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến GetSortedAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedList. | ||
| OrderedRemoveExperienceThrottled | Yêu cầu OrderedRemove đã bị giới hạn bởi các giới hạn trải nghiệm. | Một yêu cầu đến RemoveAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedRemove. | ||
| StandardReadGameServerThrottled | Yêu cầu StandardRead đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), hoặc việc đọc của UpdateAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ máy chủ trò chơi StandardRead. | ||
| StandardWriteGameServerThrottled | Yêu cầu StandardWrite đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến SetAsync(), IncrementAsync(), hoặc việc ghi của UpdateAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ máy chủ trò chơi StandardWrite. | ||
| StandardListGameServerThrottled | Yêu cầu StandardList đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến ListKeysAsync(), ListVersionsAsync(), hoặc ListDataStoresAsync() trên các kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ máy chủ trò chơi StandardList. | ||
| StandardRemoveGameServerThrottled | Yêu cầu StandardRemove đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến RemoveAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ máy chủ trò chơi StandardRemove. | ||
| OrderedReadGameServerThrottled | Yêu cầu OrderedRead đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến GetAsync(), BatchGetAsync(), hoặc việc đọc của UpdateAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ máy chủ trò chơi OrderedRead. | ||
| OrderedWriteGameServerThrottled | Yêu cầu OrderedWrite đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến SetAsync(), IncrementAsync(), hoặc việc ghi của UpdateAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ máy chủ trò chơi OrderedWrite. | ||
| OrderedListGameServerThrottled | Yêu cầu OrderedList đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến GetSortedAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ máy chủ trò chơi OrderedList. | ||
| OrderedRemoveGameServerThrottled | Yêu cầu OrderedRemove đã bị giới hạn bởi các giới hạn máy chủ trò chơi hoặc hàng đợi yêu cầu đã đầy. | Một yêu cầu đến RemoveAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ máy chủ trò chơi OrderedRemove. |
Mã lỗi máy chủ
| Tên lỗi | Thông điệp lỗi | Ghi chú |
|---|---|---|
| DatastoreDeleted | Kho dữ liệu đã bị xóa. | Một thao tác trên kho dữ liệu không thể xảy ra vì kho dữ liệu đã bị xóa trước đó. |
| DatastoreThrottled | Tốc độ yêu cầu vượt quá giới hạn tối đa cho datastore. | Quá nhiều yêu cầu đã được gửi đến một kho dữ liệu duy nhất. |
| InternalServerError | Đã xảy ra lỗi máy chủ nội bộ. | Lỗi thỉnh thoảng trên các máy chủ Roblox. Hãy thử lại, tốt nhất là với thời gian chờ tăng dần. |
| InvalidExclusiveStartKey | Khóa bắt đầu độc quyền được cung cấp không hợp lệ. | Khóa bắt đầu độc quyền (con trỏ) được cung cấp cho một thao tác danh sách như ListKeysAsync() không hợp lệ. |
| InvalidPlace | Địa điểm được cung cấp không hợp lệ. | Không có ID Vũ trụ nào khớp với địa điểm. Hãy thử lại sau. |
| InvalidTarget | Mục tiêu được cung cấp không hợp lệ. | Tên khóa kho dữ liệu có thứ tự vượt quá giới hạn 50 ký tự. |
| InvalidUniverse | Vũ trụ được cung cấp không hợp lệ. | Không có ID Địa điểm nào khớp với vũ trụ. Hãy thử lại sau. |
| InvalidUserIds | ID người dùng được cung cấp có định dạng không hợp lệ. | Không thể phân tích ID người dùng. |
| KeyThrottled | Tốc độ yêu cầu vượt quá giới hạn tối đa cho khóa. | Tốc độ yêu cầu vượt quá tốc độ yêu cầu tối đa cho một khóa duy nhất. |
| KeyNotFound | Khóa được yêu cầu không tồn tại. | Khóa không tồn tại. |
| N/A | Không có trang nào để tiến tới. | Lỗi này xảy ra khi bạn gọi Pages:AdvanceToNextPageAsync() trên trang cuối cùng. |
| StandardReadExperienceThrottled | Tốc độ yêu cầu đọc tiêu chuẩn vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), hoặc việc đọc của UpdateAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardRead. |
| StandardWriteExperienceThrottled | Tốc độ yêu cầu ghi tiêu chuẩn vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến SetAsync(), IncrementAsync(), hoặc việc ghi của UpdateAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardWrite. |
| StandardListExperienceThrottled | Tốc độ yêu cầu danh sách tiêu chuẩn vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến ListKeysAsync(), ListVersionsAsync(), hoặc ListDataStoresAsync() trên các kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardList. |
| StandardRemoveExperienceThrottled | Tốc độ yêu cầu xóa tiêu chuẩn vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến RemoveAsync() trên một kho dữ liệu tiêu chuẩn đã vượt quá giới hạn tỷ lệ trải nghiệm StandardRemove. |
| OrderedReadExperienceThrottled | Tốc độ yêu cầu đọc có thứ tự vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến GetAsync(), BatchGetAsync(), hoặc việc đọc của UpdateAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedRead. |
| OrderedWriteExperienceThrottled | Tốc độ yêu cầu ghi có thứ tự vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến SetAsync(), IncrementAsync(), hoặc việc ghi của UpdateAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedWrite. |
| OrderedListExperienceThrottled | Tốc độ yêu cầu danh sách có thứ tự vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến GetSortedAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedList. |
| OrderedRemoveExperienceThrottled | Tốc độ yêu cầu xóa có thứ tự vượt quá giới hạn tối đa cho trải nghiệm. | Một yêu cầu đến RemoveAsync() trên một kho dữ liệu có thứ tự đã vượt quá giới hạn tỷ lệ trải nghiệm OrderedRemove. |
Giới hạn
Các mô hình dữ liệu có giới hạn. Nếu một trải nghiệm vượt quá những giới hạn này, dịch vụ sẽ tự động giới hạn việc sử dụng kho dữ liệu của trải nghiệm và khiến các yêu cầu trong tương lai được đặt vào một trong các hàng đợi sau:
- Đặt
- Đặt có thứ tự
- Lấy
- Lấy có thứ tự
Các yêu cầu trong một hàng đợi được xử lý theo thứ tự mà chúng được nhận. Hàm được gọi tiếp tục chờ miễn là yêu cầu của nó vẫn đang trong hàng đợi. Nếu chính khóa kho dữ liệu bị giới hạn, yêu cầu sẽ được đặt vào hàng đợi nhưng sẽ tạm thời bị bỏ qua.
Mỗi hàng đợi có giới hạn 30 yêu cầu. Khi giới hạn của một hàng đợi được đạt, các yêu cầu sẽ thất bại với mã lỗi trong khoảng 301-306, cho thấy rằng các yêu cầu đã bị từ chối hoàn toàn.
Giới hạn truy cập
Các kho dữ liệu phải tuân theo cả giới hạn trải nghiệm và giới hạn máy chủ. Các giới hạn cấp trải nghiệm tăng theo tổng số người dùng đồng thời trên toàn trải nghiệm, trong khi các giới hạn cấp máy chủ có thể cấu hình và được sử dụng như một công cụ bởi người tạo.
Giới hạn trải nghiệm
Mỗi trải nghiệm được phép một số lượng yêu cầu kho dữ liệu nhất định dựa trên loại kho dữ liệu, loại yêu cầu và số lượng người dùng đồng thời. Đối với mỗi loại kho dữ liệu và loại yêu cầu, giới hạn được chia sẻ giữa tất cả các hàm được liệt kê.
- UpdateAsync() tiêu thụ từ cả ngân sách yêu cầu đọc và ghi. Một cuộc gọi đơn lẻ sẽ giảm cả hai giới hạn.
- Máy chủ trò chơi và Open Cloud chia sẻ một ngân sách; lưu lượng Open Cloud có thể bị giới hạn bởi việc sử dụng trong trải nghiệm (và ngược lại). Xem Kiểm soát giới hạn tỷ lệ để biết thêm hướng dẫn.
Các kho dữ liệu tiêu chuẩn
| Loại yêu cầu | API máy chủ trò chơi | API Open Cloud | Giới hạn chia sẻ (yêu cầu mỗi phút) |
|---|---|---|---|
| Đọc | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | Lấy mục kho dữ liệu | 300 + người dùng đồng thời × 40 |
| Ghi | SetAsync() IncrementAsync() UpdateAsync() | Tạo, Cập nhật, Tăng mục kho dữ liệu | 300 + người dùng đồng thời × 20 |
| Danh sách | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | Danh sách các kho dữ liệu, Danh sách các mục kho dữ liệu, Danh sách các phiên bản mục kho dữ liệu | 300 + người dùng đồng thời × 2 |
| Xóa | RemoveAsync() | Xóa mục kho dữ liệu, Xóa kho dữ liệu, Khôi phục kho dữ liệu | 300 + người dùng đồng thời × 40 |
Các kho dữ liệu có thứ tự
| Loại yêu cầu | API máy chủ trò chơi | API Open Cloud | Giới hạn chia sẻ (yêu cầu mỗi phút) |
|---|---|---|---|
| Đọc | GetAsync() BatchGetAsync() UpdateAsync() | Lấy mục kho dữ liệu có thứ tự | 300 + người dùng đồng thời × 40 |
| Ghi | SetAsync() IncrementAsync() UpdateAsync() | Tạo, Cập nhật, Tăng mục kho dữ liệu có thứ tự | 300 + người dùng đồng thời × 20 |
| Danh sách | GetSortedAsync() | Danh sách các mục kho dữ liệu có thứ tự | 300 + người dùng đồng thời × 2 |
| Xóa | RemoveAsync() | Xóa mục kho dữ liệu có thứ tự | 300 + người dùng đồng thời × 40 |
Kiểm soát giới hạn tỷ lệ
Vì các yêu cầu Open Cloud và máy chủ trò chơi được chia sẻ, nên điều quan trọng là kiểm soát độc lập mức tiêu thụ của mỗi loại.
Máy chủ trò chơi
Các máy chủ riêng lẻ có giới hạn tích hợp, như đã mô tả ở trên. Sử dụng sự kết hợp của SetRateLimitForRequestType() và GetRequestBudgetForRequestType() để duy trì kiểm soát chi tiết về sự đóng góp của từng máy chủ vào ngân sách tổng.
Open Cloud
Các yêu cầu Open Cloud yêu cầu một giải pháp giới hạn tỷ lệ bên ngoài. Chúng tôi khuyên bạn nên sử dụng một trong các phương pháp sau:
- (Đơn giản) Thêm một thời gian chờ ngắn sau mỗi yêu cầu, đặc biệt nếu gọi cùng một API trong một vòng lặp liên tục. Đặt thời gian chờ này bằng 60 / (mức tiêu thụ ngân sách mong muốn mỗi phút) giây, như một giới hạn trên. Lưu ý rằng phương pháp này không cho phép gửi yêu cầu theo từng đợt.
- (Chắc chắn) Triển khai một bộ giới hạn tỷ lệ cục bộ sử dụng chiến lược thùng rò rỉ.
Các mẫu mã Node.js sau đây bao gồm các triển khai tham khảo.
const apiKey = process.env.API_KEY;
if (!apiKey) {
throw new Error('Biến môi trường API_KEY chưa được thiết lập.');
}
const apiHeaderKey = 'x-api-key';
const universeId = '';
const dataStoreId = 'Inventory';
const baseUrl = 'https://apis.roblox.com/cloud/v2/';
// --- Cấu hình giới hạn tỷ lệ theo từng thao tác (yêu cầu mỗi phút) ---
const LIST_RATE_PER_MIN = 60;
const GET_RATE_PER_MIN = 120;
const UPDATE_RATE_PER_MIN = 60;
// Khoảng cách tối đa cho mỗi thao tác: 60 / (yêu cầu mỗi phút) giây.
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));
// Thực hiện yêu cầu, sau đó chờ khoảng thời gian của thao tác này trước khi trả về.
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) // Nội dung phải là một chuỗi
}, 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Đang xử lý mục: ${path}`);
const currentData = await getEntry(path);
currentData.value.currency += 10;
const payload = { value: currentData.value };
const updateResponse = await updateEntry(path, payload);
console.log(`Trạng thái: ${updateResponse.status}`);
console.log(`Phản hồi: ${await updateResponse.text()}`);
}
} catch (error) {
console.error('Đã xảy ra lỗi trong quá trình thực hiện:', error);
}
})();Giới hạn máy chủ
Mỗi máy chủ có một giới hạn tỷ lệ có thể cấu hình cho mỗi loại yêu cầu, dựa trên số lượng người chơi trong máy chủ đó. Các máy chủ nhận được một đợt khởi động một lần với ngân sách yêu cầu bổ sung khi chúng được tạo lần đầu. Sử dụng GetRequestBudgetForRequestType() để xác nhận số lượng yêu cầu kho dữ liệu mà máy chủ hiện tại có thể thực hiện tại bất kỳ thời điểm nào.
Các giới hạn này có thể cấu hình bởi người tạo bằng cách sử dụng API SetRateLimitForRequestType(). Sử dụng API này, một người tạo có thể cấu hình giới hạn tỷ lệ kho dữ liệu của riêng họ cho mỗi loại yêu cầu.
Các giới hạn tỷ lệ mặc định sau đây áp dụng nếu API không được gọi:
Các kho dữ liệu tiêu chuẩn
| Loại yêu cầu | DataStoreRequestType Enum | API máy chủ trò chơi | Yêu cầu mỗi phút |
|---|---|---|---|
| Đọc | StandardRead | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | 60 + số người chơi × 40 |
| Ghi | StandardWrite | SetAsync() IncrementAsync() UpdateAsync() | 60 + số người chơi × 40 |
| Danh sách | StandardList | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | 5 + số người chơi × 2 |
| Xóa | StandardRemove | RemoveAsync() | 60 + số người chơi × 40 |
| Xóa phiên bản (Đã ngừng sử dụng) | RemoveVersionAsync | RemoveVersionAsync() | 5 + số người chơi × 2 |
Các kho dữ liệu có thứ tự
| Loại yêu cầu | DataStoreRequestType Enum | API máy chủ trò chơi | Yêu cầu mỗi phút |
|---|---|---|---|
| Đọc | OrderedRead | GetAsync() BatchGetAsync() UpdateAsync() | 60 + số người chơi × 40 |
| Ghi | OrderedWrite | SetAsync() IncrementAsync() UpdateAsync() | 30 + số người chơi × 5 |
| Danh sách | OrderedList | GetSortedAsync() | 5 + số người chơi × 2 |
| Xóa | OrderedRemove | RemoveAsync() | 30 + số người chơi × 5 |
Giới hạn dữ liệu
Các kho dữ liệu giới hạn lượng dữ liệu có thể được sử dụng cho mỗi mục.
Tên kho dữ liệu, tên khóa và phạm vi phải đều dưới một độ dài ký tự nhất định. Sử dụng string.len() để kiểm tra độ dài của chúng.
Dữ liệu (giá trị khóa) cũng được lưu trữ dưới dạng chuỗi, bất kể kiểu ban đầu của nó. Bạn có thể kiểm tra kích thước của dữ liệu bằng cách sử dụng hàm JSONEncode(), hàm này chuyển đổi dữ liệu Luau thành một bảng JSON đã tuần tự hóa.
| Thành phần | Số ký tự tối đa |
|---|---|
| Tên kho dữ liệu | 50 |
| Tên khóa | 50 |
| Phạm vi | 50 |
| Dữ liệu (giá trị khóa) | 4,194,304 cho mỗi khóa |
Giới hạn siêu dữ liệu
Giới hạn số ký tự trong siêu dữ liệu do người dùng định nghĩa.
| Thành phần | Số ký tự tối đa |
|---|---|
| Tên khóa | 50 |
| Giá trị | 250 |
| Cặp khóa-giá trị | 300 |
Giới hạn thông lượng
Giới hạn thông lượng theo khóa đảm bảo rằng hiệu suất là tối ưu trên các máy chủ Roblox. Mỗi giới hạn áp dụng cho từng khóa duy nhất trên tất cả các máy chủ trong một trải nghiệm và được làm mới theo thời gian.
Roblox xem xét việc sử dụng hạn ngạch liên quan đến khóa trong 60 giây qua. Nếu việc sử dụng, bao gồm cả yêu cầu hiện tại, nằm trong giới hạn thông lượng, yêu cầu sẽ được chấp thuận. Nếu việc sử dụng vượt quá giới hạn, yêu cầu sẽ bị từ chối.
| Loại yêu cầu | API máy chủ trò chơi | API Open Cloud | Giới hạn |
|---|---|---|---|
| Đọc | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() ListVersionsAsync() UpdateAsync() | Lấy mục kho dữ liệu | 25 MB mỗi phút |
| Ghi | SetAsync() IncrementAsync() UpdateAsync() RemoveAsync() | Tạo, Cập nhật, Tăng, Xóa mục kho dữ liệu | 4 MB mỗi phút |
Ngoài các giới hạn thông lượng trên, Roblox tổ chức dữ liệu thành các phân vùng dựa trên một sơ đồ nội bộ. Do đó, khi máy chủ backend nhận được một khối lượng yêu cầu cao đến cùng một kho dữ liệu, điều này có thể dẫn đến việc giới hạn thêm. Bất kể nguyên nhân, việc giới hạn sẽ xuất hiện dưới dạng lỗi DatastoreThrottled hoặc KeyThrottled, tùy thuộc vào việc giới hạn thông lượng đã bị vượt quá cho một kho dữ liệu duy nhất hay một khóa. Các thông điệp lỗi này áp dụng cho cả kho dữ liệu có thứ tự và tiêu chuẩn.
Giới hạn lưu trữ
Để giữ cho lưu trữ ổn định và có thể mở rộng, các kho dữ liệu sử dụng một giới hạn cấp trò chơi cho việc sử dụng lưu trữ của bạn.
Giới hạn này bao gồm một phân bổ cơ bản cho mỗi trò chơi cộng với một phân bổ bổ sung dựa trên số lượng người dùng trọn đời. Một người dùng trọn đời là bất kỳ người dùng nào đã tham gia trò chơi của bạn ít nhất một lần.
Giới hạn lưu trữ được tính bằng công thức sau Giới hạn lưu trữ phiên bản mới nhất tổng = 500 MB + 1 MB × số lượng người dùng trọn đời.
Việc sử dụng lưu trữ được đo bằng kích thước nén của phiên bản mới nhất của mỗi khóa. Các kho dữ liệu tự động nén dữ liệu của bạn trước khi lưu trữ, vì vậy hãy tránh việc nén trước. Việc nén trước sẽ thêm tải CPU không cần thiết và có thể làm giảm hiệu quả của việc nén tích hợp của các kho dữ liệu. Bằng cách lưu trữ dữ liệu không nén, bạn tự động hưởng lợi từ những cải tiến trong các thuật toán nén của Roblox và các tối ưu hóa dựa trên sơ đồ trong tương lai.
Chỉ phiên bản mới nhất của mỗi khóa được tính vào việc sử dụng lưu trữ của bạn. Các khóa đã bị xóa và các phiên bản đã thay thế, trong khi vẫn có thể truy cập thông qua các API phiên bản trong thời gian giữ của chúng, không được tính vào việc sử dụng lưu trữ của bạn. Tuy nhiên, các kho dữ liệu bị xóa thông qua phương thức Open Cloud DeleteDataStore vẫn tiếp tục được tính vào việc sử dụng lưu trữ trong thời gian xử lý xóa 30 ngày của chúng, cho đến khi chúng được xóa vĩnh viễn.