หน่วยความจำ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

MemoryStoreService เป็นบริการข้อมูลที่มีความสามารถในการประมวลผลสูงและมีความหน่วงต่ำ ซึ่งให้การเก็บข้อมูลในหน่วยความจำที่รวดเร็วและสามารถเข้าถึงได้จากเซิร์ฟเวอร์ทั้งหมดในเซสชันที่ใช้งานอยู่ Memory Stores เหมาะสำหรับข้อมูลที่มีการเปลี่ยนแปลงบ่อยและชั่วคราวซึ่งไม่จำเป็นต้องมีความทนทาน เนื่องจากเข้าถึงได้เร็วกว่าและจะหายไปเมื่อถึงอายุการใช้งานสูงสุด สำหรับข้อมูลที่ต้องการให้คงอยู่ระหว่างเซสชัน ให้ใช้ data stores.

โครงสร้างข้อมูล

แทนที่จะเข้าถึงข้อมูลดิบโดยตรง, memory stores มีโครงสร้างข้อมูลพื้นฐานสามประเภทที่แชร์กันระหว่างเซิร์ฟเวอร์เพื่อการประมวลผลที่รวดเร็ว: sorted map, queue, และ hash map. โครงสร้างข้อมูลแต่ละประเภทเหมาะสำหรับกรณีการใช้งานที่เฉพาะเจาะจง:

  • การจับคู่ตามทักษะ - บันทึกข้อมูลผู้ใช้ เช่น ระดับทักษะ ใน queue ที่แชร์กันระหว่างเซิร์ฟเวอร์ และใช้เซิร์ฟเวอร์ล็อบบี้เพื่อทำการจับคู่เป็นระยะๆ
  • การซื้อขายและการประมูลข้ามเซิร์ฟเวอร์ - เปิดใช้งานการซื้อขายทั่วไประหว่างเซิร์ฟเวอร์ที่แตกต่างกัน ซึ่งผู้ใช้สามารถเสนอราคาสำหรับรายการที่มีราคาเปลี่ยนแปลงแบบเรียลไทม์ โดยใช้ sorted map ของคู่คีย์-ค่า
  • กระดานผู้นำระดับโลก - เก็บและอัปเดตอันดับผู้ใช้ในกระดานผู้นำที่แชร์กันภายใน sorted map
  • สินค้าคงคลังที่แชร์กัน - บันทึกสินค้าคงคลังและสถิติใน hash map ที่แชร์กัน ซึ่งผู้ใช้สามารถใช้สินค้าคงคลังร่วมกันได้
  • แคชสำหรับข้อมูลที่คงอยู่ - ซิงค์และคัดลอกข้อมูลที่คงอยู่ใน data store ไปยัง hash map ของ memory store ที่สามารถทำหน้าที่เป็นแคชและปรับปรุงประสิทธิภาพของเกมของคุณ

โดยทั่วไป หากคุณต้องการเข้าถึงข้อมูลตามคีย์เฉพาะ ให้ใช้ hash map หากคุณต้องการให้ข้อมูลนั้นมีการจัดเรียง ให้ใช้ sorted map หากคุณต้องการประมวลผลข้อมูลของคุณในลำดับเฉพาะ ให้ใช้ queue

ข้อจำกัดและโควต้า

เพื่อรักษาความสามารถในการขยายตัวและประสิทธิภาพของระบบ, memory stores มีโควต้าการใช้งานข้อมูลสำหรับขนาดหน่วยความจำ, การเรียก API, และขนาดของโครงสร้างข้อมูล

Memory stores มีนโยบายการลบข้อมูลตามเวลาหมดอายุ ซึ่งเรียกอีกอย่างว่าเวลาในการมีชีวิต (TTL) รายการจะถูกลบออกหลังจากหมดอายุ และโควต้าหน่วยความจำจะถูกปล่อยให้สำหรับรายการใหม่ เมื่อคุณถึงขีดจำกัดหน่วยความจำ คำขอที่เพิ่มการใช้งานหน่วยความจำจะล้มเหลวจนกว่าคุณจะปล่อยหน่วยความจำหรือเพิ่มโควต้า ดู Recover from memory quota exhaustion สำหรับตัวเลือก

