【发布时间】:2020-07-17 04:23:04
【问题描述】:
我在CosmosDB 中创建了一个容器,用于跟踪有关每个 API 调用的元数据(时间戳、用户 ID、方法名称、持续时间等)。分区键设置为UserId,每个id都是随机的Guid。这个容器还可以帮助我对每个用户实施速率限制。到目前为止,一切都很好。现在,我想通过将记录移动到Azure Table(或其他东西)来定期清理这个容器,以便长期存储并生成报告。迁移记录还可以帮助我避免 20GB 的逻辑分区大小限制。
但是,我担心跨分区查询最终是否会咬我。比如说,我想迁移一周前创建的所有记录。另外,假设我有数百万活跃用户。因此,这个容器看到了很多活动,我无法在查询中指定分区键。我正在阅读,当 RU/s 和存储大小都很大时,我们应该避免跨分区查询。见this。我不知道将来要处理多少物理分区。
我的设计完全不成立吗?如何有效地迁移记录?我希望 CosmosDB 团队能够看到这一点并帮助我找到解决此问题的方法。
【问题讨论】:
-
4c74356b41 的建议很好。随着时间的推移,表存储对于大量数据来说非常便宜——比 CosmosDb 便宜得多。所以我的问题是,如果你想最终将 API 调用历史存储在 Table 存储中,为什么首先要写入 CosmosDB?您是否有理由不直接写入表存储并完全跳过 CosmosDb?
-
Rob,我目前对表存储没有太多经验。在 Cosmos v3 中,我使用
Where和Count方法编写 LINQ 查询,以对特定 API 路由和 userId 组合实施速率限制。表存储是否支持这种类型的 LINQ 功能?就像您的建议一样,如果可以的话,我很想使用表格存储。我通过 CosmosDB 获得了IOrderedQueryable<T>。我不想获取内存中的所有 Table 行进行过滤和计数。 -
啊,所以您要在每个 API 调用上查询 CosmosDb 以了解用户在限制窗口中执行了多少次查询?如果查询率超过阈值,您会拒绝 API 请求并返回类似 HTTP 429 的内容?
-
没错!该功能是很久以前实现的。当然,现在我需要迁移陈旧的数据。
标签: azure nosql azure-cosmosdb azure-table-storage