Size: a a a

NestJS — русскоязычное сообщество

2021 February 01

K

Konstantin in NestJS — русскоязычное сообщество
Anton Larichev
Паттерн где для одного сервиса - 1 база, распространён и имеет преимущество в виде возможности разнести нагрузку на базу, всегда одного ответственного за базу, но и имеет минусы:
- Необходимость управлять группой транзакций, если она затрагивает несколько сервисов
- Зависимости между микросервисами, которые сложно отследить.
- Не удобное использование данных для аналитики, так как они разнесены.

Для уменьшения связанности и управления транзакциями лучше всего использовать паттерн saga, где есть управляющий сервис, который оркестрирует микросервисы. Это может быть даже само API, но лучше делать отдельный сервис под конкретные доменные области, чтобы например управление заказами не замешивались с статьями для сайта.

Можно обойтись без управляющего сервиса, тогда саги нужно вносить внутрь самих сервисов и каждый инициализирует свою сагу.

Для обмена также рекомендую Kafka или RMQ (сам всегда использую RMQ). Главное увлекаясь микросервисами не сделать nano сервисы) Для этого советую почитать про DDD.
А есть какой-то минимальный пример?
источник

AL

Anton Larichev in NestJS — русскоязычное сообщество
Можно подробнее почитать тут: https://microservices.io/patterns/data/saga.html
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
Konstantin
У меня вопрос, но не по Несту, а больше по микросервисам самим.

Паттерн говорить дб для каждого сервиса. Окей.

Есть вот сервис каталога товаров.
Есть сервис выполненных заказов.
Есть естественно сервис юзеров.


Нормально ли сервис выполненных заказов будет дергать сервис юзеров и сервис каталога?  Тогда сервисы буду связанны? Это же анти паттерн.

Окей, можно использовать Реббит или Кафку и писать в базу заказов уникальных юзеров которые сделали заказ и уникалные товары которые были заказаны?
В принципе МС-ы это хорошо однозначно, но нужно подумать сотню раз нужно ли вам это, ибо потери по скорости работы есть, плюс дополнительная нагрузка на саму систему а целом из-за того что есть дополнительные запросы в несколько сервисов, что в монолите можно было сделать одни запросом в базу.

Если же говорить про логику связи между мс-ами, обычно делают центральный gateway который за это отвечает и получается что МС-ы знать не знают что есть ещё кто-то.
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
@AlariCode привет, спасибо за отличную либу по работе с кроликом, получилось очень даже неплохо.
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Veaceslav Artiom
В принципе МС-ы это хорошо однозначно, но нужно подумать сотню раз нужно ли вам это, ибо потери по скорости работы есть, плюс дополнительная нагрузка на саму систему а целом из-за того что есть дополнительные запросы в несколько сервисов, что в монолите можно было сделать одни запросом в базу.

Если же говорить про логику связи между мс-ами, обычно делают центральный gateway который за это отвечает и получается что МС-ы знать не знают что есть ещё кто-то.
А что значит что мс не знают что есть ещё кто-то?
источник

K

Konstantin in NestJS — русскоязычное сообщество
Veaceslav Artiom
В принципе МС-ы это хорошо однозначно, но нужно подумать сотню раз нужно ли вам это, ибо потери по скорости работы есть, плюс дополнительная нагрузка на саму систему а целом из-за того что есть дополнительные запросы в несколько сервисов, что в монолите можно было сделать одни запросом в базу.

Если же говорить про логику связи между мс-ами, обычно делают центральный gateway который за это отвечает и получается что МС-ы знать не знают что есть ещё кто-то.
Спасибо. Я для себя хочу научиться.
Меня правда очень смущает то что будет куча дублирующихся данных в различных базах.
shared-db как по мне вполне нормальный подход, где как минимум те сущности которые нужны в большенстве сервисов.
источник

AL

Anton Larichev in NestJS — русскоязычное сообщество
Veaceslav Artiom
@AlariCode привет, спасибо за отличную либу по работе с кроликом, получилось очень даже неплохо.
О, спасибо) Рад, что пригодилась. Никак руки не дойдут сделать отдельный сайт с более детальной документацией.
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
Alex Kulagin 🏡
А что значит что мс не знают что есть ещё кто-то?
В смысле тогда что на уровне DTO, маршрута выполнения запроса, сервисы между собой не общаются. Все логику связи, подготовки данные для выполнения запроса делает сам gateway
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Ок, что тут гейтвей тогда? Кто-то кто знает про всех?
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
Alex Kulagin 🏡
Ок, что тут гейтвей тогда? Кто-то кто знает про всех?
Знает про все и так же отвечает за работу с клиентами (граф, рест)
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Тип такого схема тогда?
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
Alex Kulagin 🏡
Ок, что тут гейтвей тогда? Кто-то кто знает про всех?
Отвечу сразу, да - это очень большая точка отказа ...
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Вооот
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
А зачем?
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
Alex Kulagin 🏡
А зачем?
А как бы ты сделал ?
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Прямые взаимодействия в рамках транзакции через прямые обращение, сайд эффекты через шину
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Как побочный результат имеем граф связей
источник

VA

Veaceslav Artiom in NestJS — русскоязычное сообщество
Alex Kulagin 🏡
Прямые взаимодействия в рамках транзакции через прямые обращение, сайд эффекты через шину
Это если мы говорим про рест, а с графом такое вроде как не пройдет
источник

AK

Alex Kulagin 🏡 in NestJS — русскоязычное сообщество
Граф стоит только для пользователя как отдельный сервис
источник