โควต้าขนาดหน่วยความจำ

โควต้าหน่วยความจำจำกัดปริมาณหน่วยความจำทั้งหมดที่เกมสามารถใช้ได้ มันไม่ใช่ค่าคงที่ แต่จะเปลี่ยนแปลงไปตามจำนวนผู้ใช้ในเกมตามสูตร 64 KB + 1.2 KB * [number of users] โควต้าจะใช้ในระดับเกมแทนที่จะเป็นระดับเซิร์ฟเวอร์

เมื่อผู้ใช้เข้าร่วมเกม โควต้าหน่วยความจำเพิ่มเติมจะพร้อมใช้งานทันที เมื่อผู้ใช้ออกจากเกม โควต้าจะไม่ลดลงทันที จะมีระยะเวลาการติดตามเป็นเวลาแปดวันก่อนที่โควต้าจะประเมินค่าใหม่เป็นค่าที่ต่ำกว่า

หลังจากเกมของคุณถึงโควต้าขนาดหน่วยความจำ คำขอ API ใดๆ ที่เพิ่มขนาดหน่วยความจำจะล้มเหลวเสมอ คำขอที่ลดหรือไม่เปลี่ยนแปลงขนาดหน่วยความจำยังคงสำเร็จ

ด้วย observability แดชบอร์ด คุณสามารถดูโควต้าขนาดหน่วยความจำของเกมของคุณแบบเรียลไทม์โดยใช้แผนภูมิ Memory Usage

ข้อจำกัดการเรียก API

โควต้า request unit จะใช้กับการเรียก API ทั้งหมดของ MemoryStoreService โควต้านี้คือ 1000 + 120 * [number of concurrent users] request units ต่อหนึ่งนาที

การเรียก API ส่วนใหญ่จะใช้เพียงหนึ่ง request unit โดยมีข้อยกเว้นบางประการ:

  • MemoryStoreSortedMap:GetRangeAsync()

    ใช้หน่วยตามจำนวนรายการที่ส่งคืน ตัวอย่างเช่น หากวิธีนี้ส่งคืน 10 รายการ การเรียกจะนับเป็น 10 request units หากส่งคืนการตอบสนองว่าง จะนับเป็นหนึ่ง request unit

  • MemoryStoreQueue:ReadAsync()

    ใช้หน่วยตามจำนวนรายการที่ส่งคืน เช่นเดียวกับ MemoryStoreSortedMap:GetRangeAsync() แต่ใช้หน่วยเพิ่มเติมทุกสองวินาทีในขณะที่อ่าน กำหนดเวลาการอ่านสูงสุดด้วยพารามิเตอร์ waitTimeout

  • MemoryStoreHashMap:UpdateAsync()

    ใช้หน่วยขั้นต่ำสองหน่วย

  • MemoryStoreHashMap:ListItemsAsync()

    ใช้ [number of partitions scanned] + [items returned] units

โควต้าคำขอยังใช้ในระดับเกมแทนที่จะเป็นระดับเซิร์ฟเวอร์ ซึ่งให้ความยืดหยุ่นในการจัดสรรคำขอระหว่างเซิร์ฟเวอร์ตราบใดที่อัตราคำขอรวมไม่เกินโควต้า หากคุณเกินโควต้า คุณจะได้รับการตอบสนองข้อผิดพลาดเมื่อบริการจำกัดคำขอของคุณ

ด้วยฟีเจอร์ observability ที่มีอยู่ คุณสามารถดูโควต้า request unit ของเกมของคุณแบบเรียลไทม์

ข้อจำกัดขนาดโครงสร้างข้อมูล

