Cosmos DB Continuation Token是如何工作的



乍一看,延续令牌在Cosmos DB中的作用很清楚:将其附加到下一个查询会得到下一组结果。但是";下一组结果";确切地说是什么意思?

它的意思是:

  1. 下一组结果,就好像在第一次查询时原始查询已经完全执行而没有分页一样(跳过适当数量的文档(
  2. 下一组结果,就好像现在已经执行了原始查询一样(跳过适当数量的文档(
  3. 完全不同的东西

答案1。考虑到服务器需要存储无限量的状态,这似乎更可取,但不太可能。但答案2。也有问题,因为它可能会导致不一致,例如,如果基础数据在页面查询之间发生了变化,则同一文档可能会在页面之间多次提供。

Cosmos DB查询执行在服务器端是无状态的。continuation令牌用于重新创建索引的状态并跟踪执行进度。

"下一组结果";意味着该查询从"0"开始再次执行;书签";来自上一次执行。此书签由延续令牌提供。

  1. 在延续过程中创建的文档

根据插入和正在执行的查询的位置,它们可能会返回,也可能不会返回。

示例:

根据c.someValue ASC 从c订单中选择*

让我们假设书签的someValue=10,查询引擎使用someValue=10的延续令牌恢复处理。

如果在查询执行之间插入someValue=5的新文档,则将不会在下一组结果中显示

如果新文档被插入到";页面";即>书签,它将在下一组结果中显示

  1. 在延续期间更新的文档

与上述相同的逻辑也适用于更新(参见#4(

  1. 在继续过程中删除的文档

它们将不会显示在下一组结果中

  1. 重复的机会

在以下查询的情况下,

从c订单中选择*,保留库存ASC

如果剩余库存在第一组结果之后更新,并且现在满足第二页的ORDER BY标准,则文档将再次出现。


Cosmos DB不提供跨查询页面的快照隔离。然而,根据产品团队的说法,这是一种非常罕见的情况,因为对连续性的查询非常快速,在大多数情况下,所有查询结果都会在第一页上返回。

根据初步实验,答案似乎是选项#2,或者更准确地说:

  1. 提供第一页后创建的文档在后续页面上可以观察到
  2. 提供第一页后更新的文件可在后续页面上查看
  3. 送达第一页后删除的文件将在后续页面中省略
  4. 文件从不送达两次

上面的第一句话与来自MSFT的信息相矛盾(参见Kalyan的回答(。如果能从Cosmos DB团队那里得到一个更合格的答案,准确地指定检索页面的语义,那将是一件好事。这对于在UI中显示数据可能不是很重要,但对于后端的数据处理可能是至关重要的,因为在执行查询时似乎没有任何禁用分页的方法(参见Cosmos DB中是否可以进行事务查询?(。


实验方法

我使用Sacha Bruttin的Cosmos DB Explorer查询了一个包含5个文档的集合,因为这个工具可以处理页面大小和其他请求选项。

页面大小设置为1,并启用了跨分区查询。尝试了不同的查询,例如SELECT * FROM cSELECT * FROM c ORDER BY c.name

检索第1页后,插入了新文档,并更新和删除了一些现有文档(包括应出现在后续页面上的文档(。然后按顺序检索所有后续页面。

(快速查看该工具的源代码,确认未设置ResponseContinuationTokenLimitInKb。(

最新更新