问题描述
据我所知,当您执行不按一个主键过滤的查询时,您执行的是跨分区查询。要执行此操作,查询将发送到 CDB 集合的所有物理分区,在每个分区中并行执行,然后返回。
当您扩展到每秒数万个请求时,这意味着数万个请求中的每一个都在每个物理分区上执行。
这是否意味着每个分区最终都会达到它可以服务的每秒请求数限制,而水平扩展将不再带来任何好处?因为对于 CDB 添加的每个新物理分区,它将需要处理传入的所有请求,因此不会增加新的总容量,而只会增加存储。
下游的含义是,即使在小规模下,您可以承担跨分区查询增加的 RU 成本,但真正能够无限期扩展您的数据模型应确保查询仅命中一个分区(可能通过对其进行反规范化)。
解决方法
是的,跨分区查询将不允许像 Cosmos DB 这样的数据库(或任何水平可扩展的数据库)进行扩展。
像 Cosmos DB 这样的数据库提供无限的规模,因为它可以水平扩展。您的分区策略的目标应该是使用一个或至少一组有界分区来回答您的大量查询。围绕分区策略的努力是选择一个几乎总是在查询中传递的属性。非规范化通常更多地是围绕请求对数据建模的功能。与直接分区关系不大。
如果您想了解有关使用 Cosmos DB 进行分区和建模的更多信息,我强烈建议您观看此视频。它很好地呈现了主题,Data modeling & partitioning: What every relational database dev needs to know