คำขอที่คุณทำไปยัง data stores อาจล้มเหลวเนื่องจากการเชื่อมต่อที่ไม่ดีหรือปัญหาอื่น ๆ เพื่อจัดการกับข้อผิดพลาดและส่งคืนข้อความที่มีรหัสข้อผิดพลาด ให้ห่อฟังก์ชัน data store ใน pcall()
การเรียกเขียนที่ล้มเหลว เช่น UpdateAsync() หมายความว่าเซิร์ฟเวอร์เกมไม่ได้รับการตอบสนองที่สำเร็จ มันไม่ได้รับประกันเสมอไปว่าการเขียนเบื้องหลังไม่เกิดขึ้น ในบางสถานการณ์ที่ล้มเหลว สถานะการเขียนสุดท้ายอาจไม่เป็นที่รู้จักสำหรับผู้เรียกจนกว่าจะได้รับการตรวจสอบด้วยการอ่านตามมาโดยไม่มีแคช
การอ้างอิงรหัสข้อผิดพลาด
| รหัสข้อผิดพลาด | ชื่อข้อผิดพลาด | ข้อความข้อผิดพลาด | หมายเหตุ | |
|---|---|---|---|---|
| 101 | KeyNameEmpty | ชื่อคีย์ไม่สามารถว่างเปล่าได้ | ตรวจสอบว่าคีย์ที่ป้อนเข้าไปในฟังก์ชัน data store เป็นสตริงว่างหรือไม่ | |
| 102 | KeyNameLimit | ชื่อคีย์เกินขีดจำกัด 50 ตัวอักษร | ตรวจสอบว่าคีย์ที่ป้อนเข้าไปในฟังก์ชัน data store เกินความยาว 50 หรือไม่ | |
| 103 | ValueNotAllowed | ไม่สามารถอนุญาต X ใน DataStore | ฟังก์ชันอัปเดตที่ไม่ดีคืนค่าชนิด X | |
| 104 | CantStoreValue | ไม่สามารถจัดเก็บ X ใน DataStore | ฟังก์ชันอัปเดตคืนค่าชนิด X ที่ไม่สามารถ serialize ได้ | |
| 105 | ValueTooLarge | ค่าที่ serialize เกินขีดจำกัด X | หากคุณกำลังตั้งค่าค่าด้วย SetAsync() หรือ UpdateAsync() ความยาวที่ serialize ของค่าไม่สามารถเกินขนาด X ได้ หากต้องการตรวจสอบความยาวที่ serialize ของข้อมูล ให้ใช้ JSONEncode() | |
| 106 | MaxValueInvalid | MaxValue ต้องเป็นจำนวนเต็ม | หากคุณกำลังส่งค่าขั้นสูงสุดไปยัง GetSortedAsync() สำหรับ OrderedDataStore มันต้องเป็นจำนวนเต็ม | |
| 106 | MinValueInvalid | MinValue ต้องเป็นจำนวนเต็ม | หากคุณกำลังส่งค่าขั้นต่ำไปยัง GetSortedAsync() สำหรับ OrderedDataStore มันต้องเป็นจำนวนเต็ม | |
| 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 | ไม่สามารถเขียนไปยัง DataStore จาก Studio ได้เพราะไม่ได้เปิดใช้งานการเข้าถึง API | การเข้าถึง API ต้องทำงานอยู่จึงจะใช้ data stores ใน Studio ได้ | |
| 404 | InternalError | OrderedDataStore ไม่มีอยู่ | OrderedDataStore ที่เกี่ยวข้องกับคำขอนี้ไม่พบ นี่อาจเป็นสัญญาณของความเสียหายของข้อมูล ลองอีกครั้งในภายหลัง | |
| 501 | InternalError | ไม่สามารถแยกวิเคราะห์การตอบสนองได้เพราะข้อมูลอาจเสียหาย | เซิร์ฟเวอร์ไม่สามารถแยกวิเคราะห์การตอบสนองต่อคำขอของคุณ นี่อาจเป็นสัญญาณของความเสียหายของข้อมูล ลองอีกครั้งในภายหลัง | |
| 502 | RequestRejected | API Services ปฏิเสธคำขอพร้อมรหัสข้อผิดพลาด X | รหัสข้อผิดพลาด X เกิดขึ้นเมื่อประมวลผลบนเซิร์ฟเวอร์ Roblox ลองอีกครั้งในภายหลัง | |
| 503 | InternalError | คำขอ data store สำเร็จแต่ไม่พบคีย์ | คีย์ที่ร้องขอไม่พบใน data store นี่อาจเป็นสัญญาณของความเสียหายของข้อมูล ลองอีกครั้งในภายหลัง | |
| 504 | InternalError | คำขอ data store สำเร็จแต่การตอบสนองไม่ได้จัดรูปแบบอย่างถูกต้อง | เซิร์ฟเวอร์ไม่สามารถแยกวิเคราะห์การตอบสนองต่อคำขอของคุณ นี่อาจเป็นสัญญาณของความเสียหายของข้อมูล ลองอีกครั้งในภายหลัง | |
| 505 | InternalError | คำขอ OrderedDataStore สำเร็จแต่การตอบสนองไม่ได้จัดรูปแบบอย่างถูกต้อง | เซิร์ฟเวอร์ไม่สามารถแยกวิเคราะห์การตอบสนองต่อคำขอ OrderedDataStore ของคุณ นี่อาจเป็นสัญญาณของความเสียหายของข้อมูล ลองอีกครั้งในภายหลัง | |
| 509 | OperationNotAllowed | การดำเนินการ data store ถูกบล็อกขณะทำงานใน Personal RCC เพื่อป้องกันความเสียหายของข้อมูลที่อาจเกิดขึ้น | การเขียน data store ถูกบล็อกในช่องทาง RCC ส่วนตัว | |
| 511 | AttributeSizeTooLarge | ขนาดคุณลักษณะ metadata เกินขีดจำกัด X | ขนาด metadata ที่ serialize เกินขีดจำกัดของ X ค่าดังกล่าว X มีการเปลี่ยนแปลง หากขนาดเปลี่ยนแปลง ค่าก็เปลี่ยนแปลง | |
| 512 | UserIdLimitExceeded | ขนาด UserID เกินขีดจำกัด X | ความยาวของอาร์เรย์ user IDs ที่ผู้ใช้ให้มาเกินขีดจำกัด X | |
| 513 | AttributeFormatError | รูปแบบคุณลักษณะ userId ไม่ถูกต้อง | หมายเลข user ID ที่ให้มาไม่ใช่หมายเลข | |
| 513 | AttributeFormatError | รูปแบบ metadata ของคุณลักษณะไม่ถูกต้อง | metadata ไม่ใช่ตาราง | |
| 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 | Timestamp ต้องเป็นบวกและไม่เกินสิบในอนาคต | timestamp ที่ให้มาสำหรับ GetVersionAtTimeAsync() ไม่ถูกต้อง | ||
| StandardReadExperienceThrottled | StandardRead คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), หรือการอ่านของ UpdateAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับการใช้งาน StandardRead | ||
| StandardWriteExperienceThrottled | StandardWrite คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับการใช้งาน StandardWrite | ||
| StandardListExperienceThrottled | StandardList คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง ListKeysAsync(), ListVersionsAsync(), หรือ ListDataStoresAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับการใช้งาน StandardList | ||
| StandardRemoveExperienceThrottled | StandardRemove คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง RemoveAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับการใช้งาน StandardRemove | ||
| OrderedReadExperienceThrottled | OrderedRead คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง GetAsync() หรือการอ่านจาก UpdateAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับการใช้งาน OrderedRead | ||
| OrderedWriteExperienceThrottled | OrderedWrite คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับการใช้งาน OrderedWrite | ||
| OrderedListExperienceThrottled | OrderedList คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง GetSortedAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับการใช้งาน OrderedList | ||
| OrderedRemoveExperienceThrottled | OrderedRemove คำขอถูกจำกัดโดยข้อกำหนดประสบการณ์ | คำขอไปยัง RemoveAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับการใช้งาน OrderedRemove | ||
| StandardReadGameServerThrottled | StandardRead คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), หรือการอ่านของ UpdateAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม StandardRead | ||
| StandardWriteGameServerThrottled | StandardWrite คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม StandardWrite | ||
| StandardListGameServerThrottled | StandardList คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง ListKeysAsync(), ListVersionsAsync(), หรือ ListDataStoresAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม StandardList | ||
| StandardRemoveGameServerThrottled | StandardRemove คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง RemoveAsync() ใน data store มาตรฐานเกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม StandardRemove | ||
| OrderedReadGameServerThrottled | OrderedRead คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง GetAsync() หรือการอ่านจาก UpdateAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม OrderedRead | ||
| OrderedWriteGameServerThrottled | OrderedWrite คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม OrderedWrite | ||
| OrderedListGameServerThrottled | OrderedList คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง GetSortedAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม OrderedList | ||
| OrderedRemoveGameServerThrottled | OrderedRemove คำขอถูกจำกัดโดยข้อกำหนดเซิร์ฟเวอร์เกมหรือคิวของคำขอเต็ม | คำขอไปยัง RemoveAsync() ใน data store ที่สั่งให้เกินอัตราขีดจำกัดสำหรับระดับเซิร์ฟเวอร์เกม OrderedRemove |
รหัสข้อผิดพลาดของเซิร์ฟเวอร์
| ชื่อข้อผิดพลาด | ข้อความข้อผิดพลาด | หมายเหตุ |
|---|---|---|
| DatastoreDeleted | data store ถูกลบ | การดำเนินการใน data store ไม่สามารถเกิดขึ้นได้เพราะ data store ถูกลบไปก่อนหน้านี้ |
| DatastoreThrottled | อัตราเรquest เกินขีดจำกัดสูงสุดที่อนุญาตสำหรับ datastore | มีคำขอมากเกินไปถูกส่งไปยัง data store เดียว |
| InternalServerError | เกิดข้อผิดพลาดเซิร์ฟเวอร์ภายใน | ข้อผิดพลาดเป็นครั้งคราวบนเซิร์ฟเวอร์ Roblox ลองอีกครั้ง โดยเฉพาะอย่างยิ่งด้วยการถอยแบบเกินการ |
| InvalidExclusiveStartKey | คีย์เริ่มต้นที่ไม่ซ้ำกันที่ให้มาไม่ถูกต้อง | คีย์เริ่มต้นที่ไม่ซ้ำกัน (ลูกศร) ที่ให้มากับการดำเนินการรายการเช่น ListKeysAsync() ไม่ถูกต้อง |
| InvalidPlace | สถานที่ที่ให้มาไม่ถูกต้อง | ไม่มีรหัสจักรวาลที่ตรงกับสถานที่ ลองอีกครั้งในภายหลัง |
| InvalidTarget | เป้าหมายที่ให้มาไม่ถูกต้อง | ชื่อคีย์ data store ที่สั่งให้เกินขีดจำกัด 50 ตัวอักษร |
| InvalidUniverse | จักรวาลที่ให้มไม่ถูกต้อง | ไม่มีรหัส Place ที่ตรงกับจักรวาล ลองอีกครั้งในภายหลัง |
| InvalidUserIds | รหัสผู้ใช้งานที่ให้มามีรูปแบบไม่ถูกต้อง | ไม่สามารถแยกวิเคราะห์รหัสผู้ใช้งานได้ |
| KeyThrottled | อัตราการร้องขอเกินขีดจำกัดที่อนุญาตสูงสุดสำหรับคีย์ | รหัสคำขอเกินขีดจำกัดอัตราrequests สูงสุดที่อนุญาตสำหรับคีย์เดียว |
| KeyNotFound | คีย์ที่ร้องขอไม่มีอยู่ | คีย์ไม่มีอยู่ |
| N/A | ไม่สามารถไปยังหน้าถัดไป | ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณเรียก Pages:AdvanceToNextPageAsync() บนหน้าสุดท้าย |
| StandardReadExperienceThrottled | อัตราการอ่านมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), หรือการอ่านของ UpdateAsync() ใน data store มาตรฐานเกินขีดจำกัดอัตราการอ่านมาตรฐาน |
| StandardWriteExperienceThrottled | อัตราการเขียนมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() ใน data store มาตรฐานเกินขีดจำกัดอัตราการเขียนมาตรฐาน |
| StandardListExperienceThrottled | อัตราการร้องขอรายการมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง ListKeysAsync(), ListVersionsAsync(), หรือ ListDataStoresAsync() ใน data store มาตรฐานเกินขีดจำกัดอัตราการร้องขอรายการมาตรฐาน |
| StandardRemoveExperienceThrottled | อัตราการลบมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง RemoveAsync() ใน data store มาตรฐานเกินขีดจำกัดมาตรฐานการลบ |
| OrderedReadExperienceThrottled | อัตราการอ่านที่สั่งให้เกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง GetAsync() หรือการอ่านของ UpdateAsync() ใน data store ที่สั่งให้เกินขีดจำกัดระดับประสบการณ์ OrderedRead |
| OrderedWriteExperienceThrottled | อัตราการเขียนที่สั่งให้เกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() ใน data store ที่สั่งให้เกินขีดจำกัดระดับประสบการณ์ OrderedWrite |
| OrderedListExperienceThrottled | อัตราการร้องขอรายการที่สั่งให้เกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง GetSortedAsync() ใน data store ที่สั่งให้เกินขีดจำกัดระดับประสบการณ์ OrderedList |
| OrderedRemoveExperienceThrottled | อัตราการลบที่สั่งให้เกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง RemoveAsync() ใน data store ที่สั่งให้เกินขีดจำกัดระดับประสบการณ์ OrderedRemove |
ขีดจำกัด
โมเดลข้อมูลมี ขีดจำกัด หากประสบการณ์เกินขีดจำกัดเหล่านี้ บริการจะจำกัดการใช้งาน data store ของประสบการณ์โดยอัตโนมัติและทำให้คำขอในอนาคตถูกวางในหนึ่งในคิวต่อไปนี้:
- ตั้งค่า
- ตั้งค่าแบบสั่ง
- รับ
- รับแบบสั่ง
คำขอในคิวจะถูกจัดการตามลำดับที่ได้รับ ฟังก์ชันที่เรียกยังคงหยุดชะงักตราบเท่าที่คำขอยังคงอยู่ในคิว หากคีย์ data store ถูกจำกัด คำขอจะถูกวางในคิวแต่จะถูกข้ามในชั่วคราว
แต่ละคิวมีขีดจำกัด 30 คำขอ เมื่อถึงขีดจำกัดของคิว คำขอจะล้มเหลวด้วยรหัสข้อผิดพลาดในช่วง 301-306 ซึ่งบ่งชี้ว่าคำขอถูกละทิ้งทั้งหมด
ขีดจำกัดการเข้าถึง
data stores จะต้องปฏิบัติตามทั้ง ขีดจำกัดประสบการณ์และเซิร์ฟเวอร์ ขีดจำกัดในระดับประสบการณ์จะปรับขนาดด้วยจำนวนผู้ใช้ทั้งหมดที่ใช้งานร่วมกันทั่วทั้งประสบการณ์ ขีดจำกัดในระดับเซิร์ฟเวอร์นั้นสามารถกำหนดค่าได้และมีเป้าหมายเพื่อใช้เป็นเครื่องมือโดยผู้สร้าง
ขีดจำกัดประสบการณ์
แต่ละประสบการณ์ได้รับอนุญาตจำนวนหนึ่งของคำขอ data store โดยขึ้นอยู่กับประเภท data store, ประเภทคำขอ และจำนวนผู้ใช้ที่ใช้งานพร้อมกัน สำหรับแต่ละประเภท data store และประเภทคำขอ ขีดจำกัดจะแบ่งปันกันระหว่างการทำงานทั้งหมดที่ระบุไว้
- UpdateAsync() จะใช้จากงบประมาณการอ่านและเขียน คำขอเดียวจะลดทั้งสองขีดจำกัด
- เซิร์ฟเวอร์เกมและ Open Cloud แชร์ งบประมาณ การจราจรของ Open Cloud สามารถถูกจำกัดโดยการใช้งานภายในประสบการณ์ (และในทางกลับกัน) โปรดดู Control rate limits สำหรับข้อมูลเพิ่มเติม
data stores แบบมาตรฐาน
| ประเภทคำขอ | Game server API | Open Cloud API | ขีดจำกัดที่แชร์ (คำขอต่อหนึ่งนาที) |
|---|---|---|---|
| อ่าน | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | เรียกดูข้อมูลจาก Data Store | 300 + ผู้ใช้พร้อมกัน × 40 |
| เขียน | SetAsync() IncrementAsync() UpdateAsync() | สร้าง, อัปเดต, เพิ่มข้อมูลเข้าบันทึก Data Store | 300 + ผู้ใช้พร้อมกัน × 20 |
| รายการ | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | รายการ Data Stores, รายการข้อมูล Data Store, รายการการแก้ไขข้อมูล Data Store | 300 + ผู้ใช้พร้อมกัน × 2 |
| ลบ | RemoveAsync() | ลบข้อมูลจาก Data Store, ลบ Data Store, คืนค่าข้อมูลจาก Data Store | 300 + ผู้ใช้พร้อมกัน × 40 |
data stores แบบสั่ง
| ประเภทคำขอ | Game server API | Open Cloud API | ขีดจำกัดที่แชร์ (คำขอต่อหนึ่งนาที) |
|---|---|---|---|
| อ่าน | GetAsync() UpdateAsync() | เรียกดูข้อมูลจาก Ordered Data Store | 300 + ผู้ใช้พร้อมกัน × 40 |
| เขียน | SetAsync() IncrementAsync() UpdateAsync() | สร้าง, อัปเดต, เพิ่มข้อมูลเข้าบันทึก Ordered Data Store | 300 + ผู้ใช้พร้อมกัน × 20 |
| รายการ | GetSortedAsync() | รายการข้อมูลจาก Ordered Data Store | 300 + ผู้ใช้พร้อมกัน × 2 |
| ลบ | RemoveAsync() | ลบข้อมูลจาก Ordered Data Store | 300 + ผู้ใช้พร้อมกัน × 40 |
ควบคุมขีดจำกัดอัตรา
เนื่องจากคำขอ Open Cloud และเซิร์ฟเวอร์เกมถูกแชร์ จึงสำคัญที่จะควบคุมว่าความสามารถในการใช้ชีวิตแต่ละด้านมีอย่างไร
เซิร์ฟเวอร์เกม
เซิร์ฟเวอร์แต่ละตัวมีขีดจำกัดที่สร้างขึ้นตามที่ได้อธิบายไว้ข้างต้น ใช้การรวมกันของ SetRateLimitForRequestType() และ GetRequestBudgetForRequestType() เพื่อรักษาการควบคุมที่ละเอียดยิ่งขึ้นในการมีส่วนร่วมของเซิร์ฟเวอร์แต่ละตัวต่อขีดจำกัดรวม
Open Cloud
คำร้องของ Open Cloud จำเป็นต้องมีการแก้ไขปัญหาการจำกัดอัตรา เราขอแนะนำแนวทางหนึ่งในวิธีการต่อไปนี้:
- (ง่าย) เพิ่มการหยุดเวลาสั้น ๆ หลังจากแต่ละคำร้อง โดยเฉพาะเมื่อเรียกใช้ API เดียวกันอย่างต่อเนื่อง ตั้งค่านี้เพื่อให้มีค่าใช้จ่ายตาม 60 / (การบริโภคงบประมาณต่อหนึ่งนาทีที่ต้องการ) วินาทียกทรงไว้เพื่อเป็นขอบเขตสูงสุด โปรดทราบว่าแนวทางนี้ไม่อนุญาตให้ส่งคำขออย่างกะทันหัน
- (แข็งแกร่ง) นำเสนอการควบคุมอัตราในท้องถิ่นโดยใช้กลยุทธ์ถังรั่ว
ตัวอย่างโค้ด Node.js ต่อไปนี้ประกอบด้วยการใช้งานที่อ้างถึง
const apiKey = process.env.API_KEY;
if (!apiKey) {
throw new Error('The API_KEY environment variable is not set.');
}
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(`\nProcessing entry: ${path}`);
const currentData = await getEntry(path);
currentData.value.currency += 10;
const payload = { value: currentData.value };
const updateResponse = await updateEntry(path, payload);
console.log(`Status: ${updateResponse.status}`);
console.log(`Response: ${await updateResponse.text()}`);
}
} catch (error) {
console.error('An error occurred during execution:', error);
}
})();ขีดจำกัดของเซิร์ฟเวอร์
เซิร์ฟเวอร์แต่ละตัวมีขีดจำกัดอัตราที่สามารถกำหนดค่าสำหรับแต่ละประเภทคำขอ โดยขึ้นอยู่กับจำนวนผู้เล่นในเซิร์ฟเวอร์นั้น ๆ เซิร์ฟเวอร์จะได้รับการกระตุ้นระเบิดการขอใช้จ่ายเพิ่มอะไรก็ตามเมื่อมันถูกสร้างมาเป็นครั้งแรก ใช้ GetRequestBudgetForRequestType() เพื่อยืนยันจำนวนคำขอ data store ที่เซิร์ฟเวอร์ปัจจุบันสามารถทำได้ในเวลาที่กำหนด
ระบบจัดการนี้สามารถ กำหนดค่าโดยสร้าง โดยใช้ SetRateLimitForRequestType() API ซึ่งเป็น API ที่สร้างขึ้นเพื่อให้สามารถกำหนดค่าให้มีขีดจำกัดการเข้าถึงในแต่ละประเภทคำขอ
ขีดจำกัดอัตราเริ่มต้น เหล่านี้ จะมีผลบังคับใช้หาก API ไม่ถูกเรียกใช้:
data stores แบบมาตรฐาน
| ประเภทคำขอ | DataStoreRequestType Enum | Game server 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 |
data stores แบบสั่ง
| ประเภทคำขอ | DataStoreRequestType Enum | Game server API | คำขอต่อหนึ่งนาที |
|---|---|---|---|
| อ่าน | OrderedRead | GetAsync() UpdateAsync() | 60 + numPlayers × 40 |
| เขียน | OrderedWrite | SetAsync() IncrementAsync() UpdateAsync() | 30 + numPlayers × 5 |
| รายการ | OrderedList | GetSortedAsync() | 5 + numPlayers × 2 |
| ลบ | OrderedRemove | RemoveAsync() | 30 + numPlayers × 5 |
ขีดจำกัดข้อมูล
data stores จะจำกัดปริมาณข้อมูลที่สามารถใช้ได้ต่อการเข้าถึง
ชื่อ data store, ชื่อคีย์, และ scope จะต้องมีความยาวต่ำกว่าความยาวตัวอักษรที่กำหนด ใช้ string.len() เพื่อตรวจสอบความยาวของพวกเขา
ข้อมูล (ค่า) จะถูกเก็บไว้เป็นสตริงโดยไม่คำนึงถึงประเภทเริ่มต้นของมัน คุณสามารถตรวจสอบขนาดของข้อมูลได้โดยใช้ฟังก์ชัน JSONEncode() ซึ่งจะแปลงข้อมูล Luau เป็นตาราง JSON ที่ serialize
| คอมโพเนนต์ | จำนวนตัวอักษรสูงสุด |
|---|---|
| ชื่อ data store | 50 |
| ชื่อคีย์ | 50 |
| Scope | 50 |
| ข้อมูล (ค่า) | 4,194,304 ต่อคีย์ |
ขีดจำกัด Metadata
ขีดจำกัดในการกำหนดจำนวนตัวอักษรใน metadata ที่ผู้ใช้กำหนด
| คอมโพเนนต์ | จำนวนตัวอักษรสูงสุด |
|---|---|
| ชื่อคีย์ | 50 |
| ค่า | 250 |
| คู่คีย์-ค่า | 300 |
ขีดจำกัดการผ่าน
ขีดจำกัดการผ่านที่แต่ละคีย์จะทำให้ประสิทธิภาพดีเยี่ยมบนเซิร์ฟเวอร์ Roblox ขีดจำกัดแต่ละอย่างนี้จะมีผลต่อแต่ละคีย์เฉพาะภายในประสบการณ์ทั้งหมดและจะรีเฟรชตามเวลาRoblox ตรวจสอบการใช้งานของโควต้าที่เกี่ยวข้องกับคีย์ในช่วง 60 วินาทีที่ผ่านมา ถ้าการใช้งานรวมถึงคำขอปัจจุบันอยู่ภายในขีดจำกัดการส่งข้อมูล คำขอจะได้รับการอนุมัติ ถ้าการใช้งานเกินขีดจำกัด คำขอจะถูกปฏิเสธ
| ประเภทคำขอ | Game server API | Open Cloud API | ขีดจำกัด |
|---|---|---|---|
| อ่าน | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() ListVersionsAsync() UpdateAsync() | รับข้อมูลจาก Data Store | 25 MB ต่อหนึ่งนาที |
| เขียน | SetAsync() IncrementAsync() UpdateAsync() RemoveAsync() | สร้าง, อัปเดต, เพิ่ม, ลบข้อมูลจาก Data Store | 4 MB ต่อหนึ่งนาที |
นอกเหนือจากขีดจำกัดความเร็วข้างต้น Roblox ยังจัดระเบียบข้อมูลตามพาร์ติชันตามสกีมาภายใน ผลก็คือเมื่อเซิร์ฟเวอร์ด้านหลังได้รับคำขอจำนวนมากไปยัง Data Store เดียวกัน อาจทำให้เกิดการจำกัดความเร็วเพิ่มเติม โดยไม่คำนึงถึงสาเหตุ การจำกัดความเร็วจะแสดงออกมาในรูปแบบของข้อผิดพลาด DatastoreThrottled หรือ KeyThrottled ขึ้นอยู่กับว่าขีดจำกัดความเร็วถูกเกินสำหรับ Data Store เดียวหรือคีย์ ข้อความแสดงข้อผิดพลาดเหล่านี้ใช้ได้กับทั้ง Data Store แบบจัดลำดับและแบบปกติ
ขีดจำกัดการจัดเก็บ
เพื่อให้การจัดเก็บมีเสถียรภาพและขยายตัวได้ Data Store จะใช้ขีดจำกัดในระดับเกมต่อการใช้งานการจัดเก็บของคุณ
ขีดจำกัดนี้ประกอบด้วยการจัดสรรพื้นฐานสำหรับแต่ละเกมบวกกับการจัดสรรเพิ่มเติมตามจำนวนผู้ใช้งานตลอดชีพ ผู้ใช้งานตลอดชีพคือผู้ใช้ใดๆ ที่เข้าร่วมเกมของคุณอย่างน้อยหนึ่งครั้ง
ขีดจำกัดการจัดเก็บจะคำนวณโดยใช้สูตรต่อไปนี้ Total latest version storage limit = 500 MB + 1 MB × lifetime user count.
การใช้งานการจัดเก็บจะถูกวัดโดยใช้ ขนาดที่บีบอัด ของเวอร์ชันล่าสุดของแต่ละคีย์ Data Store จะบีบอัดข้อมูลของคุณโดยอัตโนมัติก่อนการจัดเก็บ ดังนั้นจึงหลีกเลี่ยงการบีบอัดล่วงหน้าเอง การบีบอัดล่วงหน้าจะเพิ่มภาระ CPU ที่ไม่จำเป็นและอาจลดประสิทธิภาพของการบีบอัดที่มีใน Data Store โดยการเก็บข้อมูลที่ไม่บีบอัด คุณจะได้รับประโยชน์โดยอัตโนมัติจากการปรับปรุงอัลกอริธึมการบีบอัดของ Roblox และการปรับปรุงตามสกีมาที่จะเกิดขึ้นในอนาคต
เฉพาะเวอร์ชันล่าสุดของแต่ละคีย์เท่านั้นที่นับรวมในการใช้งานการจัดเก็บของคุณ คีย์ที่ถูกลบและเวอร์ชันที่ถูกแทนที่ แม้ว่ายังสามารถเข้าถึงได้ผ่าน API เวอร์ชันในระยะเวลาเก็บรักษาของพวกเขา จะไม่นับรวมในการใช้งานการจัดเก็บของคุณ อย่างไรก็ตาม Data Store ที่ถูกลบผ่านวิธีการ Open Cloud DeleteDataStore ยังคงนับรวมในการใช้งานการจัดเก็บในระยะเวลา 30 วันหลังจากการลบ จนกว่าพวกเขาจะถูกลบถาวร