Bagaimana cara kerja Cosmos DB Continuation Token?

Aug 17 2020

Pada pandangan pertama, sudah jelas apa yang dilakukan token lanjutan di Cosmos DB: melampirkannya ke kueri berikutnya memberi Anda rangkaian hasil berikutnya. Tapi apa sebenarnya arti "rangkaian hasil berikutnya"?

Apakah itu berarti:

  1. kumpulan hasil berikutnya seolah-olah kueri asli telah dieksekusi sepenuhnya tanpa paging pada saat kueri pertama (melewatkan jumlah dokumen yang sesuai)?
  2. kumpulan hasil berikutnya seolah-olah kueri asli telah dieksekusi sekarang (melompati jumlah dokumen yang sesuai)?
  3. Sesuatu yang sama sekali berbeda?

Jawaban 1. tampaknya lebih disukai tetapi tidak mungkin karena server perlu menyimpan status dalam jumlah yang tidak terbatas. Tetapi Jawaban 2. juga bermasalah karena dapat mengakibatkan ketidakkonsistenan, misalnya dokumen yang sama dapat disajikan beberapa kali di seluruh halaman, jika data yang mendasarinya telah berubah di antara kueri halaman.

Jawaban

2 KalyanChanumolu-MSFT Aug 21 2020 at 13:51

Eksekusi kueri Cosmos DB tidak memiliki kewarganegaraan di sisi server. Token kelanjutan digunakan untuk membuat ulang status indeks dan melacak kemajuan eksekusi.

"Kumpulan hasil berikutnya" berarti, kueri dijalankan lagi dari "bookmark" dari eksekusi sebelumnya. Bookmark ini disediakan oleh token kelanjutan.

  1. Dokumen dibuat selama kelanjutan

Mereka mungkin atau mungkin tidak dikembalikan tergantung pada posisi penyisipan dan permintaan yang sedang dieksekusi.

Contoh:

PILIH * DARI c ORDER OLEH c.someValue ASC

Mari kita asumsikan bookmark memiliki someValue = 10, mesin kueri melanjutkan pemrosesan menggunakan token kelanjutan di mana someValue = 10.

Jika Anda memasukkan dokumen baru dengan someValue = 5 di antara eksekusi kueri, itu tidak akan muncul di rangkaian hasil berikutnya.

Jika dokumen baru dimasukkan ke dalam "halaman" yaitu> bookmark, itu akan muncul di hasil set berikutnya

  1. Dokumen diperbarui selama kelanjutan

Logika yang sama seperti di atas juga berlaku untuk pembaruan (Lihat # 4)

  1. Dokumen dihapus selama kelanjutan

Mereka tidak akan muncul di rangkaian hasil berikutnya.

  1. Kemungkinan duplikat

Dalam kasus kueri di bawah ini,

PILIH * DARI c ORDER OLEH c.remainingInventory ASC

Jika sisaInventory telah diperbarui setelah kumpulan hasil pertama dan sekarang memenuhi kriteria ORDER BY untuk halaman kedua, dokumen akan muncul lagi.


Cosmos DB tidak menyediakan isolasi snapshot di seluruh halaman kueri. Namun, menurut tim produk, ini adalah skenario yang sangat tidak umum karena kueri atas kelanjutan sangat cepat dan dalam kebanyakan kasus semua hasil kueri ditampilkan di halaman pertama.

MoB. Aug 24 2020 at 09:10

Berdasarkan percobaan pendahuluan, jawabannya tampaknya menjadi pilihan # 2, atau lebih tepatnya:

  1. Dokumen yang dibuat setelah menyajikan halaman pertama dapat diamati di halaman berikutnya
  2. Dokumen yang diperbarui setelah menyajikan halaman pertama dapat diamati pada halaman berikutnya
  3. Dokumen yang dihapus setelah menyajikan halaman pertama dihilangkan di halaman berikutnya
  4. Dokumen tidak pernah disajikan dua kali

Pernyataan pertama di atas bertentangan dengan informasi dari MSFT ( lih. Jawaban Kalyan). Akan sangat bagus untuk mendapatkan jawaban yang lebih berkualitas dari Tim Cosmos DB yang menentukan dengan tepat semantik mengambil halaman. Ini mungkin tidak terlalu penting untuk menampilkan data di UI, tetapi mungkin penting untuk pemrosesan data di backend, karena tampaknya tidak ada cara untuk menonaktifkan paging saat melakukan kueri ( cf. Apakah kueri transaksional mungkin di Cosmos DB? ).


Metode eksperimen

Saya menggunakan Sacha Bruttin's Cosmos DB Explorer untuk meminta koleksi dengan 5 dokumen, karena alat ini memungkinkan bermain-main dengan ukuran halaman dan opsi permintaan lainnya.

Ukuran halaman disetel ke 1, dan Kueri Lintas Partisi diaktifkan. Pertanyaan yang berbeda telah dicoba, misalnya SELECT * FROM catau SELECT * FROM c ORDER BY c.name.

Setelah mengambil halaman 1, dokumen baru disisipkan, dan beberapa dokumen yang ada (termasuk dokumen yang akan muncul di halaman berikutnya) diperbarui dan dihapus. Kemudian semua halaman berikutnya diambil secara berurutan.

(Lihat sekilas kode sumber alat yang dikonfirmasi bahwa ResponseContinuationTokenLimitInKbtidak disetel.)