สำหรับ sorted map หรือ queue เดียว ข้อจำกัดขนาดและจำนวนรายการต่อไปนี้จะใช้:

  • จำนวนรายการสูงสุด: 1,000,000
  • ขนาดรวมสูงสุด (รวมถึงคีย์สำหรับ sorted map): 100 MB

ข้อจำกัดต่อพาร์ติชัน

นอกเหนือจาก request unit quota ในระดับเกม, memory stores จะใช้ข้อจำกัดการเรียกต่อแต่ละพาร์ติชันเป็นมาตรการป้องกันที่ปกป้องความเสถียรของบริการสำหรับเกมทั้งหมด ข้อจำกัดเหล่านี้ไม่ใช่โควต้าที่เกมของคุณได้รับการจัดสรร และไม่ใช่เพดานที่แข็งแกร่งสำหรับอัตราการส่งข้อมูลที่เกมของคุณสามารถทำได้ ค่าต่อไปนี้เป็นการประมาณการ พวกเขาถูกกำหนดค่าในแบ็กเอนด์ของ Roblox และอาจเปลี่ยนแปลงได้ ดังนั้นอย่าออกแบบตามค่าคงที่เหล่านี้

ทุกคำขอนับเป็นส่วนหนึ่งของข้อจำกัดของ พาร์ติชัน ที่ถือรายการ ไม่ว่าจะเป็นโครงสร้างข้อมูลใดก็ตาม คุณสามารถคาดหวังว่าการจำกัดจะเริ่มต้นที่ประมาณ 30,000 request units ต่อหนึ่งนาที สำหรับพาร์ติชันเดียว ดังนั้นควรพยายามอยู่ต่ำกว่าระดับนั้น ขนาดของข้อจำกัดที่โครงสร้างข้อมูลใช้ขึ้นอยู่กับการกระจายของรายการ:

  • Sorted maps และ queues จะอยู่ในพาร์ติชันเดียว ดังนั้นทุกคำขอไปยังโครงสร้างข้อมูลเหล่านี้จะนับเป็นข้อจำกัดของพาร์ติชันเดียวกัน
  • Hash maps จะกระจายรายการของพวกเขาไปยังหลายพาร์ติชัน ดังนั้นการจราจรที่กระจายไปยังหลายคีย์รายการจึงไม่ค่อยเข้าใกล้ข้อจำกัดของพาร์ติชันใดพาร์ติชันหนึ่ง

Hash maps มีข้อจำกัดเพิ่มเติมในแต่ละคีย์รายการประมาณ 5,000 write request units ต่อหนึ่งนาที และ 15,000 read request units ต่อหนึ่งนาที ข้อจำกัดต่อคีย์นี้ใช้เพิ่มเติมจากข้อจำกัดต่อพาร์ติชัน ดังนั้นคีย์ที่เข้าถึงบ่อยอาจโดนทั้งสอง ข้อจำกัดต่อคีย์ใช้เฉพาะกับการดำเนินการแบบคีย์เดียว: ข้อจำกัดการอ่านใช้กับ MemoryStoreHashMap:GetAsync(), ข้อจำกัดการเขียนใช้กับ MemoryStoreHashMap:SetAsync() และ MemoryStoreHashMap:RemoveAsync(), และ MemoryStoreHashMap:UpdateAsync() จะนับทั้งข้อจำกัดการอ่านและการเขียน MemoryStoreHashMap:ListItemsAsync() จะสแกนพาร์ติชันแทนที่จะเป็นคีย์เดียว ดังนั้นจะใช้เฉพาะข้อจำกัดต่อพาร์ติชันกับมัน

หากคุณไม่ต้องการการจัดเรียงหรือฟังก์ชันการทำงานแบบเข้ามาก่อนออกไป, hash map มักจะเป็นตัวเลือกที่ดีที่สุดเพราะสามารถกระจายโหลดไปยังพาร์ติชันต่างๆ

เมื่อคำขอเกินข้อจำกัดของพาร์ติชันหรือข้อจำกัดต่อคีย์ บริการจะจำกัดคำขอและส่งคืนรหัสสถานะ PartitionRequestsOverLimit ซึ่งคุณสามารถติดตามได้ด้วยแดชบอร์ด observability

หากคุณคาดว่าโครงสร้างข้อมูลหรือคีย์รายการจะได้รับอัตราคำขอที่สูงและต่อเนื่อง, shard เพื่อให้โหลดกระจายไปยังพาร์ติชันหรือคีย์มากขึ้น กระจายการอ่านและการเขียนอย่างสม่ำเสมอไปยังหลายคีย์รายการเพื่อให้คงอยู่ภายในข้อจำกัดต่อคีย์ คุณยังสามารถลดอัตราคำขอโดยการแคชค่าบนเซิร์ฟเวอร์และตรวจสอบอีกครั้งหลังจากช่วงเวลา, การจัดกลุ่มคำขอเมื่อเป็นไปได้, และใช้ exponential backoff เมื่อคุณได้รับการตอบสนองการจำกัด

ฟื้นฟูจากการหมดโควต้าหน่วยความจำ

หากเกมของคุณได้รับข้อผิดพลาด TotalMemoryOverLimit ให้ตรวจสอบแผนภูมิ Memory Usage ใน observability dashboard. เพื่อกลับมาเขียนที่เพิ่มการใช้งานหน่วยความจำ ให้ลบรายการที่ไม่จำเป็น, รอให้รายการหมดอายุ, หรือใช้หนึ่งในตัวเลือกต่อไปนี้

ล้างหน่วยความจำด้วย Open Cloud

หากคุณไม่ต้องการข้อมูลที่เก็บไว้แล้ว ให้ใช้ Open Cloud Flush Memory Store endpoint เพื่อล้างข้อมูลโครงสร้างหน่วยความจำทั้งหมดในจักรวาลสำหรับขอบเขตที่เลือก

ในการล้างหน่วยความจำ:

  1. สร้าง API key ที่มีสิทธิ์ในการล้างหน่วยความจำและรับสถานะการดำเนินการล้างสำหรับจักรวาลเป้าหมาย
  2. ส่งคำขอ POST ไปยัง https://apis.roblox.com/cloud/v2/universes/{universe_id}/memory-store:flush โดยมี API key ในส่วนหัว x-api-key แทนที่ {universe_id} ด้วย ID จักรวาลของเกมของคุณ ตั้งค่าพารามิเตอร์ query scope เป็น LIVE สำหรับข้อมูลการผลิตหรือ TEST สำหรับข้อมูล Studio หากคุณละเว้น scope, endpoint จะใช้ LIVE
  3. ใช้ Get Memory Store Flush Operation เพื่อตรวจสอบการดำเนินการที่ส่งคืนโดยคำขอล้างจนกว่า done จะเป็น true และตรวจสอบสำหรับ error ใช้ขอบเขตเดียวกันเมื่อทำการตรวจสอบ การตอบกลับ path จะรวม cloud/v2 อยู่แล้ว ดังนั้นให้ตรวจสอบที่ https://apis.roblox.com/{path} โดยไม่ต้องเพิ่มคำนำหน้าอีก

หน่วยความจำใน Studio และการผลิตจะถูก แยกออก การล้างขอบเขตหนึ่งจะไม่ลบอีกขอบเขตหนึ่ง หลังจากลบข้อมูลที่ไม่จำเป็นแล้ว ให้ปฏิบัติตาม แนวทางปฏิบัติที่ดีที่สุด เช่น เวลาหมดอายุที่สั้นลงและการลบอย่างชัดเจน เพื่อป้องกันไม่ให้การใช้งานหน่วยความจำถึงโควต้าอีกครั้ง

เพิ่มความจุด้วย Extended Services

หากเกมของคุณต้องการเก็บข้อมูลและใช้พื้นที่เก็บข้อมูลมากกว่าที่โควต้าดีฟอลต์อนุญาต ให้เปิดใช้งาน Extended Services สำหรับ memory stores Extended Services ช่วยให้คุณจ่ายสำหรับพื้นที่เก็บข้อมูลและคำขอของ memory store ที่เกินโควต้าดีฟอลต์

ในการเริ่มต้น ให้ตรงตาม ข้อกำหนดคุณสมบัติ, เพิ่มรายละเอียดบัญชีและวิธีการชำระเงิน จากนั้นเลือกเกมของคุณใน Creator Dashboard. ภายใต้ Extended Services, เปิดใช้งาน memory stores และตั้งงบประมาณรายเดือนสำหรับทรัพยากรที่คุณต้องการ ดู Enable a service และ Service pricing สำหรับรายละเอียด

Extended Services จะจำกัดบริการหากการใช้งานเกินงบประมาณของคุณ ตรวจสอบการใช้งานและการเรียกเก็บเงิน และดำเนินการ ลบข้อมูลที่ไม่จำเป็น

แนวทางปฏิบัติที่ดีที่สุด

เพื่อให้รูปแบบการใช้งานหน่วยความจำของคุณอยู่ในระดับที่เหมาะสมและหลีกเลี่ยงการถึง ข้อจำกัด ให้ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเหล่านี้:

  • ลบรายการที่ประมวลผลแล้ว การทำความสะอาดรายการที่อ่านอย่างสม่ำเสมอโดยใช้วิธี MemoryStoreQueue:RemoveAsync() สำหรับ queues และ MemoryStoreSortedMap:RemoveAsync() สำหรับ sorted maps สามารถปล่อยหน่วยความจำและทำให้โครงสร้างข้อมูลทันสมัย

  • ตั้งเวลาในการหมดอายุให้สั้นที่สุดเท่าที่จะเป็นไปได้เมื่อเพิ่มข้อมูล แม้ว่าเวลาหมดอายุเริ่มต้นจะเป็น 45 วันสำหรับทั้ง MemoryStoreQueue:AddAsync() และ MemoryStoreSortedMap:SetAsync() การตั้งค่าเวลาที่สั้นที่สุดสามารถทำให้ข้อมูลเก่าถูกลบออกโดยอัตโนมัติเพื่อป้องกันไม่ให้เติมโควต้าการใช้งานหน่วยความจำของคุณ

    • อย่าเก็บข้อมูลจำนวนมากที่มีเวลาหมดอายุยาว เนื่องจากมีความเสี่ยงที่จะเกินโควต้าหน่วยความจำของคุณและอาจทำให้เกิดปัญหาที่อาจทำให้เกมของคุณเสียหาย
    • ควรลบรายการที่ไม่จำเป็นอย่างชัดเจนหรือกำหนดเวลาหมดอายุให้สั้น
    • โดยทั่วไป คุณควรใช้การลบอย่างชัดเจนเพื่อปล่อยหน่วยความจำและการหมดอายุของรายการเป็นกลไกความปลอดภัยเพื่อป้องกันไม่ให้รายการที่ไม่ได้ใช้งานใช้หน่วยความจำเป็นระยะเวลานาน
  • เก็บเฉพาะค่าที่จำเป็นในหน่วยความจำ

    ตัวอย่างเช่น สำหรับเกมบ้านประมูล คุณเพียงต้องรักษาการเสนอราคาสูงสุด คุณสามารถใช้ MemoryStoreSortedMap:UpdateAsync() บนคีย์หนึ่งเพื่อรักษาการเสนอราคาสูงสุดแทนที่จะเก็บการเสนอราคาทั้งหมดในโครงสร้างข้อมูลของคุณ

  • ใช้ exponential backoff เพื่อช่วยให้คุณอยู่ต่ำกว่าข้อจำกัดการเรียก API

    ตัวอย่างเช่น หากคุณได้รับ DataUpdateConflict คุณอาจลองใหม่หลังจากสองวินาที จากนั้นสี่ แปด ฯลฯ แทนที่จะส่งคำขอไปยัง MemoryStoreService อย่างต่อเนื่องเพื่อให้ได้การตอบสนองที่ถูกต้อง

  • แบ่งโครงสร้างข้อมูลขนาดใหญ่เป็นหลายโครงสร้างขนาดเล็กโดย sharding

    มักจะจัดการข้อมูลในโครงสร้างขนาดเล็กได้ง่ายกว่าการเก็บทุกอย่างในโครงสร้างข้อมูลขนาดใหญ่เพียงโครงสร้างเดียว วิธีนี้ยังช่วยหลีกเลี่ยงการใช้งานและข้อจำกัดอัตรา ตัวอย่างเช่น หากคุณมี sorted map ที่ใช้คีย์ที่มีพรีฟิก ให้พิจารณาแยกแต่ละพรีฟิกออกเป็น sorted map ของตัวเอง สำหรับเกมที่มีความนิยมสูง คุณอาจแยกผู้ใช้เป็นหลายแผนที่ตามหลักฐานสุดท้ายของ ID ผู้ใช้ของพวกเขา

  • Shard คีย์ที่เข้าถึงบ่อยใน hash maps โดยใช้สำเนาหลายชุดของคีย์เพื่อกระจายโหลด

  • บีบอัดค่าที่เก็บไว้

    ตัวอย่างเช่น พิจารณาใช้ LZW อัลกอริธึมเพื่อลดขนาดค่าที่เก็บไว้

  • ลงทะเบียนใน Extended Services

    สำหรับการจัดเก็บหรือการใช้งานคำขอที่เกินโควต้าดีฟอลต์, เปิดใช้งาน Extended Services สำหรับ memory stores

การสังเกต

Observability Dashboard ให้ข้อมูลเชิงลึกและการวิเคราะห์สำหรับการติดตามและแก้ไขปัญหาการใช้งานหน่วยความจำของคุณ ด้วยแผนภูมิที่อัปเดตแบบเรียลไทม์ในด้านต่างๆ ของการใช้งานหน่วยความจำและการเรียก API คุณสามารถติดตามรูปแบบการใช้งานหน่วยความจำของเกมของคุณ, ดูโควต้าที่จัดสรรในปัจจุบัน, ติดตามสถานะ API, และระบุปัญหาที่อาจเกิดขึ้นเพื่อการปรับปรุงประสิทธิภาพ

ตารางต่อไปนี้แสดงและอธิบายรหัสสถานะทั้งหมดของการตอบสนอง API ที่มีอยู่ในแผนภูมิ Request Count by Status และ Requests by API x Status ของ Observability Dashboard สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการแก้ไขข้อผิดพลาดเหล่านี้ ดู Troubleshooting สำหรับโควต้าหรือข้อจำกัดเฉพาะที่ข้อผิดพลาดเกี่ยวข้อง ดู Limits and Quotas

รหัสสถานะคำอธิบาย
Successสำเร็จ.
DataStructureMemoryOverLimitเกินขีดจำกัดขนาดหน่วยความจำระดับโครงสร้างข้อมูล (100 MB).
DataUpdateConflictเกิดความขัดแย้งเนื่องจากการอัปเดตพร้อมกัน.
AccessDeniedไม่ได้รับอนุญาตให้เข้าถึงข้อมูลเกม คำขอนี้ไม่ใช้ request units หรือใช้โควต้า.
InternalErrorข้อผิดพลาดภายใน.
InvalidRequestคำขอไม่มีข้อมูลที่จำเป็นหรือมีข้อมูลที่ไม่ถูกต้อง.
DataStructureItemsOverLimitเกินขีดจำกัดจำนวนรายการระดับโครงสร้างข้อมูล (1M).
NoItemFoundไม่พบรายการใน MemoryStoreQueue:ReadAsync() หรือ MemoryStoreSortedMap:UpdateAsync() ReadAsync() จะตรวจสอบทุก 2 วินาทีและส่งคืนรหัสสถานะนี้จนกว่าจะพบรายการในคิว.
DataStructureRequestsOverLimitเกินขีดจำกัด request unit ระดับโครงสร้างข้อมูล (100,000 request units ต่อหนึ่งนาที).
PartitionRequestsOverLimitเกิน ข้อจำกัด request unit ต่อพาร์ติชันหรือคีย์.
TotalRequestsOverLimitเกินข้อจำกัด request unit ระดับจักรวาล.
TotalMemoryOverLimitเกินโควต้าหน่วยความจำระดับจักรวาล.
ItemValueSizeTooLargeขนาดค่ามากเกินไป (32 KB).

