每个租户使用一个 Cosmos DB 帐户

时间:2021-04-02 13:45:06

标签: asp.net azure-cosmosdb azure-cosmosdb-sqlapi

我们有一个多租户 SaaS 应用程序,即 B2B 上下文。 租户范围从小(100s MB)到非常大的数据大小(100s GB)。 我们当前在 Cosmos DB 中的设置是: 每个域的数据库 每个租户的容器

所以: 数据库命令

  • 租户 X 容器
  • 租户 Y 容器
  • 租户 Z 容器 数据库付款
  • 租户 X 容器
  • 租户 Y 容器
  • 租户 X 容器

我们使用数据库级预配吞吐量,并启用自动驾驶仪。

我们正在研究转向无服务器版本,因为我们已经将它用于另一个应用程序并且运行良好。我们需要考虑一些限制(大小、最大吞吐量等),但最大的限制已经消失:额外的容器是免费的!

这意味着我们现在正在研究两种模型中的一种:

  • 一个数据库帐户,每个租户的数据库(带有 X 个容器) PRO:可管理性,编码简单性(我们目前的工作) 缺点:并非 Azure 中的所有服务本身都支持这种数据隔离(想想 Synapse),因此为某些特定租户启用某些服务会变得很困难。备份并不容易,因为不支持就地备份
  • 多个数据库帐户,每个租户一个数据库帐户(有 x 个数据库/容器) PRO:完成数据隔离,符合我们的存储帐户(每个租户一个)。 Azure 服务可以轻松支持此体系结构。备份很容易,因为只需将租户链接到新帐户即可。 缺点:可管理性,我们将拥有大量数据库帐户。代码复杂度。我们使用 Cosmos DB .NET SDK,一个单例 CosmosClient,它需要相当多的管道来支持这个模型。我们还需要更改租户配置以设置新的 Cosmos db 帐户

有没有人选择这两种选择中的一种,为什么?您可以分享的任何其他优点/缺点以及我们需要注意的任何限制(除了软限制)?

谢谢!

1 个答案:

答案 0 :(得分:2)

我意识到这个问题接近于观点,但在 Cosmos DB 上设计多租户应用程序时,有一些客观的事情需要理解。

首先,每个租户的最低成本取决于提供吞吐量的位置。使用数据库级吞吐量,每个容器的最低成本约为 1 美元/月。但是,DB 级别吞吐量的问题是您无法获得该数据库中容器(租户)的可预测性能。如果您的租户规模不对称,则尤其如此

其次,您使用的设计应基于您拥有对称租户还是非对称租户。你的似乎是不对称的。出于这个原因,您需要一种不同的方法。每个容器的租户不会使用 DB 级别的吞吐量,因为租户之间会有嘈杂的邻居问题。您需要将较大的租户隔离在他们自己的容器中。

第三个考虑因素是成本。 DB 级别吞吐量的每个租户成本 < 1 美元/租户(~400 RU/s = 25 美元/月 / 数据库中具有 DB 级别吞吐量的 25 个容器)。具有容器级吞吐量的每个租户的成本为 25 美元。还有第三个选项,即每个逻辑分区的租户。这里每个租户的边际成本为零。然而,最大大小为 20GB 并且也可能出现相同的嘈杂邻居问题

鉴于所有这些,我的建议是对小租户使用每个逻辑分区的租户,对较大的租户使用每个容器的租户。对于较小的租户,您需要实施某种资源治理以防止嘈杂的邻居问题,但这是任何多租户应用程序所必需的。当租户过大或想要升级时,将它们迁移到自己的容器中,并具有自己的吞吐量。

有一个关于这个主题的演讲值得一看here,其中详细介绍了更多细节。

相关问题