¿Cómo funciona el token de continuación de Cosmos DB?
A primera vista, está claro lo que hace el token de continuación en Cosmos DB: adjuntarlo a la siguiente consulta le brinda el siguiente conjunto de resultados. Pero, ¿qué significa exactamente "siguiente conjunto de resultados"?
Eso significa:
- el siguiente conjunto de resultados como si la consulta original se hubiera ejecutado completamente sin paginar en el momento de la primera consulta (omitiendo el número apropiado de documentos)?
- el siguiente conjunto de resultados como si la consulta original se hubiera ejecutado ahora (omitiendo el número apropiado de documentos)?
- ¿Algo completamente diferente?
La respuesta 1. parecería preferible, pero poco probable, dado que el servidor necesitaría almacenar cantidades ilimitadas de estado. Pero la Respuesta 2. también es problemática ya que puede resultar en inconsistencias, por ejemplo, el mismo documento puede ser entregado varias veces en las páginas, si los datos subyacentes han cambiado entre las consultas de página.
Respuestas
Las ejecuciones de consultas de Cosmos DB no tienen estado en el lado del servidor. El token de continuación se utiliza para recrear el estado del índice y realizar un seguimiento del progreso de la ejecución.
"Siguiente conjunto de resultados" significa que la consulta se ejecuta de nuevo desde un "marcador" de la ejecución anterior. Este marcador lo proporciona el token de continuación.
- Documentos creados durante continuaciones
Pueden o no devolverse dependiendo de la posición de inserción y consulta que se esté ejecutando.
Ejemplo:
SELECT * FROM c ORDER BY c.someValue ASC
Supongamos que el marcador tiene algúnValor = 10, el motor de consultas reanuda el procesamiento utilizando un token de continuación donde algúnValor = 10.
Si insertara un nuevo documento con algúnValor = 5 entre ejecuciones de consultas, no se mostrará en el siguiente conjunto de resultados.
Si el nuevo documento se inserta en una "página" que es> el marcador, se mostrará en el siguiente conjunto de resultados.
- Documentos actualizados durante continuaciones
La misma lógica que la anterior también se aplica a las actualizaciones (consulte el n. ° 4)
- Documentos eliminados durante continuaciones
No aparecerán en el siguiente conjunto de resultados.
- Posibilidades de duplicados
En caso de la siguiente consulta,
SELECCIONAR * DE c PEDIR POR c. Inventario restante ASC
Si el inventario restante se actualizó después del primer conjunto de resultados y ahora satisface los criterios ORDER BY para la segunda página, el documento se mostrará nuevamente.
Cosmos DB no proporciona aislamiento de instantáneas en las páginas de consulta. Sin embargo, según el equipo de producto, este es un escenario increíblemente poco común porque las consultas sobre continuaciones son muy rápidas y, en la mayoría de los casos, todos los resultados de la consulta se devuelven en la primera página.
Basado en experimentos preliminares, la respuesta parece ser la opción # 2, o más precisamente:
- Los documentos creados después de publicar la primera página se pueden observar en las páginas siguientes.
- Los documentos actualizados después de servir la primera página se pueden observar en las páginas siguientes.
- Los documentos eliminados después de publicar la primera página se omiten en las páginas siguientes.
- Los documentos nunca se entregan dos veces
La primera declaración anterior contradice la información de MSFT ( véase la respuesta de Kalyan). Sería genial obtener una respuesta más calificada del equipo de Cosmos DB especificando con precisión la semántica de la recuperación de páginas. Esto puede no ser muy importante para la visualización de datos en la interfaz de usuario, pero puede ser esencial para el procesamiento de datos en el backend, dado que no parece haber ninguna manera de deshabilitar paginación cuando se realiza una consulta ( cf. son consultas transaccionales posible en Cosmos DB? ).
Método experimental
Utilicé Cosmos DB Explorer de Sacha Bruttin para consultar una colección con 5 documentos, porque esta herramienta permite jugar con el tamaño de la página y otras opciones de solicitud.
El tamaño de la página se estableció en 1 y se habilitaron las consultas entre particiones. Se probaron diferentes consultas, por ejemplo, SELECT * FROM c
o SELECT * FROM c ORDER BY c.name
.
Después de recuperar la página 1, se insertaron nuevos documentos y se actualizaron y eliminaron algunos documentos existentes (incluidos los documentos que deberían aparecer en las páginas siguientes). Luego, todas las páginas siguientes se recuperaron en secuencia.
(Un vistazo rápido al código fuente de la herramienta confirmó que ResponseContinuationTokenLimitInKb
no está configurado).