如何使用单个 CosmosClient 处理多个 Cosmos 数据库帐户。关于多租户的问题

问题描述 投票:0回答:1

我们有一个多租户 B2B SaaS 应用程序,我们正在探索 Cosmos DB 核心 SQL API 的使用。我们的计划是为每个 Cosmos 帐户实施具有 499 个容器的单一数据库。我们选择每个租户一个容器的方法,如下所示:

|-- CosmosDB Account 1
|   |-- Database A
|       |-- Container Tenant 1
|       |-- Container Tenant 2
|       |-- ...
|       |-- Container Tenant 499
|
|-- CosmosDB Account 2
|   |-- Database B
|       |-- Container Tenant 500
|       |-- Container Tenant 501
|       |-- ...
|       |-- Container Tenant 998

根据有关资源限制的文档,单个 Azure 订阅中的容器限制将不断增长至约 500,000 个:limits

当达到限制时,将创建新的天蓝色订阅,并且随着我们的租户的增长,将发生相同的设计。还将存在一个主数据库,以便跟踪我们这边的租户。主数据库将包含有关每个租户、天蓝色订阅、所属帐户/数据库的文档。我们计划使用 asp.net Web API,它将成为一个整体并在所有租户之间共享。 Web api 将负责每个租户容器的跨 Cosmos 帐户的读/写操作。

我们将使用适用于 Azure Cosmos DB 的 .NET SDK 作为核心 SQL API。我的问题是,关于如何处理 Cosmos SDK 的客户端实例,推荐的方法是什么?我找到了一些关于 Cosmos SDK 的多租户应用程序的最佳实践的信息。其中指出以下内容:

在多个租户之间分配使用量的应用程序,其中每个租户 租户由不同的数据库、容器或分区表示 同一 Azure Cosmos DB 帐户中的密钥应使用单个客户端 实例。单个客户端实例可以与所有客户端交互 帐户内的数据库、容器和分区键,并且它是 使用单例模式的最佳实践。

但是,当每个租户由不同的 Azure Cosmos 代表时 DB帐户,需要为每个帐户创建一个单独的客户端实例 帐户。单例模式仍然适用于每个客户端(一个 在应用程序的生命周期内每个帐户的客户端),但是如果 租户数量多,客户数量可能会很困难 管理。连接数的增加可能会超出计算的限制 环境并导致连接问题。

因此,根据以我的设计为背景的建议,这是否意味着我应该拥有多个 CosmosClient 实例,每个 Cosmos 帐户一个?如果我们扩展时出现这种情况,让我们假设我们有 500,000 个租户,这意味着 1000 个 Cosmos 帐户,这将转换为单个 asp.net Web api 上的 1000 个 CosmosClient 实例?我无法理解这种设计的含义,这是否可行? 是否可以为所有帐户使用单个 CosmosClient 实例?我确实在 stackoverflow 上找到了以下内容,但是建议使用这种方法:

依赖注入和连接字符串/单例的多个实例用户发布的:

最后,是不是这种情况,最好的解决办法就是 T先生建议

https://devblogs.microsoft.com/cosmosdb/httpclientfactory-cosmos-db-net-sdk/

我现在仍在使用一个 CosmosClient,Scoped。允许动态使用 端点。

通过注入 IHttpClientFactory 并设置 像这样的 CosmosClientOptions;

{ HttpClientFactory = () => _httpClientFactory.CreateClient("cosmos") });我们现在正在充分利用 HttpClient 及其重用端口的能力。

获得一些代码示例和一般指导真是太好了。

asp.net azure-cosmosdb azure-cosmosdb-sqlapi
1个回答
0
投票
我的问题只是当多个 Cosmos 帐户发挥作用时如何处理 Cosmosclient,以及是否可能和/或建议使用单个 Cosmosclient。

CosmosClient

对象与端点和该端点的身份验证方法(密钥、身份或资源令牌)相关联。端点代表一个帐户。

端点无法更改,任何数据平面操作(例如 CreateItemAsync)也不允许您更改它。

CosmosClient

 实例之间拥有一个带有共享 HttpClient 的 HttpClientFactory 是可能的,但是,如果这些实例与不同的帐户通信,它们实际上并没有共享任何连接,并且从“减少连接”的角度来看,共享 HttpClient 确实没有任何好处看法。此外,共享 HttpClient 只会影响
网关模式交互。

您链接的文档

已经回答了您的问题:“但是,当每个租户由不同的 Azure Cosmos DB 帐户代表时,需要为每个帐户创建一个单独的客户端实例。”

© www.soinside.com 2019 - 2024. All rights reserved.