คำขอที่คุณทำไปยัง 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 ที่ไม่สามารถจัดเก็บได้ | |
| 105 | ValueTooLarge | ค่าที่ถูกจัดเก็บมีขนาดเกิน X | หากคุณกำลังตั้งค่าค่าด้วย SetAsync() หรือ UpdateAsync() ความยาวที่ถูกจัดเก็บของค่าจะต้องไม่เกินขนาด X เพื่อตรวจสอบความยาวที่ถูกจัดเก็บของข้อมูล ให้ใช้ 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 | ขนาดของเมตาดาต้าลักษณะเกินขีดจำกัด X | ขนาดของเมตาดาต้าที่ถูกจัดเก็บเกินขีดจำกัด X ค่าที่ X เป็นแบบไดนามิก หากขนาดเปลี่ยนแปลง ค่าก็จะเปลี่ยนแปลงด้วย | |
| 512 | UserIdLimitExceeded | ขนาดของ UserID เกินขีดจำกัด X | ความยาวของอาร์เรย์ user IDs ที่ผู้ใช้ให้มามีความยาวเกินขีดจำกัด X | |
| 513 | AttributeFormatError | รูปแบบของลักษณะ userId ไม่ถูกต้อง | หมายเลข user 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 | 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 stores มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับประสบการณ์ StandardList | ||
| StandardRemoveExperienceThrottled | คำขอ StandardRemove ถูกควบคุมโดยขีดจำกัดประสบการณ์ | คำขอไปยัง RemoveAsync() บน data store มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับประสบการณ์ StandardRemove | ||
| OrderedReadExperienceThrottled | คำขอ OrderedRead ถูกควบคุมโดยขีดจำกัดประสบการณ์ | คำขอไปยัง GetAsync(), BatchGetAsync(), หรือการอ่านของ 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 stores มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับเซิร์ฟเวอร์เกม StandardList | ||
| StandardRemoveGameServerThrottled | คำขอ StandardRemove ถูกควบคุมโดยขีดจำกัดเซิร์ฟเวอร์เกมหรือคิวคำขอเต็ม | คำขอไปยัง RemoveAsync() บน data store มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับเซิร์ฟเวอร์เกม StandardRemove | ||
| OrderedReadGameServerThrottled | คำขอ OrderedRead ถูกควบคุมโดยขีดจำกัดเซิร์ฟเวอร์เกมหรือคิวคำขอเต็ม | คำขอไปยัง GetAsync(), BatchGetAsync(), หรือการอ่านของ 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 | อัตราคำขอเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับ datastore | ส่งคำขอมากเกินไปไปยัง data store เดียว |
| InternalServerError | เกิดข้อผิดพลาดภายในเซิร์ฟเวอร์ | ข้อผิดพลาดบางประการบนเซิร์ฟเวอร์ Roblox ลองอีกครั้ง โดยเฉพาะอย่างยิ่งด้วยการถอยกลับแบบเอ็กซ์โพเนนเชียล |
| InvalidExclusiveStartKey | คีย์เริ่มต้นพิเศษที่ให้มาไม่ถูกต้อง | คีย์เริ่มต้นพิเศษ (ตัวชี้) ที่ให้มากับการดำเนินการรายการเช่น ListKeysAsync() ไม่ถูกต้อง |
| InvalidPlace | สถานที่ที่ให้มานั้นไม่ถูกต้อง | ไม่มี ID จักรวาลที่ตรงกันสำหรับสถานที่ ลองอีกครั้งในภายหลัง |
| InvalidTarget | เป้าหมายที่ให้มานั้นไม่ถูกต้อง | ชื่อคีย์ data store ที่จัดเรียงเกินขีดจำกัด 50 ตัวอักษร |
| InvalidUniverse | จักรวาลที่ให้มานั้นไม่ถูกต้อง | ไม่มี ID สถานที่ที่ตรงกันสำหรับจักรวาล ลองอีกครั้งในภายหลัง |
| InvalidUserIds | รูปแบบของ user IDs ที่ให้มานั้นไม่ถูกต้อง | ไม่สามารถแยกวิเคราะห์ user IDs ได้ |
| KeyThrottled | อัตราคำขอเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับคีย์ | อัตราคำขอเกินขีดจำกัดอัตราคำขอสูงสุดที่อนุญาตสำหรับคีย์เดียว |
| KeyNotFound | คีย์ที่ร้องขอไม่มีอยู่ | คีย์ไม่มีอยู่ |
| N/A | ไม่มีหน้าที่จะก้าวไปข้างหน้า | ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณเรียก Pages:AdvanceToNextPageAsync() บนหน้าสุดท้าย |
| StandardReadExperienceThrottled | อัตราคำขออ่านมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง GetAsync(), GetVersionAsync(), GetVersionAtTimeAsync(), หรือการอ่านของ UpdateAsync() บน data store มาตรฐานเกินขีดจำกัดอัตราการอ่านระดับประสบการณ์ StandardRead |
| StandardWriteExperienceThrottled | อัตราคำขอเขียนมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง SetAsync(), IncrementAsync(), หรือการเขียนของ UpdateAsync() บน data store มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับประสบการณ์ StandardWrite |
| StandardListExperienceThrottled | อัตราคำขอรายการมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง ListKeysAsync(), ListVersionsAsync(), หรือ ListDataStoresAsync() บน data stores มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับประสบการณ์ StandardList |
| StandardRemoveExperienceThrottled | อัตราคำขอการลบมาตรฐานเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง RemoveAsync() บน data store มาตรฐานเกินขีดจำกัดอัตราการเขียนระดับประสบการณ์ StandardRemove |
| OrderedReadExperienceThrottled | อัตราคำขออ่านที่จัดเรียงเกินขีดจำกัดสูงสุดที่อนุญาตสำหรับประสบการณ์ | คำขอไปยัง GetAsync(), BatchGetAsync(), หรือการอ่านของ 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 อาจถูกควบคุมโดยการใช้งานในประสบการณ์ (และในทางกลับกัน) ดู ควบคุมขีดจำกัดอัตรา สำหรับแนวทางเพิ่มเติม
data stores มาตรฐาน
| ประเภทคำขอ | API เซิร์ฟเวอร์เกม | API Open Cloud | ขีดจำกัดที่แชร์ (คำขอต่อหนึ่งนาที) |
|---|---|---|---|
| อ่าน | GetAsync() GetVersionAsync() GetVersionAtTimeAsync() UpdateAsync() | รับข้อมูลจาก Data Store | 300 + concurrentUsers × 40 |
| เขียน | SetAsync() IncrementAsync() UpdateAsync() | สร้าง, อัปเดต, เพิ่มข้อมูลใน Data Store | 300 + concurrentUsers × 20 |
| รายการ | ListDataStoresAsync() ListKeysAsync() ListVersionsAsync() | รายการ Data Stores, รายการข้อมูลใน Data Store, รายการการแก้ไขข้อมูลใน Data Store | 300 + concurrentUsers × 2 |
| ลบ | RemoveAsync() | ลบข้อมูลใน Data Store, ลบ Data Store, ยกเลิกการลบ Data Store | 300 + concurrentUsers × 40 |
data stores ที่จัดเรียง
| ประเภทคำขอ | API เซิร์ฟเวอร์เกม | API Open Cloud | ขีดจำกัดที่แชร์ (คำขอต่อหนึ่งนาที) |
|---|---|---|---|
| อ่าน | GetAsync() BatchGetAsync() UpdateAsync() | รับข้อมูลจาก Ordered Data Store | 300 + concurrentUsers × 40 |
| เขียน | SetAsync() IncrementAsync() UpdateAsync() | สร้าง, อัปเดต, เพิ่มข้อมูลใน Ordered Data Store | 300 + concurrentUsers × 20 |
| รายการ | GetSortedAsync() | รายการข้อมูลใน Ordered Data Store | 300 + concurrentUsers × 2 |
| ลบ | RemoveAsync() | ลบข้อมูลใน Ordered Data Store | 300 + concurrentUsers × 40 |
ควบคุมขีดจำกัดอัตรา
เนื่องจากคำขอ Open Cloud และเซิร์ฟเวอร์เกมถูกแชร์ จึงเป็นสิ่งสำคัญที่จะต้องควบคุมว่าแต่ละคำขอสามารถใช้จากงบประมาณได้มากเพียงใด
เซิร์ฟเวอร์เกม
เซิร์ฟเวอร์แต่ละตัวมีขีดจำกัดในตัวตามที่อธิบายไว้ข้างต้น ใช้การรวมกันของ SetRateLimitForRequestType() และ GetRequestBudgetForRequestType() เพื่อรักษาการควบคุมที่ละเอียดเกี่ยวกับการมีส่วนร่วมของเซิร์ฟเวอร์แต่ละตัวต่องบประมาณรวม
Open Cloud
คำขอ Open Cloud ต้องการโซลูชันการควบคุมอัตราภายนอก เราขอแนะนำหนึ่งในแนวทางต่อไปนี้:
- (ง่าย) เพิ่มเวลาหยุดชั่วคราวสั้น ๆ หลังจากแต่ละคำขอ โดยเฉพาะอย่างยิ่งหากเรียก 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() เพื่อตรวจสอบจำนวนคำขอ data store ที่เซิร์ฟเวอร์ปัจจุบันสามารถทำได้ในเวลาใดเวลาหนึ่ง
ขีดจำกัดเหล่านี้ สามารถกำหนดค่าได้โดยผู้สร้าง โดยใช้ API SetRateLimitForRequestType() โดยใช้ API นี้ ผู้สร้างสามารถกำหนดขีดจำกัดอัตรา data stores ของตนเองสำหรับแต่ละประเภทคำขอ
ขีดจำกัดอัตรา เริ่มต้น ต่อไปนี้จะใช้หากไม่มีการเรียก API:
data stores มาตรฐาน
| ประเภทคำขอ | DataStoreRequestType Enum | 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 | 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 |
ขีดจำกัดข้อมูล
Data stores จำกัดปริมาณข้อมูลที่สามารถใช้ต่อรายการ
ชื่อ data store, ชื่อคีย์, และ ขอบเขต จะต้องอยู่ภายใต้ความยาวตัวอักษรที่กำหนด ใช้ string.len() เพื่อตรวจสอบความยาวของพวกเขา
ข้อมูล (ค่าคีย์) จะถูกจัดเก็บเป็นสตริง ไม่ว่าจะเป็นประเภทเริ่มต้นใดก็ตาม คุณสามารถตรวจสอบขนาดของข้อมูลได้ด้วยฟังก์ชัน JSONEncode() ซึ่งจะแปลงข้อมูล Luau เป็นตาราง JSON ที่ถูกจัดเก็บ
| ส่วนประกอบ | จำนวนตัวอักษรสูงสุด |
|---|---|
| ชื่อ data store | 50 |
| ชื่อคีย์ | 50 |
| ขอบเขต | 50 |
| ข้อมูล (ค่าคีย์) | 4,194,304 ต่อคีย์ |
ขีดจำกัดเมตาดาต้า
ขีดจำกัดจำนวนตัวอักษรในเมตาดาต้าที่ผู้ใช้กำหนด
| ส่วนประกอบ | จำนวนตัวอักษรสูงสุด |
|---|---|
| ชื่อคีย์ | 50 |
| ค่า | 250 |
| คู่คีย์-ค่า | 300 |
ข้อจำกัดด้านการส่งข้อมูล
ข้อจำกัดด้านการส่งข้อมูลต่อคีย์ช่วยให้ประสิทธิภาพการทำงานในเซิร์ฟเวอร์ Roblox เป็นไปอย่างเหมาะสม ข้อจำกัดแต่ละข้อจะใช้กับคีย์แต่ละตัวในทุกเซิร์ฟเวอร์ในประสบการณ์และจะรีเฟรชตามเวลา
Roblox จะตรวจสอบการใช้งานของโควต้าที่เกี่ยวข้องกับคีย์ในช่วง 60 วินาทีที่ผ่านมา หากการใช้งานรวมถึงคำขณะนี้อยู่ภายในข้อจำกัดการส่งข้อมูล คำขอจะได้รับการอนุมัติ หากการใช้งานเกินข้อจำกัด คำขอจะถูกปฏิเสธ
| ประเภทคำขอ | API เซิร์ฟเวอร์เกม | API Open Cloud | ข้อจำกัด |
|---|---|---|---|
| อ่าน | 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 วันที่กำลังดำเนินการลบ จนกว่าพวกเขาจะถูกลบอย่างถาวร