Files
digital-garden/dev/architecture/Multitenancy.md
Struchkov Mark 58127ccecd
All checks were successful
continuous-integration/drone/push Build is passing
Обновление
2025-01-28 20:21:30 +03:00

94 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
tags:
- maturity/🌱
date: 2025-01-28
---
Multitenancy (мультиарендность) — это [[Архитектурный паттерн|архитектурный подход]] в разработке программного обеспечения, при котором одна инсталляция приложения обслуживает несколько независимых клиентов (арендаторов, **tenants**). Этот подход широко используется в облачных приложениях и [[Software as a Service|SaaS]], чтобы оптимизировать использование ресурсов и упростить управление системой.
**Основные аспекты Multitenancy**
1. **Tenant** — это отдельный клиент системы, который может представлять компанию, организацию или пользователя. Каждому арендатору предоставляется ощущение, что он работает с собственным приложением, хотя технически это один экземпляр.
2. **Изоляция данных** — данные каждого арендатора изолированы от других. Это может быть достигнуто разными способами, от использования отдельных баз данных до разделения данных в пределах одной таблицы.
3. **Общие ресурсы** — приложение, серверы, инфраструктура (например, база данных или сервер API) могут использоваться совместно всеми арендаторами, что снижает затраты на поддержку.
**Преимущества Multitenancy**
- **Экономия ресурсов**: Использование одной инстанции позволяет сократить затраты на серверы, обновления и управление.
- **Упрощенное обновление**: Обновление приложения на уровне всей системы вместо работы с каждой инстанцией отдельно.
- **Снижение времени на развертывание**: Новый арендатор может быть добавлен в систему быстро.
**Недостатки Multitenancy**
- **Сложность в реализации**: Разделение данных, обеспечение безопасности и настройка кастомизации требуют дополнительных усилий.
- **Риски утечек данных**: Неправильная конфигурация может привести к тому, что данные одного арендатора будут доступны другому.
- Ограничения [[Масштабирование информационной системы|масштабируемости]]: В некоторых сценариях одна инстанция может не справляться с нагрузкой.
**Варианты реализации Multitenancy**
- **Одна база данных, общая схема**:
- Все арендаторы используют одну базу данных и одну схему.
- Данные разделяются с помощью столбца, например tenant_id.
- **Плюсы**:
- Простая реализация и минимальные затраты на управление.
- Подходит для большого числа арендаторов.
- **Минусы**:
- Сложнее обеспечить безопасность и [[Масштабирование информационной системы|масштабируемость]].
- Риск потери производительности при большом объеме данных.
- **Одна база данных, несколько схем**:
- У каждого арендатора своя схема в базе данных.
- **Плюсы**:
- Лучшая изоляция данных.
- Упрощенная миграция данных между арендаторами.
- **Минусы**:
- Более сложное управление.
- Ограничения базы данных по количеству схем.
- **Отдельная база данных для каждого арендатора**:
- **Плюсы**:
- Максимальная изоляция данных и высокая безопасность.
- Упрощенная настройка бэкапов.
- **Минусы**:
- Увеличение затрат на управление и инфраструктуру.
- Сложнее масштабировать при большом числе арендаторов.
- **Выделенная инфраструктура**: У каждого арендатора не только своя база данных, но и свои серверы приложений.
- **Плюсы**: Абсолютная изоляция данных и производительности.
- **Минусы**: Высокие затраты на разработку и поддержку.
## О чем стоит подумать
Внедрение multitenancy — это задача, требующая продуманного подхода. Вот советы, которые помогут грамотно реализовать multitenancy:
**Определитесь с уровнем изоляции данных**. Первым шагом нужно решить, как данные будут изолироваться между арендаторами:
- **Одна база данных, общая схема**
- **Одна база данных, отдельные схемы для арендаторов**
- **Отдельная база данных для каждого арендатора**
**Разработайте механизм идентификации арендаторов**. Ваше приложение должно “знать”, с каким арендатором оно работает:
- Используйте **поддомен** (e.g., tenant1.crm.com), чтобы определять арендатора по URL.
- Передавайте идентификатор арендатора через **заголовки HTTP** или токены доступа (например, JWT с tenant_id).
- Подумайте о настройках “по умолчанию”, если арендатор не указан (например, демонстрационный режим).
**Реализуйте гибкость в настройках для арендаторов**. Система должна позволять кастомизацию для каждого арендатора:
- **UI/UX**: Логотип, цветовая схема, название компании.
- **Функциональность**: Включение/отключение модулей (например, модуль отчетности, интеграции).
- **Бизнес-логика**: Разные правила для обработки сделок, клиентов или аналитики.
**Позаботьтесь о безопасности**. Безопасность — один из ключевых факторов в multitenancy. Убедитесь, что:
- **Изоляция данных**: Каждый запрос фильтруется по tenant_id или привязан к отдельной схеме/базе.
- **Шифрование**:
- Данные должны быть зашифрованы в покое и при передаче.
- Используйте разные ключи шифрования для каждого арендатора.
- **Роли и доступы**: Гибкая система управления ролями, чтобы пользователи арендаторов видели только свои данные.
**Планируйте систему обновлений**
- Backward compatibility: Не ломайте существующий функционал для арендаторов при выпуске обновлений.
- Используйте feature toggles: Включайте новые функции для отдельных арендаторов постепенно.
- Тестируйте обновления на выделенной “песочнице”.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]]
**Родитель**:: [[Архитектурный паттерн]]
**Источник**::
**Создана**:: [[2025-01-28]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->