Como funciona o token de continuação do Cosmos DB?

Aug 17 2020

À primeira vista, fica claro o que o token de continuação faz no Cosmos DB: anexá-lo à próxima consulta fornece o próximo conjunto de resultados. Mas o que significa exatamente "próximo conjunto de resultados"?

Quer dizer:

  1. o próximo conjunto de resultados como se a consulta original tivesse sido executada completamente sem paginação no momento da primeira consulta (pulando o número apropriado de documentos)?
  2. o próximo conjunto de resultados como se a consulta original tivesse sido executada agora (pulando o número apropriado de documentos)?
  3. Algo completamente diferente?

A resposta 1. pareceria preferível, mas improvável, dado que o servidor precisaria armazenar quantidades ilimitadas de estado. Mas a resposta 2 também é problemática, pois pode resultar em inconsistências, por exemplo, o mesmo documento pode ser veiculado várias vezes nas páginas, se os dados subjacentes forem alterados entre as consultas da página.

Respostas

2 KalyanChanumolu-MSFT Aug 21 2020 at 13:51

As execuções de consulta do Cosmos DB são sem estado no lado do servidor. O token de continuação é usado para recriar o estado do índice e controlar o progresso da execução.

"Próximo conjunto de resultados" significa que a consulta é executada novamente a partir de um "marcador" da execução anterior. Este indicador é fornecido pelo token de continuação.

  1. Documentos criados durante continuações

Eles podem ou não ser retornados dependendo da posição da inserção e da consulta sendo executada.

Exemplo:

SELECT * FROM c ORDER BY c.someValue ASC

Vamos supor que o marcador tenha algum valor = 10, o mecanismo de consulta retoma o processamento usando um token de continuação onde algum valor = 10.

Se você inserir um novo documento com someValue = 5 entre as execuções da consulta, ele não aparecerá no próximo conjunto de resultados.

Se o novo documento for inserido em uma "página" que é o favorito, ele aparecerá no próximo conjunto de resultados

  1. Documentos atualizados durante as continuações

A mesma lógica acima também se aplica às atualizações (consulte o nº 4)

  1. Documentos excluídos durante as continuações

Eles não aparecerão no próximo conjunto de resultados.

  1. Chances de duplicatas

No caso da consulta abaixo,

SELECT * FROM c ORDER BY c.remainingInventory ASC

Se oInventário restante foi atualizado após o primeiro conjunto de resultados e agora satisfaz os critérios ORDER BY para a segunda página, o documento aparecerá novamente.


O Cosmos DB não fornece isolamento de instantâneo nas páginas de consulta. No entanto, de acordo com a equipe do produto, esse é um cenário incrivelmente incomum porque as consultas sobre continuações são muito rápidas e, na maioria dos casos, todos os resultados da consulta são retornados na primeira página.

MoB. Aug 24 2020 at 09:10

Com base em experiências preliminares, a resposta parece ser a opção nº 2, ou mais precisamente:

  1. Os documentos criados após servir a primeira página são observáveis ​​nas páginas subsequentes
  2. Os documentos atualizados após veicular a primeira página são observáveis ​​nas páginas subsequentes
  3. Documentos excluídos após veicular a primeira página são omitidos nas páginas subsequentes
  4. Documentos nunca são veiculados duas vezes

A primeira afirmação acima contradiz as informações da MSFT ( cf. a resposta de Kalyan). Seria ótimo obter uma resposta mais qualificada da equipe do Cosmos DB, especificando precisamente a semântica de recuperação de páginas. Isso pode não ser muito importante para a exibição de dados na IU, mas pode ser essencial para o processamento de dados no back-end, visto que não parece haver nenhuma maneira de desativar a paginação ao realizar uma consulta ( cf. As consultas transacionais são possíveis em Cosmos DB? ).


Método experimental

Eu usei o Cosmos DB Explorer do Sacha Bruttin para consultar uma coleção com 5 documentos, porque esta ferramenta permite brincar com o tamanho da página e outras opções de solicitação.

O tamanho da página foi definido como 1 e as consultas de partição cruzada foram habilitadas. Diferentes consultas foram tentadas, por exemplo, SELECT * FROM cou SELECT * FROM c ORDER BY c.name.

Depois de recuperar a página 1, novos documentos foram inseridos e alguns documentos existentes (incluindo documentos que deveriam aparecer nas páginas subsequentes) foram atualizados e excluídos. Em seguida, todas as páginas subsequentes foram recuperadas em sequência.

(Uma rápida olhada no código-fonte da ferramenta confirmou que ResponseContinuationTokenLimitInKbnão está definido.)