Domain Boundaries определяют четкие границы между доменами в системе, обеспечивая высокую связность внутри домена (high cohesion) и слабую связность между доменами (loose coupling). Следуем принципам Domain-Driven Design (DDD).
Bounded Contexts
Принципы определения границ
1. Bounded Context = Микросервис
Каждый bounded context реализуется как отдельный микросервис:
1 2 3 4 5 | |
2. Database per Service
Каждый сервис владеет своей базой данных:
1 2 3 4 5 6 7 8 9 10 11 | |
Запрещено: - ❌ Direct database access между сервисами - ❌ Shared database между сервисами - ❌ Foreign keys между базами разных сервисов
Разрешено: - ✅ gRPC/REST API calls между сервисами - ✅ Event-driven communication через Kafka - ✅ Денормализация данных (eventual consistency)
3. Aggregate Design
Каждый aggregate — это transactional boundary:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Правила: - Один aggregate = одна транзакция - Связи между aggregates только через ID (no object references) - Invariants enforced только внутри aggregate
Domain Boundaries — детализация
Identity Domain
Ответственность: Управление пользователями и их идентификаторами (email, phone).
Aggregates: - User — корневой aggregate, статус пользователя - Identifier — email/phone, привязанные к пользователю - VerificationChallenge — OTP коды для верификации
Owned Data:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
Public API (gRPC):
1 2 3 4 5 6 7 8 9 | |
Published Events:
1 2 3 4 5 6 7 8 9 10 | |
Credential Domain
Ответственность: Безопасное хранение и верификация паролей.
Aggregates: - PasswordCredential — единственный aggregate
Owned Data:
1 2 3 4 5 6 7 | |
Public API (gRPC):
1 2 3 4 5 | |
Published Events:
1 2 3 4 | |
Security Principle: Credential Service НИКОГДА не возвращает пароли или хеши. Только true/false на верификацию.
Auth Domain
Ответственность: Управление сессиями и токенами.
Aggregates: - Session — корневой aggregate, сессия пользователя
Owned Data:
1 2 3 4 5 6 7 8 9 10 | |
Public API (gRPC):
1 2 3 4 5 | |
Published Events:
1 2 3 4 | |
Account Domain
Ответственность: Управление организационными аккаунтами, командами, подписками.
Aggregates: - Account — корневой aggregate, организационный аккаунт - Team — команда внутри аккаунта - Subscription — подписка аккаунта
Owned Data:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Consumed Events:
1 2 3 4 5 6 7 | |
Notification Domain (Herald)
Ответственность: Отправка уведомлений (email, SMS, push).
Aggregates: - NotificationTemplate — шаблоны сообщений - Delivery — запись о доставке уведомления
Consumed Events:
1 2 3 4 | |
External Integrations: - SendGrid (email) - Twilio (SMS) - Firebase Cloud Messaging (push)
Cross-Domain Communication Patterns
1. Synchronous (gRPC)
Используется для операций, требующих немедленного ответа:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
2. Asynchronous (Kafka Events)
Используется для eventual consistency и loosely coupled integration:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
3. Saga Pattern (Distributed Transactions)
Для операций, требующих координации нескольких сервисов:
Shared Kernel (минимальный)
Общие концепции, используемые во всех сервисах:
1 2 3 4 5 6 7 8 9 10 11 | |
Принцип: Shared Kernel должен быть минимальным. Дублирование кода лучше, чем tight coupling.
Anti-patterns (избегаем)
❌ Distributed Monolith
1 2 3 4 5 6 | |
Правильно:
1 2 3 4 5 | |
❌ Chatty Communication
1 2 3 4 5 6 7 8 | |
Правильно:
1 2 3 4 5 | |
❌ Anemic Domain Model
1 2 3 4 5 6 7 8 9 | |
Правильно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Связанные страницы
- API Design Principles — REST/gRPC API guidelines
- Event Design Principles — Event schema design
- Identity Domain — детальное описание Identity domain
- Backend / Service Patterns — паттерны реализации