Может ли в микросервисной архитектуре быть одна общая база данных для всех сервисов?

«Может ли в микросервисной архитектуре быть одна общая база данных для всех сервисов?» — вопрос из категории Виртуализация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Использование единой общей БД для бизнес-логики микросервисов считается антипаттерном и нарушает ключевые принципы этой архитектуры.

Почему это плохая практика?

  1. Нарушение независимости развертывания: Изменение схемы таблицы, используемой несколькими сервисами, требует скоординированного развертывания всех этих сервисов, что сводит на нет преимущества микросервисов.
  2. Точка отказа: Падение или проблемы с производительностью этой БД выводят из строя всю систему.
  3. Сложность масштабирования: Невозможно выбрать оптимальный тип СУБД (PostgreSQL, MongoDB, Redis) под конкретную задачу сервиса.
  4. Размытие границ контекстов: Сервисы становятся тесно связанными через данные, что ведет к созданию «распределенного монолита».

Правильный подход — 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), но не для основной бизнес-логики.