Проверяет понимание принципа database-per-service в микросервисной архитектуре и умение обосновать выбор между общей и раздельной БД.
Микросервисная архитектура строится вокруг идеи слабой связанности (loose coupling) и независимого развёртывания. Если несколько сервисов пишут в одну и ту же схему БД, они становятся связанными через неё: изменение таблицы в одном сервисе ломает другой, миграции приходится синхронизировать, а масштабирование БД становится общим узким местом. Поэтому канонический принцип — database per service: каждый сервис владеет своей схемой и обращается к ней только сам.
Если данные нужны другому сервису, их получают через API или через события. Второй вариант предпочтительнее: сервис публикует событие в брокер (Kafka, RabbitMQ), а подписчики обновляют свои локальные проекции. Так возникает eventual consistency — данные согласованы не мгновенно, а через некоторое время.
// Сервис заказов публикует событие
await kafka.send('order.created', {
orderId: 42,
userId: 7,
total: 199.99
});
// Сервис аналитики слушает и пишет в свою БД
kafka.on('order.created', async (e) => {
await analyticsDb.insert('orders', e);
});
На старте проекта часто держат одну БД для нескольких сервисов — это быстрее в разработке. Но важно разделять схемы (schema per service) и запрещать прямые запросы в чужие таблицы. По мере роста сервисы выносят на отдельные инстансы. Также допустимы read-реплики и общие справочники (например, список стран), которые редко меняются.
Итог: своя БД у каждого сервиса — это цель, к которой стоит стремиться, потому что она даёт настоящую независимость. Но применять принцип нужно прагматично: на ранних этапах допустимы компромиссы, если границы владения данными соблюдаются.
Уровень
Рейтинг:
5
Сложность:
7
Навыки
Docker
Postgres
Ключевые слова
Подпишись на Node.js Developer в телеграм