212 похожих чатов

Насколько вообще разумное решение запрещать сервисам любую синхронную комуникацию друг

с другом? У нас есть пачка сервисов, и когда сервису А требуются какие-то данные из сервиса B, то API gateway в рамках одного запроса либо забирает их из B и передаёт в A, либо сама бизнес логика переносится в гейтвей и он на основе данных из обоих сервисов решает что делать. Мне кажется это очень не удобно, но мне говорят, что это стандартная практика и сервисы вообще друг с другом по http не общаются.

12 ответов

13 просмотров

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

через API сервиса пусть общаются друг с другом, зачем запрещать то? напрямую нельзя например в базу другого сервиса лазить, а через внешний API можно

Андрей Рудин
через API сервиса пусть общаются друг с другом, за...

Обычно это приводит к потере автономности, усложнению кодовой базы, влечёт за собой дальнейшее ошибочное доменное разделение и в итоге скатывается всё к распределенному монолиту с коллчейнами в 5-12 сервисов

Manicotti- Автор вопроса
Arthur Irgashev
Обычно ит депендс. Много синхрона действительно ск...

Ну вообще то, что гейтвей сервису присылает нужные ему данные, как по мне, автономности не особо прибавляет, если сравнивать с синхроном. С другой стороны большинство таких кейсов у нас обычно связано с авторизацией, а ей, вроде как, место как раз в гейтвее. Просто очень топорно получается, типичный сценарий: У сущности есть определенный статус, в котором её редактировать могут только пользователи с определенным правом. Выходит на гейтвее мы сначала получаем сущность из сервиса А, смотрим на статус, если для него требуется право, идем в сервис прав Б и проверяем есть ли оно у него, иначе просто даем пользователю отредактировать её. Реплицировать всех пользователей с их правами не вариант. Переносить авторизацию в сервис А тоже как-то неправильно.

Arthur Irgashev
Обычно это приводит к потере автономности, усложне...

А потом кто-то решает добавить асинхрон, и получается вообще тотально неподдерживаемая лапша с кучей рейскондишнов и абсолютно непредсказуемым поведением и непонятными бизнес процессами

Manicotti
Ну вообще то, что гейтвей сервису присылает нужные...

А почему бы права и роли не прокинуть в сам сервис ?

тут много вопросов короч которые влияют: 1. мы когда говорим о асинхронных взаимодействиях, мы говорим о том когда сервису А не важно когда сервис Б сделает операцию? или же просто то же что и с синхронным только не по http а через кафку условную? Что подразумеваем? 2. "авторизация" - не смешиваем ли мы понятие "авторизации" и "бизнес ограничений". Как проверить - если штука в определенном статусе - это влияет на "кто может делать" или "может ли делать вообще"? Вопрос локальности данных и того как эти ограничения с точки зрения temporal coupling и stale data зависят друг от друга. Может быть эти данные должны быть в одном сервисе. А быть может "статус" надо убрать и разделить сущность так что бы за разные этапы жизненного цикла отвечали свои сервисы 3. мы когда сервисы выделяем мы по сущностям это делаем или по bounded context? 4. мы в микросервисы вляпались потому что нужда заставила (автономность команд) или мы в игрушки поиграть решили (все и так поддерживает команда или две)

сервис - это единица, которая обслуживает запросы, отдельная. сервисы могут пользоваться услугами других сервисов, какие тут проблемы?

Андрей Рудин
сервис - это единица, которая обслуживает запросы,...

в целом "сервис" это некая штука которая обслуживает некие buisness capability и обычно строится вокруг bounded context, обслуживает некий под-процесс во флоу пользователя или некую бизнес логику. проверить качество границ можно расписав все зависимости всех сервисов друг от друга. Если на это предложение команда разработчиков скажет "ты че, там же пизда как сложно" значит границы кривые

Manicotti- Автор вопроса
Sergey P
тут много вопросов короч которые влияют: 1. мы к...

1. Тут речь именно о синхронщине, потому-что нам не нужно никаких операций в Б проводить, нам нужно что-то сделать в А, основываясь на данных из Б, т.е получить их нужно вот прям щас. 3. Про bounded context тут вряд ли слышали, разделяем по сущностям в основном 4. Вообще чисто ради масштабируемости как я понял

1. распределенный стэйт это smell 3. вы сами себе роете могилу 4. почитайте ньюмана, вы сейчас скорее всего копаете могилу продукту

Manicotti- Автор вопроса

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта