MemoryStoreService เป็นบริการข้อมูลผ่านทางที่มีประสิทธิภาพสูงและความล่าช้าต่ำที่ให้การจัดเก็บข้อมูลในหน่วยความจำที่รวดเร็วในการเข้าถึงจากทุกเซิร์ฟเวอร์ในเซสชันสด คลังหน่วยความจํา เหมาะสำหรับข้อมูลที่เปลี่ยนแปลงอย่างรวดเร็วและไม่จำเป็นต้องมีความทนทานเพราะพวกเขาจะเข้าถึงได้เร็วกว่าและหายไปเมื่อถึงอายุการใช้งานสูงสุดสำหรับข้อมูลที่ต้องการเก็บไว้ในระหว่างเซสชัน ให้ใช้ คลังข้อมูล
โครงสร้างข้อมูล
แทนที่จะเข้าถึงข้อมูลดิบโดยตรง โครงสร้างข้อมูลพื้นฐานสามแบบจะถูกแชร์ข้ามเซิร์ฟเวอร์เพื่อการประมวลผลอย่างรวดเร็ว: แผนที่เรียงลําดับ , คิว และ แผนที่แฮชโครงสร้างข้อมูลแต่ละอย่างเหมาะสำหรับกรณีการใช้งานบางอย่าง:
- การจับคู่ตามทักษะ - บันทึกข้อมูลผู้ใช้ เช่น ระดับทักษะ ในคิวร่วมกันระหว่างเซิร์ฟเวอร์ และใช้เซิร์ฟเวอร์ล็อบบี้เพื่อดำเนินการจับคู่เป็นระยะเวลาเป็นประจำ
- การซื้อขายและประมูลข้ามเซิร์ฟเวอร์ - เปิดใช้งานการซื้อขายแบบทั่วถึงระหว่างเซิร์ฟเวอร์ต่างๆ ซึ่งผู้ใช้สามารถเสนอราคาสินค้าที่มีราคาเปลี่ยนแปลงแบบเรียลไทม์ได้ ด้วยแผนภูมิคีย์-ค่าคู่ที่เรียงลําดับได้
- ลีดเดอร์บอร์ดระดับโลก - เก็บและอัปเดตอันดับผู้ใช้บนลีดเดอร์บอร์ดร่วมกันภายในแผนที่ที่เรียงลําดับได้ แผนที่จัดเรียง * คลังสินค้าร่วม - บันทึกรายการสินค้าและสถิติในแผนที่คลังสินค้าร่วม ที่ผู้ใช้สามารถใช้รายการสินค้าพร้อมกันได้ระหว่างกัน * แคชสําหรับข้อมูลถาวร - ซิงค์และคัดลอกข้อมูลถาวรของคุณในคลังข้อมูลไปยังคลังหน่วยความจําที่สามารถใช้เป็นแคชและปรับปรุงประสิทธิภาพประสบการณ์ของคุณ
โดยทั่วไป หากคุณต้องการเข้าถึงข้อมูลตามกุญแจที่เฉพาะเจาะจงใช้แผนที่ความเร็วหากต้องการให้ข้อมูลดังกล่าวถูกสั่งซื้อให้ใช้แผนที่เรียงลําดับหากต้องการประมวลผลข้อมูลในลำดับเฉพาะ ให้ใช้คิว
ข้อจํากัดและจํานวนเงินที่กำหนด
การดำเนินการตัวเก็บหน่วยความจำมีค่าใช้จ่ายของการใช้หน่วยความจำสำหรับขนาดหน่วยความจำ คำขอ API และขนาดโครงสร้างข้อมูล
คลังหน่วยความจํามีนโยบายการเนรเทศตามเวลาหมดอายุ ซึ่งเรียกว่าเวลาที่มีชีวิต (TTL)ไอเทมจะถูกไล่ออกหลังจากหมดอายุและความจําเป็นของหน่วยความจําจะถูกปลดปล่อยสําหรับการบันทึกใหม่เมื่อคุณถึงขีดจํากัดความจํา คําขอเขียนทั้งหมดที่ตามมาจะล้มเหลวจนกว่าไอเทมจะหมดอายุหรือคุณจะลบพวกเขาด้วยตนเอง
ความจุของหน่วยความจำส่วนสัดส่วน
ขีดจํากัดความจําเพิ่มจำนวนความจําทั้งหมดที่ประสบการณ์สามารถใช้ได้มันไม่ใช่ค่าคงที่แทนที่จะเปลี่ยนไปตามเวลาขึ้นอยู่กับจํานวนผู้ใช้ในประสบการณ์ตามสูตรต่อไปนี้: 64KB + 1KB * [จํานวนผู้ใช้] ความจำกัดใช้กับระดับประสบการณ์แทนระดับเซิร์ฟเวอร์
เมื่อผู้ใช้เข้าร่วมประสบการณ์แล้ว ความจุหน่วยความจำเพิ่มเติมที่เพิ่มขึ้นจะพร้อมใช้งานทันทีเมื่อผู้ใช้ออกจากประสบการณ์แล้ว ความจุจะไม่ลดลงทันทีมีระยะเวลาการย้อนกลับของแปดวันก่อนที่ความจำกัดจะประเมินค่าต่ำกว่า
หลังจากประสบการณ์ของคุณถึงขีดจํากัดขนาดหน่วยความจําแล้ว คําขอ API ใดๆ ที่เพิ่มขนาดหน่วยความจําจะล้มเหลวเสมอคำขอที่ลดขนาดหรือไม่เปลี่ยนขนาดหน่วยความจำยังคงประสบความสำเร็จ
ด้วยแดชบอร์ด การสังเกตการณ์ คุณสามารถดูความจุหน่วยความจำของประสบการณ์ของคุณในเวลาจริงโดยใช้แผนภูมิ การใช้หน่วยความจำ
ขีดจํากัดคําขอ API
สำหรับขีดจํากัดคําขอ API มีความจําเป็นของ หน่วยคําขอ ที่ใช้สําหรับการโทร API ทั้งหมด MemoryStoreServiceความจุคือ 1000 + 100 * [จํานวนผู้ใช้พร้อมกัน] หน่วยคําขอต่อนาที
การโทร API ส่วนใหญ่ใช้เพียงหน่วยคำขอเดียวเท่านั้น โดยมีข้อยกเว้นเล็กน้อย:
MemoryStoreSortedMap:GetRangeAsync()
บริโภคหน่วยตามจํานวนรายการที่ส่งคืนตัวอย่างเช่น หากวิธีนี้ส่งคืนรายการ 10 รายการ การโทรจะนับเป็น 10 หน่วยคำขอหากส่งคืนคำตอบว่างเปล่า จะนับเป็นหน่วยคำขอหนึ่ง
ใช้หน่วยตามจํานวนรายการที่ส่งคืนเช่นเดียวกับ MemoryStoreSortedMap:GetRangeAsync() แต่ใช้หน่วยเพิ่มเติมทุกๆ สองวินาทีในระหว่างการอ่านระบุเวลาอ่านสูงสุดด้วยพารามิเตอร์ waitTimeout
MemoryStoreHashMap:UpdateAsync()
ใช้อย่างน้อยสองหน่วย
MemoryStoreHashMap:ListItemsAsync()
ใช้ [จํานวนพาร์ติชันที่สแกน] + [รายการที่ส่งคืน] หน่วย
ความจำกัดของคำขอยังถูกใช้ในระดับประสบการณ์แทนระดับเซิร์ฟเวอร์สิ่งนี้ให้ความยืดหยุ่นในการจัดสรรคำขอระหว่างเซิร์ฟเวอร์ตราบใดที่อัตราคำขอรวมไม่เกินขีดจำกัดหากคุณเกินความจำกัด คุณจะได้รับคำตอบข้อผิดพลาดเมื่อบริการลดความเร็วคำขอของคุณ
ด้วยคุณสมบัติ การสังเกตได้ ที่มีอยู่ คุณสามารถดูความต้องการของหน่วยคำขอของประสบการณ์ของคุณในเวลาจริงได้
ขีดจํากัดขนาดโครงสร้างข้อมูล
สำหรับแผนที่หรือคิวเรียงลําดับเดียว จะมีขีดจํากัดขนาดและจํานวนรายการต่อไปนี้:
- จํานวนรายการสูงสุด: 1,000,000
- ขนาดสูงสุดทั้งหมด (รวมถึงกุญแจสําหรับแผนที่ที่จัดเรียง): 100 MB
ขีดจํากัดต่อส่วนหนึ่ง
ดู ขีดจํากัดต่อส่วน .
แนวทางที่ดีที่สุด
เพื่อให้การใช้งานหน่วยความจําของคุณเป็นไปอย่างมีประสิทธิภาพและหลีกเลี่ยงการถึงขีดจํากัด ให้ทําตามแนวทางที่ดีที่สุดเหล่านี้:
ลบรายการที่ประมวลผลแล้ว: ทำความสะอาดอย่างต่อเนื่องโดยใช้วิธี MemoryStoreQueue:RemoveAsync() สำหรับคิวและ MemoryStoreSortedMap:RemoveAsync() สำหรับแผนที่ที่จัดเรียงได้สามารถปลดปล่อยหน่วยความจำและรักษาโครงสร้างข้อมูลให้ทันเวลา
ตั้งเวลาหมดอายุเป็นระยะเวลาที่เล็กที่สุดเท่าที่เป็นไปได้เมื่อเพิ่มข้อมูล: แม้ว่าเวลาหมดอายุเริ่มต้นจะเป็น 45 วันสำหรับทั้ง MemoryStoreQueue:AddAsync() และ MemoryStoreSortedMap:SetAsync() แต่การตั้งเวลาที่สั้นที่สุดจะสามารถล้างข้อมูลเก่าได้โดยอัตโนมัติเพื่อป้องกันไม่ให้พวกเขาเติมความจุหน่วยความจำของคุณ
- อย่าเก็บข้อมูลจํานวนมากด้วยระยะเวลาหมดอายุที่ยาวนานเนื่องจากมีความเสี่ยงที่จะเกินขีดจํากัดความทรงจําและอาจทําให้เกิดปัญหาที่อาจทําลายประสบการณ์ทั้งหมดของคุณ
- เสมอเลือกที่จะลบไอเทมที่ไม่จำเป็นโดยเฉพาะหรือตั้งเวลาหมดอายุไอเทมสั้น ๆ
- โดยทั่วไปคุณควรใช้การลบโดยเฉพาะเพื่อปล่อยหน่วยความจําและการหมดอายุไอเทมเป็นเครื่องมือความปลอดภัยเพื่อป้องกันไม่ให้ไอเทมที่ไม่ได้ใช้งานเป็นเวลานานเป็นเวลานาน
เก็บค่าที่จำเป็นเท่านั้นในหน่วยความจำ
ตัวอย่างเช่น สำหรับประสบการณ์บ้านประมูลคุณต้องรักษาเส้นเดิมพันสูงสุดเท่านั้นคุณสามารถใช้ MemoryStoreSortedMap:UpdateAsync() บนกุญแจหนึ่งเพื่อรักษาราคาสูงสุดไว้แทนที่จะรักษาราคาทั้งหมดในโครงสร้างข้อมูลของคุณ
ใช้ การยกเลิกอย่างก้าวกระโดด เพื่อช่วยให้อยู่ภายใต้ขีดจํากัดคำขอ API ได้
ตัวอย่างเช่น หากคุณได้รับ DataUpdateConflict คุณอาจลองอีกครั้งหลังจากสองวินาทีแล้วสี่ แปด ฯลฯแทนที่จะส่งคำขออย่างต่อเนื่องไปยัง MemoryStoreService เพื่อรับคำตอบที่ถูกต้อง
แยกโครงสร้างข้อมูลยักษ์เป็นหลายโครงสร้างขนาดเล็กโดย แยกส่วน
มักง่ายกว่าที่จะจัดการข้อมูลในโครงสร้างขนาดเล็กแทนที่จะเก็บทุกอย่างในโครงสร้างข้อมูลขนาดใหญ่วิธีนี้ยังสามารถช่วยหลีกเลี่ยงการใช้งานและข้อจํากัดอัตราได้ตัวอย่างเช่น หากคุณมีแผนที่จัดเรียงที่ใช้คํานําหน้าสําหรับกุญแจของมัน ให้พิจารณาแยกแยะแต่ละคํานําหน้าออกเป็นแผนที่จัดเรียงเองสำหรับประสบการณ์ที่ได้รับความนิยมอย่างมาก คุณอาจแยกผู้ใช้ออกเป็นหลายแผนที่ตามตัวเลขสุดท้ายของรหัสผู้ใช้ของพวกเขา
บีบอัดมูลค่าที่เก็บไว้
ตัวอย่างเช่น พิจารณาใช้อัลกอริทึ่ม LZW เพื่อลดขนาดของค่าที่เก็บไว้
การสังเกตเห็น
แดชบอร์ดการสังเกตการณ์ ให้ข้อมูลและการวิเคราะห์สำหรับการตรวจสอบและแก้ไขปัญหาการใช้เครื่องจัดเก็บหน่วยความจําของคุณด้วยการอัปเดตแผนภาพแบบเรียลไทม์เกี่ยวกับแง่มุมต่างๆ ของการใช้หน่วยความจําและคําขอ API คุณสามารถติดตามรูปแบบการใช้หน่วยความจําของประสบการณ์ของคุณ, ดูความคิดเห็นปัจจุบันที่ได้รับการจัดสรร, ตรวจสอบสถานะ API และระบุปัญหาที่อาจเกิดขึ้นเพื่อการปรับปรุงประสิทธิภาพ
ตารางต่อไปนี้ระบุรหัสสถานะของคำตอบ API ทั้งหมดที่มีอยู่ในแดชบอร์ดความสามารถในการสังเกตการณ์ จํานวนคําขอตามสถานะ และ คําขอโดย API x สถานะ ชาร์ทสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการแก้ไขข้อผิดพลาดเหล่านี้ดูที่ การแก้ปัญหาสำหรับความจำกัดหรือขีดจํากัดเฉพาะที่เกี่ยวข้องกับข้อผิดพลาด ดู ข้อจํากัดและความจำกัด
รหัสสถานะ | คําอธิบาย |
---|---|
สําเร็จ | สำเร็จ |
ความจําของโครงสร้างข้อมูลเกินขีดจํากัด | เกินขีดจํากัดขนาดหน่วยความจําระดับโครงสร้างข้อมูล (100MB) |
ข้อขัดแย้งการอัปเดตข้อมูล | ความขัดแย้งเนื่องจากการอัปเดตพร้อมกัน |
ปฏิเสธการเข้าถึง | ไม่ได้รับอนุญาตให้เข้าถึงข้อมูลประสบการณ์ คำขอนี้ไม่ใช้หน่วยคำขอหรือใช้ความจำกัดของความถี่ |
ข้อผิดพลาดภายใน | ข้อผิดพลาดภายใน |
คำขอไม่ถูกต้อง | คำขอไม่มีข้อมูลที่จำเป็นหรือมีข้อมูลที่ผิดรูปแบบ |
ไอเทมโครงสร้างข้อมูลเกินขีดจำกัด | เกินขีดจํากัดจํานวนระดับโครงสร้างข้อมูล (1M) |
ไม่พบไอเทม | ไม่พบรายการใน MemoryStoreQueue:ReadAsync() หรือ MemoryStoreSortedMap:UpdateAsync()``ReadAsync() โหวตทุก 2 วินาทีและส่งรหัสสถานะนี้จนกว่าจะพบรายการในคิว |
คำขอโครงสร้างข้อมูลเกินขีดจำกัด | เกินขีดจํากัดคำขอระดับโครงสร้างข้อมูล (100,000 คำขอต่อนาที) |
คำขอปาร์ติชันเกินขีดจํากัด | เกินขีดจํากัดคําขอพาร์ติชัน |
คำขอทั้งหมดเกินขีดจํากัด | เกินขีดจํากัดหน่วยคําขอระดับจักรวาล |
ความจําทั้งหมดเกินขีดจํากัด | เกินขีดจํากัดความทรงจําระดับจักรวาล |
ขนาดมูลค่าไอเทมใหญ่เกินไป | ขนาดค่าเกินขีดจํากัด (32KB) |
ตารางต่อไปนี้ระบุรหัสสถานะจากด้านไคลเอนต์ซึ่งไม่สามารถใช้ได้ในปัจจุบันในแดชบอร์ดความสามารถในการสังเกต
รหัสสถานะ | คําอธิบาย |
---|---|
ข้อผิดพลาดภายใน | ข้อผิดพลาดภายใน |
สถานที่ที่ไม่เผยแพร่ | คุณต้องเผยแพร่สถานที่นี้เพื่อใช้ MemoryStoreService |
การเข้าถึงลูกค้าไม่ถูกต้อง | ต้องเรียกบริการ MemoryStore จากเซิร์ฟเวอร์ |
เวลาหมดอายุไม่ถูกต้อง | เวลาของฟิลด์ 'หมดอายุ' ต้องอยู่ระหว่าง 0 และ 3,888,000 |
คำขอไม่ถูกต้อง | ไม่สามารถแปลงค่าเป็น json ได้ |
คำขอไม่ถูกต้อง | ไม่สามารถแปลง sortKey เป็นหมายเลขหรือสตริงที่ถูกต้องได้ |
เปลี่ยนการโทรกลับล้มเหลว | ไม่สามารถเรียกฟังก์ชันการโทรกลับการเปลี่ยนแปลงได้ |
คําขอลดความเร็ว | คำขอเก็บหน่วยความจําล่าสุดได้รับหนึ่งหรือมากกว่าขีดจํากัด |
อัปเดตความขัดแย้ง | เกินจํานวนความพยายามสูงสุด |
การแก้ปัญหา
ตารางต่อไปนี้ระบุรายการและอธิบายโซลูชันที่แนะนำสำหรับรหัสสถานะการตอบสนองแต่ละรหัส:
ข้อผิดพลาด | ตัวเลือกการแก้ปัญหา |
---|---|
คำขอโครงสร้างข้อมูลเกินขีดจํากัด / คำขอการแบ่งส่วนเกินขีดจํากัด |
|
คำขอทั้งหมดเกินขีดจํากัด | |
ไอเทมโครงสร้างข้อมูลเกินขีดจำกัด |
|
ความจําของโครงสร้างข้อมูลเกินขีดจํากัด | |
ความจําทั้งหมดเกินขีดจํากัด | |
ข้อขัดแย้งการอัปเดตข้อมูล |
ตรวจสอบเพื่อดูว่าคุณกําลังโทร MemoryStoreService อย่างมีประสิทธิภาพเพื่อหลีกเลี่ยงความขัดแย้งในทางที่ดีคุณไม่ควรส่งคำขอมากเกินไป: ลบรายการอย่างต่อเนื่องเมื่ออ่านแล้วโดยใช้วิธี MemoryStoreQueue:RemoveAsync() สำหรับคิวและ MemoryStoreSortedMap:RemoveAsync() สำหรับแผนที่ที่จัดเรียง |
ข้อผิดพลาดภายใน |
|
คำขอไม่ถูกต้อง |
|
ขนาดมูลค่าไอเทมใหญ่เกินไป |
|
ทดสอบและแก้ไขข้อผิดพลาดใน Studio
ข้อมูลใน MemoryStoreService ถูกแยกระหว่าง Studio และการผลิตดังนั้นการเปลี่ยนแปลงข้อมูลใน Studio จะไม่ส่งผลต่อพฤติกรรมการผลิตซึ่งหมายความว่าการโทร API จาก Studio ไม่สามารถเข้าถึงข้อมูลการผลิตได้ ทำให้คุณสามารถทดสอบความจำได้อย่างปลอดภัยและคุณสมบัติใหม่ก่อนที่จะไปสู่การผลิตได้
การทดสอบสตูดิโอมีข้อจํากัดและจํานวนเดียวกับ การผลิต เช่นเดียวกับการผลิตสำหรับค่าใช้จ่ายที่คำนวณตามจํานวนผู้ใช้ค่าใช้จ่ายที่ได้รับอาจเล็กมากเนื่องจากคุณเป็นผู้ใช้เพียงรายเดียวสําหรับการทดสอบ Studioเมื่อทดสอบจากสตูดิโอ คุณอาจสังเกตเห็นความแลคและอัตราการเกิดข้อผิดพลาดที่สูงขึ้นเล็กน้อยเมื่อเทียบกับการใช้งานในการผลิตเนื่องจากการตรวจสอบเพิ่มเติมบางอย่างที่ดำเนินการเพื่อตรวจสอบการเข้าถึงและสิทธิ์
สำหรับข้อมูลเกี่ยวกับวิธีการแก้ไขข้อผิดพลาดในการจัดเก็บหน่วยความจําในประสบการณ์สดหรือเมื่อทดสอบในสตูดิโอใช้ คอนโซลนักพัฒนา