Получить доступ

Почему действует правило «одна база данных на сервис»?

MiddleМонолит и микросервисы
Ещё спрашивают так:
  • Почему у каждого микросервиса своя база?
  • Как получить данные другого сервиса без общей базы?
Коротко

Своя база нужна ради независимого изменения схемы и защиты инвариантов: только владелец пишет в свои данные по своим правилам. Дело не в нагрузке.

  • Общая база — главный признак распределённого монолита
  • Данные чужого сервиса: запрос к владельцу, локальная копия по событиям, отдельная модель чтения
  • Цена — согласованность в конечном счёте и отказ от JOIN и общих транзакций

А ещё «Своя база» может быть своей схемой на общем сервере — важна не железка, а владение

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Почему общая база вредна. Она удобна: JOIN работает, транзакция одна. Но любой сервис может читать и писать чужие таблицы в обход бизнес-правил владельца, а схему уже нельзя менять, не согласовав со всеми читателями. Независимость выкатки и развития пропадает — получается распределённый монолит.

Как получать чужие данные:

  • синхронный запрос к API владельца — просто, но связывает доступность и задержки;
  • локальная копия через события (event-carried state transfer): владелец публикует изменения, потребитель хранит нужные ему поля. Работает при недоступности владельца, данные отстают;
  • отдельная модель чтения (CQRS) — собранная из событий нескольких сервисов для запросов, которые иначе требовали бы JOIN.

Цена: согласованность в конечном счёте, дублирование данных, невозможность общей транзакции — изменения в нескольких сервисах согласуются сагами и outbox.

Важная деталь: «своя база» — это про владение, а не про отдельный сервер. Отдельные схемы и пользователи на одном кластере с запретом доступа к чужим таблицам выполняют правило и экономят эксплуатацию.

Что хотят услышать

  • Причины: независимая эволюция схемы и защита инвариантов.
  • Способы получать чужие данные и их компромиссы.
  • Цена: согласованность в конечном счёте, саги вместо транзакций.
  • Своя схема на общем сервере как допустимый вариант.

Частые ошибки

  • Объяснять правило нагрузкой на базу.
  • Делать синхронный запрос к другому сервису на каждый JOIN.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Общая база лишает сервисы независимости: схему нельзя менять отдельно, и любой сервис может нарушить чужие инварианты
  • ✗Потому что одна база не выдерживает нагрузки нескольких сервисов
  • ✗Потому что разные сервисы обязаны использовать разные СУБД
  • ✗Потому что JOIN между таблицами разных сервисов работает медленно

Что спросят дальше

  • Как тогда получать данные другого сервиса?
  • Что такое event-carried state transfer?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем