0

我们的项目是一个以 CosmosDB 作为持久性存储的 spring-boot 多租户应用程序。我们正在使用 CosmosDB spring 数据库 com.azure.spring:azure-spring-boot-starter-cosmos。对于多租户,我们正在考虑 1) 每个容器的租户(每个容器的专用 RU)和 2) 每个数据库的租户设计。我们认为这两种设计都能满足我们的要求。这取决于我们的项目中哪个更容易实现。该项目提供 REST API 接口。REST 请求将携带租户 ID 信息。收到请求后,请求 id 从 Web 层传递到域层,然后使用 ThreadLocal 上下文类传递到持久层。在持久层,如果使用设计 1,我们应该根据租户 id 选择正确的容器名称(容器名称包含租户 id),如果使用设计 2,则基于租户 ID 的数据库名称(数据库名称包含租户 ID)。我们正在尝试找到一些关于如何实现这两种方法的示例或文档。

对于设计 1,我们找到的一份文件如下。我们正在考虑创建一个 bean,它根据 ThreadLocal 上下文中的租户 id 返回容器名称。然后使用表达式将其传递给实体类。我们将验证它是否有效。

SpEL 表达式和自定义容器名称。默认情况下,容器名称将是用户域类的类名。要对其进行自定义,请将 @Container(containerName="myCustomContainerName") 注释添加到域类中。容器字段还支持 SpEL 表达式(例如 container = "${dynamic.container.name}" 或 container = "#{@someBean.getContainerName()}"),以便以编程方式/通过配置属性提供容器名称。为了使 SpEL 表达式正常工作,您需要在 Spring Application 类的顶部添加 @DependsOn("expressionResolver") 。

对于设计 2,我们发现的唯一内容是https://github.com/Azure-Samples/azure-spring-boot-samples/tree/tag_azure-spring-boot_3.6.0/cosmos/azure-spring-boot-sample- cosmos-多数据库-单账户。但是在这个例子中,这两个数据库是静态定义的,并且在配置中是硬编码的。有人可以为我们指出一些支持动态数据库选择的例子吗?

另一种选择是为每个客户端手动构建 CosmosAsyncClient,而不是让 spring 为我们处理所有事情。但这会使持久性逻辑复杂化。

有没有人在做类似的事情,你如何解决这个问题?

4

0 回答 0