Bagaimana cara kerja Cosmos DB Continuation Token?
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:
- kumpulan hasil berikutnya seolah-olah kueri asli telah dieksekusi sepenuhnya tanpa paging pada saat kueri pertama (melewatkan jumlah dokumen yang sesuai)?
- kumpulan hasil berikutnya seolah-olah kueri asli telah dieksekusi sekarang (melompati jumlah dokumen yang sesuai)?
- 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
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.
- 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
- Dokumen diperbarui selama kelanjutan
Logika yang sama seperti di atas juga berlaku untuk pembaruan (Lihat # 4)
- Dokumen dihapus selama kelanjutan
Mereka tidak akan muncul di rangkaian hasil berikutnya.
- 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.
Berdasarkan percobaan pendahuluan, jawabannya tampaknya menjadi pilihan # 2, atau lebih tepatnya:
- Dokumen yang dibuat setelah menyajikan halaman pertama dapat diamati di halaman berikutnya
- Dokumen yang diperbarui setelah menyajikan halaman pertama dapat diamati pada halaman berikutnya
- Dokumen yang dihapus setelah menyajikan halaman pertama dihilangkan di halaman berikutnya
- 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 c
atau 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 ResponseContinuationTokenLimitInKb
tidak disetel.)