Я пытаюсь понять, как мы создаем RESTful API для продукта SaaS, где он предполагает мультитенантность. Стек технологий - это Java, использующая Spring и Hibernate и развертывающая WAR на Tomcat.
Моя основная проблема заключается в том, как поддерживать tenant_id в вызове REST, чтобы приложение могло использовать правильное соединение с базой данных при выполнении CRUD. Видя, что Tomcat использует пул потоков и повторно использует потоки, мы не должны использовать ThreadLocal.
Я читал, что slf4j поддерживает это с реализацией MDC для ведения журнала. Фильтр сервлета поддерживает tenant_id заранее и очищает его при выходе из фильтра. Следовательно, регистратор использует в сообщениях правильный tenant_id.
В то же время использование ThreadLocal противоречит принципу отсутствия состояния, поскольку он неявно добавляет состояние.
Кроме того, идея создания какого-то объекта ContextSession, содержащего tenant_id, и его передачи, похоже, не решает мою проблему. Поскольку этот объект будет передан по уровням DAL и DAO для загрузки объектов. Я хочу избежать этой сильной связи в этом классе ContextSession, а также необходимости включать ее во многие сигнатуры методов.
Как реализовать мультиарендность в среде без сохранения состояния?