Azure cosmosdb Cosmos DB延续令牌是如何工作的?

Azure cosmosdb Cosmos DB延续令牌是如何工作的?,azure-cosmosdb,Azure Cosmosdb,乍一看,很清楚continuation令牌在Cosmos DB中的作用:将其附加到下一个查询中会得到下一组结果。但下一组结果究竟意味着什么 这是否意味着: 下一组结果,就好像在第一次查询跳过适当数量的文档时,原始查询已完全执行而没有分页一样? 下一组结果,就好像原始查询现在已经执行,跳过了适当数量的文档? 完全不同的东西? 答复1。这似乎更可取,但不太可能,因为服务器需要存储无限量的状态。但是答案2。也存在问题,因为它可能会导致不一致,例如,如果页面查询之间的基础数据发生了更改,则同一文档可能会

乍一看,很清楚continuation令牌在Cosmos DB中的作用:将其附加到下一个查询中会得到下一组结果。但下一组结果究竟意味着什么

这是否意味着:

下一组结果,就好像在第一次查询跳过适当数量的文档时,原始查询已完全执行而没有分页一样? 下一组结果,就好像原始查询现在已经执行,跳过了适当数量的文档? 完全不同的东西?
答复1。这似乎更可取,但不太可能,因为服务器需要存储无限量的状态。但是答案2。也存在问题,因为它可能会导致不一致,例如,如果页面查询之间的基础数据发生了更改,则同一文档可能会跨页面多次提供。

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

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

继续期间创建的文档 它们可能返回,也可能不返回,这取决于执行插入和查询的位置

例如:

按c.someValue ASC从c订单中选择*

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

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

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

继续期间更新的文件 上述逻辑同样适用于更新 见4

继续期间删除的文档 它们不会出现在下一组结果中

重复的机会 如果出现以下查询

按c.remainingInventory ASC从c订单中选择*

如果remainingInventory是在第一组结果之后更新的,并且现在它满足第二页的ORDER BY条件,那么文档将再次显示

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

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

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

继续期间创建的文档 它们可能返回,也可能不返回,这取决于执行插入和查询的位置

例如:

按c.someValue ASC从c订单中选择*

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

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

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

继续期间更新的文件 上述逻辑同样适用于更新 见4

继续期间删除的文档 它们不会出现在下一组结果中

重复的机会 如果出现以下查询

按c.remainingInventory ASC从c订单中选择*

如果remainingInventory是在第一组结果之后更新的,并且现在它满足第二页的ORDER BY条件,那么文档将再次显示

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

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

提供第一页后创建的文档可以在后续页面上看到 提供第一页后更新的文档可在后续页面上看到 送达第一页后删除的文件将在后续页面中省略 文件不会被送达两次 上面的第一句话与MSFT cf.Kalyan回答的信息相矛盾。如果能从Cosmos DB团队那里得到一个更符合条件的答案,精确地指定检索页面的语义,那将是一件非常棒的事情。这对于在UI中显示数据可能不是很重要,但对于后端的数据处理来说可能是必不可少的,因为似乎没有任何方法可以 执行查询时禁用分页cf

实验方法 我使用Sacha Bruttin来查询包含5个文档的集合,因为这个工具允许处理页面大小和其他请求选项

页面大小设置为1,并启用了跨分区查询。尝试了不同的查询,例如从c中选择*或按c.name从c中选择*顺序

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


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

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

提供第一页后创建的文档可以在后续页面上看到 提供第一页后更新的文档可在后续页面上看到 送达第一页后删除的文件将在后续页面中省略 文件不会被送达两次 上面的第一句话与MSFT cf.Kalyan回答的信息相矛盾。如果能从Cosmos DB团队那里得到一个更符合条件的答案,精确地指定检索页面的语义,那将是一件非常棒的事情。这对于在UI中显示数据可能不是很重要,但对于后端的数据处理可能是必不可少的,因为在执行查询时似乎没有任何方法禁用分页

实验方法 我使用Sacha Bruttin来查询包含5个文档的集合,因为这个工具允许处理页面大小和其他请求选项

页面大小设置为1,并启用了跨分区查询。尝试了不同的查询,例如从c中选择*或按c.name从c中选择*顺序

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


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