ตารางต่อไปนี้แสดงรหัสสถานะจากฝั่งลูกค้า ซึ่งขณะนี้ไม่สามารถใช้ได้ใน Observability Dashboard

รหัสสถานะคำอธิบาย
InternalErrorข้อผิดพลาดภายใน.
UnpublishedPlaceคุณต้องเผยแพร่สถานที่นี้เพื่อใช้ MemoryStoreService.
InvalidClientAccessMemoryStoreService ต้องถูกเรียกจากเซิร์ฟเวอร์.
InvalidExpirationTimeฟิลด์ 'expiration' ต้องอยู่ระหว่าง 0 ถึง 3,888,000.
InvalidRequestไม่สามารถแปลงค่าเป็น json.
InvalidRequestไม่สามารถแปลง sortKey เป็นหมายเลขหรือสตริงที่ถูกต้อง.
TransformCallbackFailedไม่สามารถเรียกใช้ฟังก์ชัน callback การแปลงได้.
RequestThrottledคำขอ MemoryStores ล่าสุดเกินหนึ่งหรือหลายข้อจำกัด.
UpdateConflictเกินจำนวนครั้งสูงสุดในการลอง.

การแก้ไขปัญหา

ตารางต่อไปนี้แสดงและอธิบายวิธีแก้ไขที่แนะนำสำหรับรหัสสถานะการตอบสนองแต่ละรหัส:

ข้อผิดพลาดตัวเลือกการแก้ไขปัญหา
DataStructureRequestsOverLimit / PartitionRequestsOverLimit
  • เพิ่มแคชในท้องถิ่นโดยการบันทึกข้อมูลไปยังตัวแปรอื่นและตรวจสอบอีกครั้งหลังจากช่วงเวลา เช่น 30 วินาที.
  • ใช้แผนภูมิ Request Count by Status เพื่อตรวจสอบว่าคุณได้รับการตอบสนอง Success มากกว่าการตอบสนอง NoItemFound หรือไม่ จำกัด จำนวนครั้งที่คุณเรียก MemoryStoreService ด้วยคำขอที่ล้มเหลว.
  • ดำเนินการล่าช้าสั้นๆ ระหว่างคำขอ.
  • ปฏิบัติตาม แนวทางปฏิบัติที่ดีที่สุด รวมถึง:
    • Sharding โครงสร้างข้อมูลของคุณหากคุณได้รับการตอบสนอง DataStructureRequestsOverLimit/PartitionRequestsOverLimit จำนวนมาก.
    • Sharding คีย์ hash map ของคุณหากคุณได้รับการตอบสนอง PartitionRequestsOverLimit จำนวนมากในการเรียก hash map.
    • ลดหรือจัดกลุ่มการเรียกไปยังโครงสร้างข้อมูลเฉพาะหรือคีย์ hash map หากคุณเห็นการตอบสนอง PartitionRequestsOverLimit.
    • ดำเนินการ exponential backoff เพื่อหาความเร็วที่เหมาะสมในการส่งคำขอ.
