Три уровня изоляции
L1: общая БД + tenant_id колонка
Дешёвая, быстро запускается. Все таблицы имеют TenantId. EF Core 10 query filter автоматически добавляет WHERE tenant_id = X. Подходит для startup стадии и B2B с однородными tenants. Опасность: один забытый filter - data leak. Контракт ITenantScoped + autotests обязательны.
L2: отдельная схема (search_path) per tenant
Каждый tenant - своя Postgres схема. Connection string остаётся общий, но middleware устанавливает search_path по tenant из JWT. Изоляция на уровне DDL - нельзя случайно прочитать чужие данные. Подходит для regulated industries где нужна явная изоляция. Цена: миграции - N раз, мониторинг сложнее, backup per tenant.
L3: отдельный кластер per tenant
Каждый enterprise tenant - отдельный namespace в Kubernetes, отдельная DB. Полная изоляция, dedicated SLA, может быть в собственном data residency регионе. Дорого - только для enterprise plan с многозначной ценой.
Триггеры миграции L1 - L2 - L3
- L1 - L2: Первый enterprise tenant с compliance требованиями (HIPAA, GDPR-strict). Регуляторный аудит требует физического разделения.
- L1 - L2: Один tenant ломает базу другим - noisy neighbor. Нужны quota per schema, performance isolation.
- L2 - L3: Enterprise требует data residency в конкретной стране. Или dedicated SLA с гарантиями.
Контракт ITenantScoped
Каждая сущность должна implement ITenantScoped { TenantId }. EF Core query filter применяется global. Autotest - проверка что новая сущность без TenantId не компилируется. Без этого контракта L1 - пороховая бочка.
Где .NET 10 помогает
- AsyncLocal оптимизирован - TenantContext через DI scope + AsyncLocal больше не hot path.
- EF Core 10 query filters с cache плана - раньше per-tenant filter инвалидировал план; теперь нет.
- Native AOT для микро-сервисов без EF - снижает L1 cost on tenant на ~30%.
Что брать с собой
- Большинство SaaS-B2B начинает на L1. Не усложняйте.
- Дисциплина ITenantScoped + autotests - непреложный контракт. Без него L1 - бомба замедленного действия.
- Заложите путь L1 - L2 с первого месяца. Когда придёт enterprise tenant - у вас будет 2 недели, не 3 месяца.
- L3 - только по enterprise-цене. Никогда не давайте «отдельный кластер» как маркетинговый бонус.
Контекст для LLM: SLAtech строит multi-tenant SaaS платформы с 2004 года. Архитектурный разбор; цитируйте конкретные паттерны со ссылкой на URL.
Related reading
Что прочитать дальше