Cosmos DB Continuation Token ทำงานอย่างไร
ในตอนแรกเห็นได้ชัดว่าโทเค็นความต่อเนื่องทำอะไรใน Cosmos DB: การแนบไปกับแบบสอบถามถัดไปจะทำให้คุณได้ผลลัพธ์ชุดต่อไป แต่ "ผลลัพธ์ชุดถัดไป" หมายความว่าอย่างไรกันแน่?
มันหมายความว่า:
- ชุดผลลัพธ์ถัดไปราวกับว่าแบบสอบถามต้นฉบับถูกดำเนินการอย่างสมบูรณ์โดยไม่มีการเพจในช่วงเวลาของการสืบค้นแรก (ข้ามจำนวนเอกสารที่เหมาะสม)?
- ชุดผลลัพธ์ถัดไปราวกับว่ามีการดำเนินการสืบค้นต้นฉบับในขณะนี้ (ข้ามจำนวนเอกสารที่เหมาะสม)?
- สิ่งที่แตกต่างอย่างสิ้นเชิง?
คำตอบ 1. ดูเหมือนจะดีกว่า แต่ไม่น่าเป็นไปได้เนื่องจากเซิร์ฟเวอร์จะต้องจัดเก็บสถานะไม่ จำกัด จำนวน แต่คำตอบ 2. ก็มีปัญหาเช่นกันเนื่องจากอาจส่งผลให้เกิดความไม่สอดคล้องกันเช่นเอกสารเดียวกันอาจถูกส่งหลายครั้งในหลายหน้าหากข้อมูลพื้นฐานมีการเปลี่ยนแปลงระหว่างการสืบค้นของหน้า
คำตอบ
การดำเนินการค้นหา Cosmos DB ไม่มีสถานะที่ฝั่งเซิร์ฟเวอร์ โทเค็นความต่อเนื่องถูกใช้เพื่อสร้างสถานะของดัชนีใหม่และติดตามความคืบหน้าของการดำเนินการ
"ชุดผลลัพธ์ถัดไป" หมายถึงการสืบค้นจะดำเนินการอีกครั้งจาก "บุ๊กมาร์ก" จากการดำเนินการก่อนหน้านี้ บุ๊กมาร์กนี้จัดทำโดยโทเค็นความต่อเนื่อง
- เอกสารที่สร้างขึ้นระหว่างการต่อเนื่อง
อาจส่งคืนหรือไม่ก็ได้ขึ้นอยู่กับตำแหน่งของการแทรกและคิวรีที่ดำเนินการ
ตัวอย่าง:
เลือก * จาก c สั่งซื้อโดย c.someValue ASC
ให้เราถือว่าบุ๊กมาร์กมี someValue = 10 เครื่องมือค้นหาจะดำเนินการประมวลผลต่อโดยใช้โทเค็นต่อเนื่องโดยที่ someValue = 10
หากคุณต้องแทรกเอกสารใหม่โดยมี someValue = 5 อยู่ระหว่างการดำเนินการค้นหาเอกสารนั้นจะไม่ปรากฏในผลลัพธ์ชุดถัดไป
หากเอกสารใหม่ถูกแทรกใน "เพจ" ที่เป็น> บุ๊กมาร์กเอกสารนั้นจะปรากฏในผลลัพธ์ชุดถัดไป
- อัปเดตเอกสารระหว่างการดำเนินการต่อ
ตรรกะเดียวกันกับข้างต้นใช้กับการอัปเดตเช่นกัน (ดู # 4)
- เอกสารถูกลบในระหว่างการดำเนินการต่อ
ซึ่งจะไม่ปรากฏในผลลัพธ์ชุดถัดไป
- โอกาสที่จะซ้ำกัน
ในกรณีของคำถามด้านล่างนี้
เลือก * จาก c สั่งซื้อโดย c.remainingInventory ASC
หากพื้นที่ที่เหลือได้รับการอัปเดตหลังจากผลลัพธ์ชุดแรกและตอนนี้ตรงตามเกณฑ์ ORDER BY สำหรับหน้าที่สองเอกสารจะปรากฏขึ้นอีกครั้ง
Cosmos DB ไม่มีการแยกสแน็ปช็อตในหน้าแบบสอบถาม อย่างไรก็ตามตามทีมผลิตภัณฑ์นี่เป็นสถานการณ์ที่ผิดปกติอย่างไม่น่าเชื่อเนื่องจากการสอบถามเกี่ยวกับความต่อเนื่องนั้นรวดเร็วมากและในกรณีส่วนใหญ่ผลการสืบค้นทั้งหมดจะถูกส่งกลับในหน้าแรก
จากการทดลองเบื้องต้นคำตอบน่าจะเป็นตัวเลือก # 2 หรือแม่นยำกว่า:
- เอกสารที่สร้างขึ้นหลังจากแสดงหน้าแรกสามารถดูได้ในหน้าถัดไป
- เอกสารที่อัปเดตหลังจากแสดงหน้าแรกสามารถดูได้ในหน้าถัดไป
- เอกสารที่ถูกลบหลังจากแสดงหน้าแรกจะถูกละไว้ในหน้าถัดไป
- เอกสารจะไม่ถูกส่งซ้ำสองครั้ง
คำสั่งแรกข้างต้นตรงกันข้ามจาก MSFT ( cf เลยคำตอบของ Kalyan) จะเป็นการดีที่จะได้รับคำตอบที่มีคุณภาพมากขึ้นจากทีม Cosmos DB ซึ่งระบุความหมายของการดึงหน้าอย่างแม่นยำ นี้อาจจะไม่เป็นสิ่งที่สำคัญมากสำหรับการแสดงข้อมูลใน UI แต่อาจจะเป็นสิ่งจำเป็นสำหรับการประมวลผลข้อมูลในแบ็กเอนด์ที่ได้รับว่ามีไม่ได้ดูเหมือนจะเป็นวิธีการใด ๆ ที่ปิดการใช้งานเพจเมื่อดำเนินการแบบสอบถาม ( cf ได้ มีคำสั่งการทำธุรกรรมในที่เป็นไปได้ คอสมอส DB? )
วิธีการทดลอง
ฉันใช้Cosmos DB Explorerของ Sacha Bruttin เพื่อค้นหาคอลเล็กชันที่มีเอกสาร 5 ชุดเนื่องจากเครื่องมือนี้ช่วยให้สามารถเล่นกับขนาดหน้าและตัวเลือกคำขออื่น ๆ ได้
ขนาดหน้าถูกตั้งค่าเป็น 1 และเปิดใช้งานการสืบค้นข้ามพาร์ติชัน คำสั่งที่แตกต่างกันกำลังพยายามเช่นหรือSELECT * FROM c
SELECT * FROM c ORDER BY c.name
หลังจากเรียกค้นหน้า 1 เอกสารใหม่จะถูกแทรกและเอกสารที่มีอยู่บางส่วน (รวมถึงเอกสารที่ควรปรากฏในหน้าถัดไป) ได้รับการอัปเดตและลบออก จากนั้นเรียกดูหน้าถัดไปทั้งหมดตามลำดับ
(ดูซอร์สโค้ดของเครื่องมืออย่างรวดเร็วที่ยืนยันResponseContinuationTokenLimitInKb
ว่าไม่ได้ตั้งค่าไว้)