Ответ
Использование единой общей БД для бизнес-логики микросервисов считается антипаттерном и нарушает ключевые принципы этой архитектуры.
Почему это плохая практика?
- Нарушение независимости развертывания: Изменение схемы таблицы, используемой несколькими сервисами, требует скоординированного развертывания всех этих сервисов, что сводит на нет преимущества микросервисов.
- Точка отказа: Падение или проблемы с производительностью этой БД выводят из строя всю систему.
- Сложность масштабирования: Невозможно выбрать оптимальный тип СУБД (PostgreSQL, MongoDB, Redis) под конкретную задачу сервиса.
- Размытие границ контекстов: Сервисы становятся тесно связанными через данные, что ведет к созданию «распределенного монолита».
Правильный подход — Database per Service:
- Каждый сервис владеет своей собственной БД, доступ к которой есть только у него.
- Сервисы общаются друг с другом только через четко определенные API (обычно HTTP/gRPC) или асинхронные сообщения (например, через Kafka).
Пример инфраструктуры как код (Terraform) для изолированных БД:
# База данных для сервиса заказов
resource "aws_db_instance" "orders" {
identifier = "orders-db-prod"
engine = "postgres"
# ... другие параметры
}
# База данных для сервиса пользователей
resource "aws_dynamodb_table" "users" {
name = "users-table-prod"
hash_key = "UserId"
# ... другие параметры
}
Исключения: Общие базы данных иногда допустимы для нефункциональных задач, таких как централизованное логирование (Elasticsearch), мониторинг (TimescaleDB) или кеширование (Redis), но не для основной бизнес-логики.