Поддержка нескольких Azure Cosmos DB при загрузке Spring

Наш проект - это мультитенантное приложение с пружинной загрузкой, в котором CosmosDB используется в качестве хранилища постоянства. Мы используем com.azure.spring:azure-spring-boot-starter-cosmos для CosmosDB sdk. В случае с несколькими арендаторами мы рассматриваем как 1) схему «арендатор на контейнер» (выделенная RU на контейнер), так и 2) схемы «арендатор на базу данных». Мы думаем, что оба варианта удовлетворят наши требования. Это то, что проще реализовать в нашем проекте. Проект предоставляет интерфейс REST API. Запрос REST будет содержать информацию об идентификаторе арендатора. После получения запроса идентификатор запроса передается с веб-уровня на уровень домена, а затем на уровень сохраняемости с использованием класса контекста ThreadLocal. На уровне сохраняемости мы должны либо выбрать правильное имя контейнера на основе идентификатора клиента, если используется дизайн 1 (имя контейнера содержит идентификатор клиента),или имя базы данных на основе идентификатора клиента при использовании дизайна 2 (имя базы данных содержит идентификатор клиента). Мы пытаемся найти образец или документацию о том, как реализовать любой из подходов.

For design 1, one document we found is below. We are thinking about creating a bean that returns the container name based on the tenant id from ThreadLocal context. Then using the expression to pass it to the entity class. We will verify if it works.

Выражение SpEL и имя настраиваемого контейнера. По умолчанию имя контейнера будет именем класса класса домена пользователя. Чтобы настроить его, добавьте аннотацию @Container(containerName="myCustomContainerName") в класс домена. Поле контейнера также поддерживает выражения SpEL (например, container = "${dynamic.container.name}" или container = "#{@someBean.getContainerName()}"), чтобы предоставить имена контейнеров программно / через свойства конфигурации. Чтобы выражения SpEL работали правильно, вам необходимо добавить @DependsOn("expressionResolver") поверх класса Spring Application.

Для дизайна 2 единственное, что мы нашли, это https://github.com/Azure-Samples/azure-spring-boot-samples/tree/tag_azure-spring-boot_3.6.0/cosmos/azure-spring-boot-sample- Космос-мульти-база-единственная учетная запись . Но в этом примере две базы данных определены статически и жестко запрограммированы в конфигурации. Может ли кто-нибудь указать нам на какой-нибудь пример поддержки динамического выбора базы данных?

Другой вариант - создать CosmosAsyncClient вручную для каждого клиента, вместо того, чтобы позволить Spring обрабатывать все за нас. Но это усложнит логику настойчивости.

Кто-то работает над чем-то подобным и как решить проблему?

0 ответов

Другие вопросы по тегам