TotalRequestsOverLimit
DataStructureItemsOverLimit
DataStructureMemoryOverLimit
TotalMemoryOverLimit
DataUpdateConflict
  • ดำเนินการล่าช้าสั้นๆ ระหว่างคำขอเพื่อหลีกเลี่ยงคำขอหลายคำขอที่อัปเดตคีย์เดียวกันในเวลาเดียวกัน.
  • สำหรับ sorted maps, ใช้ฟังก์ชัน callback ในวิธี MemoryStoreSortedMap:UpdateAsync() เพื่อยกเลิกคำขอหลังจากพยายามจำนวนหนึ่ง ตามตัวอย่างโค้ดต่อไปนี้:
  • ตัวอย่างการยกเลิกคำขอ
    local MemoryStoreService = game:GetService("MemoryStoreService")
    local map = MemoryStoreService:GetSortedMap("AuctionItems")
    function placeBid(itemKey, bidAmount)
    map:UpdateAsync(itemKey, function(item)
    item = item or { highestBid = 0 }
    if item.highestBid < bidAmount then
    item.highestBid = bidAmount
    return item
    end
    print("รายการคือ "..item.highestBid)
    return nil
    end, 1000)
    end
    placeBid("MyItem", 50)
    placeBid("MyItem", 40)
    print("เสร็จสิ้น")
  • ตรวจสอบเพื่อดูว่าคุณเรียก MemoryStoreService อย่างมีประสิทธิภาพเพื่อหลีกเลี่ยงความขัดแย้ง โดยทั่วไปคุณไม่ควรส่งคำขอมากเกินไป.
  • ลบรายการอย่างสม่ำเสมอเมื่ออ่านเสร็จโดยใช้วิธี MemoryStoreQueue:RemoveAsync() สำหรับ queues และ MemoryStoreSortedMap:RemoveAsync() สำหรับ sorted maps.
Internal Error
InvalidRequest
  • ตรวจสอบให้แน่ใจว่าคุณรวมพารามิเตอร์ที่ถูกต้องและถูกต้องในคำขอของคุณ ตัวอย่างของพารามิเตอร์ที่ไม่ถูกต้องรวมถึง:
    • สตริงว่าง
    • สตริงที่เกินขีดจำกัดความยาว
ItemValueSizeTooLarge
  • Shard หรือแบ่งค่ารายการออกเป็นหลายคีย์.
    • เพื่อจัดระเบียบคีย์ที่กลุ่ม ให้เรียงลำดับตามตัวอักษรโดยการเพิ่ม prefix ไปยังคีย์.
  • การเข้ารหัสหรือบีบอัดค่าที่เก็บไว้.

ทดสอบและแก้ไขใน Studio

ข้อมูลใน MemoryStoreService จะถูกแยกออกระหว่าง Studio และการผลิต ดังนั้นการเปลี่ยนแปลงข้อมูลใน Studio จะไม่ส่งผลต่อพฤติกรรมการผลิต ซึ่งหมายความว่าการเรียก API ของคุณจาก Studio จะไม่เข้าถึงข้อมูลการผลิต ทำให้คุณสามารถทดสอบ memory stores และฟีเจอร์ใหม่ได้อย่างปลอดภัยก่อนที่จะไปยังการผลิต

การทดสอบใน Studio มี ข้อจำกัดและโควต้า เช่นเดียวกับการผลิต สำหรับโควต้าที่คำนวณตามจำนวนผู้ใช้ โควต้าที่ได้อาจมีขนาดเล็กมากเนื่องจากคุณเป็นผู้ใช้เพียงคนเดียวสำหรับการทดสอบใน Studio เมื่อทดสอบจาก Studio คุณอาจสังเกตเห็นความหน่วงที่สูงขึ้นเล็กน้อยและอัตราข้อผิดพลาดที่สูงขึ้นเมื่อเปรียบเทียบกับการใช้งานในการผลิตเนื่องจากมีการตรวจสอบเพิ่มเติมที่ดำเนินการเพื่อยืนยันการเข้าถึงและสิทธิ์

สำหรับข้อมูลเกี่ยวกับวิธีการแก้ไขปัญหาหน่วยความจำในเกมสดหรือเมื่อทดสอบใน Studio ใช้ Developer Console.

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