Gymterview
middle

Database per Service или Shared Database -- какой подход выбрать?

Database per Service — это принцип, при котором каждый микросервис владеет собственным хранилищем данных. Shared Database — общая БД для нескольких сервисов. Правильный подход для микросервисов — Database per Service, Shared Database допустим только как временное решение при миграции.

Database per Service

Пример
┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│ Payment      │  │ Customer     │  │ Notification │
│ Service      │  │ Service      │  │ Service      │
└──────┬───────┘  └──────┬───────┘  └──────┬───────┘
       │                 │                 │
┌──────▼───────┐  ┌──────▼───────┐  ┌──────▼───────┐
│ PostgreSQL   │  │ PostgreSQL   │  │  MongoDB     │
│ (payments)   │  │ (customers)  │  │ (notif.)     │
└──────────────┘  └──────────────┘  └──────────────┘
Критерий Database per Service Shared Database
Связность Слабая — сервисы независимы Сильная — общая схема
Хранилище Оптимальное для каждого сервиса Единое для всех
JOIN-запросы Невозможны между базами Простые JOIN
Транзакции Saga (eventual consistency) ACID
Масштабирование БД Независимое Общее
Отказоустойчивость Сбой одной БД не влияет на другие БД — единая точка отказа
Дублирование данных Неизбежно Нет

Компромисс – Schema per Service

Пример
-- Каждый сервис имеет свою схему в одной БД
CREATE SCHEMA payment_service;
CREATE SCHEMA customer_service;

-- Сервисы обращаются ТОЛЬКО к своей схеме
GRANT USAGE ON SCHEMA payment_service TO payment_svc_user;
REVOKE ALL ON SCHEMA customer_service FROM payment_svc_user;

Рекомендации

  • Начинайте с Database per Service — это правильный подход для микросервисов.
  • Если нужны данные другого сервиса — запрашивайте через API, а не через прямой доступ к БД.
  • Shared Database — только как временное решение при миграции с монолита (паттерн Strangler Fig).
  • Для отчётов и аналитики — используйте CQRS с отдельной read-моделью.

На собеседовании: рекомендуйте Database per Service как целевой подход и объясните, почему: слабая связность и независимость. Но покажите, что понимаете цену: Saga вместо ACID и невозможность JOIN. Упомяните Schema per Service как промежуточный шаг.