Cosmos DB Continuation Token ทำงานอย่างไร

Aug 17 2020

ในตอนแรกเห็นได้ชัดว่าโทเค็นความต่อเนื่องทำอะไรใน Cosmos DB: การแนบไปกับแบบสอบถามถัดไปจะทำให้คุณได้ผลลัพธ์ชุดต่อไป แต่ "ผลลัพธ์ชุดถัดไป" หมายความว่าอย่างไรกันแน่?

มันหมายความว่า:

  1. ชุดผลลัพธ์ถัดไปราวกับว่าแบบสอบถามต้นฉบับถูกดำเนินการอย่างสมบูรณ์โดยไม่มีการเพจในช่วงเวลาของการสืบค้นแรก (ข้ามจำนวนเอกสารที่เหมาะสม)?
  2. ชุดผลลัพธ์ถัดไปราวกับว่ามีการดำเนินการสืบค้นต้นฉบับในขณะนี้ (ข้ามจำนวนเอกสารที่เหมาะสม)?
  3. สิ่งที่แตกต่างอย่างสิ้นเชิง?

คำตอบ 1. ดูเหมือนจะดีกว่า แต่ไม่น่าเป็นไปได้เนื่องจากเซิร์ฟเวอร์จะต้องจัดเก็บสถานะไม่ จำกัด จำนวน แต่คำตอบ 2. ก็มีปัญหาเช่นกันเนื่องจากอาจส่งผลให้เกิดความไม่สอดคล้องกันเช่นเอกสารเดียวกันอาจถูกส่งหลายครั้งในหลายหน้าหากข้อมูลพื้นฐานมีการเปลี่ยนแปลงระหว่างการสืบค้นของหน้า

คำตอบ

2 KalyanChanumolu-MSFT Aug 21 2020 at 13:51

การดำเนินการค้นหา Cosmos DB ไม่มีสถานะที่ฝั่งเซิร์ฟเวอร์ โทเค็นความต่อเนื่องถูกใช้เพื่อสร้างสถานะของดัชนีใหม่และติดตามความคืบหน้าของการดำเนินการ

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

  1. เอกสารที่สร้างขึ้นระหว่างการต่อเนื่อง

อาจส่งคืนหรือไม่ก็ได้ขึ้นอยู่กับตำแหน่งของการแทรกและคิวรีที่ดำเนินการ

ตัวอย่าง:

เลือก * จาก c สั่งซื้อโดย c.someValue ASC

ให้เราถือว่าบุ๊กมาร์กมี someValue = 10 เครื่องมือค้นหาจะดำเนินการประมวลผลต่อโดยใช้โทเค็นต่อเนื่องโดยที่ someValue = 10

หากคุณต้องแทรกเอกสารใหม่โดยมี someValue = 5 อยู่ระหว่างการดำเนินการค้นหาเอกสารนั้นจะไม่ปรากฏในผลลัพธ์ชุดถัดไป

หากเอกสารใหม่ถูกแทรกใน "เพจ" ที่เป็น> บุ๊กมาร์กเอกสารนั้นจะปรากฏในผลลัพธ์ชุดถัดไป

  1. อัปเดตเอกสารระหว่างการดำเนินการต่อ

ตรรกะเดียวกันกับข้างต้นใช้กับการอัปเดตเช่นกัน (ดู # 4)

  1. เอกสารถูกลบในระหว่างการดำเนินการต่อ

ซึ่งจะไม่ปรากฏในผลลัพธ์ชุดถัดไป

  1. โอกาสที่จะซ้ำกัน

ในกรณีของคำถามด้านล่างนี้

เลือก * จาก c สั่งซื้อโดย c.remainingInventory ASC

หากพื้นที่ที่เหลือได้รับการอัปเดตหลังจากผลลัพธ์ชุดแรกและตอนนี้ตรงตามเกณฑ์ ORDER BY สำหรับหน้าที่สองเอกสารจะปรากฏขึ้นอีกครั้ง


Cosmos DB ไม่มีการแยกสแน็ปช็อตในหน้าแบบสอบถาม อย่างไรก็ตามตามทีมผลิตภัณฑ์นี่เป็นสถานการณ์ที่ผิดปกติอย่างไม่น่าเชื่อเนื่องจากการสอบถามเกี่ยวกับความต่อเนื่องนั้นรวดเร็วมากและในกรณีส่วนใหญ่ผลการสืบค้นทั้งหมดจะถูกส่งกลับในหน้าแรก

MoB. Aug 24 2020 at 09:10

จากการทดลองเบื้องต้นคำตอบน่าจะเป็นตัวเลือก # 2 หรือแม่นยำกว่า:

  1. เอกสารที่สร้างขึ้นหลังจากแสดงหน้าแรกสามารถดูได้ในหน้าถัดไป
  2. เอกสารที่อัปเดตหลังจากแสดงหน้าแรกสามารถดูได้ในหน้าถัดไป
  3. เอกสารที่ถูกลบหลังจากแสดงหน้าแรกจะถูกละไว้ในหน้าถัดไป
  4. เอกสารจะไม่ถูกส่งซ้ำสองครั้ง

คำสั่งแรกข้างต้นตรงกันข้ามจาก MSFT ( cf เลยคำตอบของ Kalyan) จะเป็นการดีที่จะได้รับคำตอบที่มีคุณภาพมากขึ้นจากทีม Cosmos DB ซึ่งระบุความหมายของการดึงหน้าอย่างแม่นยำ นี้อาจจะไม่เป็นสิ่งที่สำคัญมากสำหรับการแสดงข้อมูลใน UI แต่อาจจะเป็นสิ่งจำเป็นสำหรับการประมวลผลข้อมูลในแบ็กเอนด์ที่ได้รับว่ามีไม่ได้ดูเหมือนจะเป็นวิธีการใด ๆ ที่ปิดการใช้งานเพจเมื่อดำเนินการแบบสอบถาม ( cf ได้ มีคำสั่งการทำธุรกรรมในที่เป็นไปได้ คอสมอส DB? )


วิธีการทดลอง

ฉันใช้Cosmos DB Explorerของ Sacha Bruttin เพื่อค้นหาคอลเล็กชันที่มีเอกสาร 5 ชุดเนื่องจากเครื่องมือนี้ช่วยให้สามารถเล่นกับขนาดหน้าและตัวเลือกคำขออื่น ๆ ได้

ขนาดหน้าถูกตั้งค่าเป็น 1 และเปิดใช้งานการสืบค้นข้ามพาร์ติชัน คำสั่งที่แตกต่างกันกำลังพยายามเช่นหรือSELECT * FROM cSELECT * FROM c ORDER BY c.name

หลังจากเรียกค้นหน้า 1 เอกสารใหม่จะถูกแทรกและเอกสารที่มีอยู่บางส่วน (รวมถึงเอกสารที่ควรปรากฏในหน้าถัดไป) ได้รับการอัปเดตและลบออก จากนั้นเรียกดูหน้าถัดไปทั้งหมดตามลำดับ

(ดูซอร์สโค้ดของเครื่องมืออย่างรวดเร็วที่ยืนยันResponseContinuationTokenLimitInKbว่าไม่ได้ตั้งค่าไว้)