Мультитенантность SaaS: как разделить клиентов, данные и настройки

Мультитенантность SaaS: организации, роли, базы, файлы, очереди и кеш. Как выбрать границы клиентов, проверить изоляцию и подготовить сопровождение.

Мультитенантность нужна SaaS-продукту, когда одна платформа обслуживает несколько независимых организаций. Главная задача — сохранить границы клиентов в данных, правах и эксплуатации, не потеряв управляемость общего продукта. Наличие поля с идентификатором организации ещё не доказывает изоляцию: его нужно правильно применять во всех путях чтения, изменения, фоновой обработки и выдачи файлов. Разберём решения, которые стоит принять до запуска нового клиента: модель организации, размещение данных, лимиты, настройки, резервное восстановление и приёмочные сценарии. Материал адресован владельцу SaaS и техническому руководителю. Здесь нет универсального рецепта для любой нагрузки; примеры условные и показывают способ сравнения вариантов. Что такое мультитенантность SaaS Мультитенантность — способ организации продукта, при котором система обслуживает несколько клиентских контуров, сохраняя согласованную изоляцию между ними. Тенант обычно соответствует организации или самостоятельному пространству данных. Изоляция относится не только к базе, но и к авторизации, файлам, очередям, настройкам, лимитам и действиям поддержки. Сначала определите, что означает клиентский контур именно у вас. Это может быть компания, филиал, команда или отдельный проект. Пользователь способен состоять в нескольких контурах с разными ролями. Если смешать пользователя и организацию, позже станет трудно реализовать переход сотрудника, приглашение партнёра и передачу владения. Общий продукт может использовать разные уровни инфраструктурной изоляции. Некоторые клиенты работают в общей среде, другие требуют отдельного контура. Модель должна отражать бизнес-условия и риски, а не желание использовать один модный подход. У каждого варианта есть расходы на сопровождение и особенности обновления. Почему решение важно до первого расширения Первый клиент иногда работает в системе, которая фактически рассчитана только на одну организацию. При добавлении второго возникают скрытые зависимости: общие справочники, единые настройки, файлы без владельца и отчёты без фильтра. Исправлять такую модель после накопления данных сложнее, чем явно определить границы перед запуском. Учебный пример: сервис управления заявками использует общую таблицу документов. Интерфейс показывает только документы выбранной компании, но фоновая выгрузка забывает это ограничение. На экране всё выглядит правильно, а экспорт нарушает границу. Проверка мультитенантности должна включать все каналы, а не только типовой пользовательский маршрут. Второй риск — влияние одного клиента на остальных. Большой импорт или отчёт способен занять общую очередь и задержать обычные действия. Изоляция данных не решает изоляцию ресурсов. Нужно продумать лимиты, расписание и наблюдаемость по контурам. Это становится частью продуктовых условий и инженерного плана. Третий риск — сопровождение. Если у каждой организации своя вручную изменённая версия, общий SaaS постепенно превращается в набор несвязанных проектов. Сначала решите, что является конфигурацией, что — расширением, а что требует отдельного продукта. Поддержка должна знать допустимые различия и путь обновления. Модель организации и членства Разделите организацию, пользователя и его членство. У пользователя есть собственная идентичность; членство определяет отношения с конкретным контуром и роль в нём. Это позволяет одному человеку работать в нескольких пространствах, не копируя учётную запись и не смешивая права. Приглашение требует состояния: создано, отправлено, принято, отозвано или истекло. Переход должен подтверждать правильного пользователя и актуальные условия. Если приглашение осталось после изменения роли, его нельзя безусловно применять по старой записи. Проверьте повтор принятия и несовпадение текущего аккаунта. Владелец организации и администратор платформы — разные роли. Первый управляет согласованными действиями своего клиента, второй сопровождает продукт. Доступ поддержки к данным клиента требует отдельной политики и следа действий. Не создавайте скрытую роль «может всё» без ограничений только ради удобства диагностики. Удаление пользователя не обязательно удаляет его действия и документы. Для истории нужен устойчивый смысл: кто создал операцию, кто имел право, что происходит после выхода сотрудника. Эти правила согласуются с процессом и требованиями к данным. Техническая модель должна поддерживать их явно. Как определяется текущий тенант Текущий контур должен определяться через доверенный контекст и проверенные отношения пользователя. Идентификатор из адреса или заголовка помогает выбрать пространство, но не является разрешением. Сервер должен подтвердить членство и допустимость действия. Клиентская форма не может самостоятельно назначать владельца записи. Если контур задаётся доменом, укажите правила привязки и проверки владения. Если пользователь переключает организацию в интерфейсе, запросы и сохранённые ссылки должны учитывать актуальный выбор. Если есть интеграционный ключ, он связывается с определённым контуром и набором разрешений. Эти пути могут различаться, но граница должна быть общей. Проверяйте сценарии без контекста и с противоречивым контекстом. Система не должна выбирать первую доступную организацию для чувствительного действия только ради успешного ответа. Ошибка должна быть безопасной и понятной. Полезно различать отсутствие выбора, отсутствие членства и недопустимое действие, не раскрывая чужие данные. После переключения проверяйте кеш клиента, вкладки и незавершённые формы. Данные одного пространства не должны оставаться видимыми в другом. Сохранённая форма может относиться к прежнему контуру; пользователь должен понять это до отправки. Особенно важно тестировать параллельную работу в нескольких вкладках. Варианты размещения данных Выбор модели хранения определяется требованиями к изоляции, восстановлению, масштабированию и эксплуатации. Общие таблицы упрощают некоторые операции, отдельные схемы или базы дают другие границы управления. Нет варианта, который автоматически обеспечивает все свойства без корректной реализации и процедур. Модель Что удобно Что требуется проверить Общие таблицы Единая схема и централизованное обновление Применение контекста во всех запросах и фоновых задачах Отдельные схемы Разделение структур внутри базы Выбор схемы, миграции и управление множеством контуров Отдельные базы Независимые операции хранения и восстановления Подключения, миграции, мониторинг и стоимость сопровождения Отдельная инфраструктура Более самостоятельная эксплуатация клиента Выпуски, конфигурации и управляемость большого числа сред В руководстве Microsoft по мультитенантным решениям рассматривается проектирование систем для нескольких клиентов и архитектурные компромиссы. Это полезный источник для сравнения вариантов. Однако выбор облака или способа хранения сам по себе не подтверждает границу конкретного приложения: её нужно проверять в коде и эксплуатации. Не сравнивайте варианты только по стоимости сервера. Отдельные базы требуют автоматизации миграций и диагностики. Общие таблицы требуют строгой модели доступа и продуманного восстановления отдельных клиентов. Расходы команды и последствия инцидента могут быть важнее небольшой разницы инфраструктурного счёта. Изоляция запросов и бизнес-операций Граница клиента должна применяться в месте выполнения операции. Проверка на уровне интерфейса недостаточна. Серверные запросы, внутренние сервисы, отчёты и административные инструменты должны одинаково понимать контекст. Полезно проектировать безопасный путь по умолчанию, чтобы новый модуль не требовал помнить о ручном фильтре в каждом месте. Связи сущностей тоже проверяются. Нельзя создать заказ в одном контуре с идентификатором клиента из другого, даже если каждое поле выглядит корректным по отдельности. Ограничения модели и проверки сервиса должны подтверждать принадлежность связанных объектов. Такие ошибки часто не видны при тестах только на одном клиенте. Учебный пример: сотрудник организации А отправляет идентификатор проекта организации Б в запросе создания задачи. Система должна отказать без изменения чужих данных. Проверка включает обычный API, массовый импорт и фоновый обработчик. Если один путь имеет другие ограничения, его нужно описать и отдельно защитить. Результат авторизации полезно проверять рядом с действием. Между предварительным чтением и записью права или состояние могут измениться. Конкретная реализация зависит от архитектуры, но приёмочный сценарий должен учитывать отзыв членства и изменение роли. Допуск не должен оставаться бессрочным только из-за старого состояния клиента. Файлы, ссылки и экспорты Файл — часть клиентских данных, даже если хранится вне основной базы. У него должны быть владелец, правила чтения и срок доступности выбранного механизма. Открытый путь в хранилище или незащищённая постоянная ссылка может нарушить изоляцию при правильно работающей таблице документов. Проверяйте предпросмотр, скачивание, обработку изображений и экспорт. Временная ссылка должна выдаваться после проверки права и не предоставлять больше, чем нужно. Названия файлов и метаданные также могут раскрывать сведения. Путь хранения не должен случайно зависеть от изменяемого публичного названия организации. Экспорт часто выполняется асинхронно. Зафиксируйте контекст пользователя, контура и состава операции. Если право отозвано до выдачи файла, нужно согласованное поведение. Если файл готов, но пользователь переключился на другой контур, интерфейс должен ясно показывать принадлежность результата и не смешивать списки. Массовая выгрузка требует отдельного разрешения. Возможность читать одну запись не всегда означает возможность скачать всю клиентскую базу. Ограничение объёма, журналирование и правила хранения результата обсуждают до реализации. Сотрудник поддержки не должен получать экспорт всех организаций ради разбора одного обращения. Фоновые задачи и очереди Фоновая задача должна переносить проверенный контекст и сохранять его при повторе. Если обработчик теряет идентификатор клиента, он может использовать общий источник или изменить чужую запись. Контекст нельзя восстанавливать по случайному текущему пользователю: фон выполняется независимо от открытого интерфейса. Для повторов нужен устойчивый идентификатор операции и правильная область уникальности. Один внешний номер может встретиться у разных клиентов. Если дедупликация глобальная там, где должна быть клиентской, система пропустит допустимое событие. Если ключ не различает версии изменения, обновление может потеряться. Разделяйте техническую ошибку и ошибку бизнес-данных. Временную недоступность можно повторить по согласованному правилу, неверное сопоставление требует исправления. Необрабатываемые события должны быть видимы оператору с контуром и причиной. При этом диагностические материалы не должны раскрывать данные другим клиентам. Управляйте влиянием большого клиента на очередь. Нужны понятные лимиты, справедливая обработка либо выделенные ресурсы там, где это обосновано. Одна массовая операция не должна бесконтрольно вытеснять обычные действия остальных. Правила определяются нагрузкой и продуктовым обещанием, а не универсальным размером очереди. Кеш и поисковые индексы Ключ кеша должен учитывать все условия, влияющие на результат, включая контур и права там, где они существенны. Иначе ответ для одного клиента может быть повторно использован для другого. Это относится к серверному кешу, клиентским запросам, отчётам и промежуточным сервисам. Поисковый индекс требует такой же модели границ, как база. Фильтр выдачи должен быть обязательным и проверяемым, а права — учитываться в доступе к результату. Нельзя считать безопасность обеспеченной только потому, что ссылка после открытия проверяется: сам фрагмент выдачи уже может содержать чужую информацию. Проверяйте инвалидирование при изменении членства, роли и данных. Старый ответ может оставаться доступным после отзыва права, если система не учитывает смену контекста. Укажите допустимое поведение кеша и критические сценарии. Для чувствительных операций решение нельзя оставлять

Автор: , Senior Backend Developer, 404gen.

404gen — креативное digital-агентство полного цикла, работаем удалённо по всей России.

Телефон: +7 993 729-59-59 (пн–пт, 10:00–19:00 МСК). WhatsApp: +7 913 141-20-96. Telegram: @aporkulevich. Почта: ap@404gen.ru.