Cosmos DB Continuation Token 如何工作?

Mo *_* B. 3 azure-cosmosdb

乍一看,延续令牌在 Cosmos DB 中的作用很明显:将它附加到下一个查询会为您提供下一组结果。但是“下一组结果”究竟是什么意思?

是不是意思:

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

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

Kal*_*SFT 6

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

“下一组结果”意味着,从上次执行的“书签”再次执行查询。此书签由延续令牌提供。

  1. 在延续期间创建的文档

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

例子:

SELECT * FROM c ORDER BY c.someValue ASC

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

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

如果新文档插入到 > 书签的“页面”中,它将显示在下一组结果中

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

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

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

它们不会出现在下一组结果中。

  1. 重复的机会

在以下查询的情况下,

SELECT * FROM c ORDER BY c.remainingInventory ASC

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


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