谢谢,知道不包括新项目已经很有帮助了,因此可以排除上面的选项2。但它仍然不能完全说明下一组结果意味着什么。显然,在延续令牌中编码的信息不足以重新创建整个索引,否则它可能与整个集合一样大,并且没有状态存储在服务器端,因此一些信息丢失,选项1不可行。间歇性删除是否可以观察到?间歇性更新?我无法确认您关于在第一页之后创建的项目不包含在后续页面中的说法。我使用Sacha Bruttin的Cosmos DB Explorer查询页面大小为1的所有文档ResponseContinuationTokenLimitInKb未设置,通过逐个检索页面,我最终观察到在单页面请求之间创建的所有文档。此外,页面请求之间的删除和更新总是可以在后续页面上看到。这表明选项2是正确的。continuation标记用于构造索引的整个状态。这就是为什么令牌可以增长超过12K,并且正如您正确指出的,在某些情况下,它比文档本身更大。某些客户端对http头中接收的令牌的长度大小有限制。因此引入了ResponseContinuationTokenLimitInKb选项。通过限制令牌大小,您仍然可以与Cosmos对话,但由于它没有序列化状态所需的所有数据,因此现在需要再次扫描索引,因此,还将返回新的添加、删除和更改的数据。我已经花了一段时间研究延续令牌的问题,让我进一步研究一下,并在这里更新我的发现。我也会使用COSMOSDB浏览器。谢谢,那真的很有帮助。只是想澄清一下:在我的实验中,令牌大小不受ResponseContinuationTokenLimitInKb的限制,但所有中间写入创建、更新和删除都可以在后续页面上观察到。谢谢,知道不包括新项已经很有帮助了,因此可以排除上面的选项2。但它仍然不能完全说明下一组结果意味着什么。显然,在延续令牌中编码的信息不足以重新创建整个索引,否则它可能与整个集合一样大,并且没有状态存储在服务器端,因此一些信息丢失,选项1不可行。间歇性删除是否可以观察到?间歇性更新?我无法确认您关于在第一页之后创建的项目不包含在后续页面中的说法。我使用Sacha Bruttin的Cosmos DB Explorer来查询页面大小为1 ResponseContinuationTokenLimitInKb未设置的所有文档,并逐个检索页面
,我最终观察到在单页请求之间创建的所有文档。此外,页面请求之间的删除和更新总是可以在后续页面上看到。这表明选项2是正确的。continuation标记用于构造索引的整个状态。这就是为什么令牌可以增长超过12K,并且正如您正确指出的,在某些情况下,它比文档本身更大。某些客户端对http头中接收的令牌的长度大小有限制。因此引入了ResponseContinuationTokenLimitInKb选项。通过限制令牌大小,您仍然可以与Cosmos对话,但由于它没有序列化状态所需的所有数据,因此现在需要再次扫描索引,因此,还将返回新的添加、删除和更改的数据。我已经花了一段时间研究延续令牌的问题,让我进一步研究一下,并在这里更新我的发现。我也会使用COSMOSDB浏览器。谢谢,那真的很有帮助。只是想澄清一下:在我的实验中,令牌大小不受ResponseContinuationTokenLimitInKb的限制,但所有中间写入、创建、更新和删除都可以在后续页面上看到。我确信我遇到了新文档无法返回的问题。在这里发现了一个类似的问题,讨论了同样的问题让我尝试与Cosmos团队的人员联系并确认这一点对于您关于禁用分页的评论,您可以将FeedOptions中的MaxItemCount属性设置为高达1000的数字,以获得每页更多的结果您可以设置MaxItemCount以获得更大的页面,但问题是,您不能使用它来完全避免分页,因此似乎没有一种方法可以以事务方式执行查询。我确信,我遇到了一个新文档无法返回的问题。在这里发现了一个类似的问题,讨论了同样的问题让我尝试与Cosmos团队的人员联系并确认这一点对于您关于禁用分页的评论,您可以将FeedOptions中的MaxItemCount属性设置为高达1000的数字,以获得每页更多的结果您可以设置MaxItemCount以获得更大的页面,但问题是,您不能使用它来完全避免分页,因此似乎没有一种方法可以以事务方式执行查询。