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

Всем привет! Есть вопрос по хореографической оркестрации микросервисов и паттерне

сага.

Допустим у меня есть 3 микросервиса order, payment, notification. Веб клиент делает http запрос POST /orders и пытается создать заказ и у него триггерится цепочка ивентов. В примере по сагам https://microservices.io/patterns/data/saga.html я вижу, что они предлагают создать заказ со статусом PENDING и когда цепочка ивентов закончится и вся бизнес логика выполнится менять статус заказа на COMPLETED это и будет означать, что запрос выполнился успешно. Но получается, что после того как клиент сделает POST запрос, ему order микросервис сразу вернет ответ с текущим статусом PENDING и параллельно запустить первый ивент и тогда клиент сразу не узнает, есть ли какие-то проблемы перед созданием заказа или нет. Только после обновления он сможет увидеть новый статус и причину ошибки, если такова будет. Интересует можно ли как-то обойти это и вернуть ответ клиенту сразу, когда цепочка ивентов закончится? Например, если payment сервис вернет ошибку недостаточно средств для создания заказа, хочется чтобы клиент сразу после нажатия кнопки создать заказ, после условного лоадера ему вернулась эта ошибка.

Какие варианты я рассмотривал:
1) Делать на клиенте поллинг. Как по мне так себе решение и фактически лишняя нагрузка на сервер.
2) Переделать все взаимодействия на вебсокеты и тогда по завершению цепочки ивентов, передает ивент в вебсокет с результатом обработки запроса. Тоже не особо вариант, потому что требует лишних усилий на фронте.
3) Делать какой-то поллинг на сервисе принявший запрос. Это скорей всего вообще может не сработать. Потому что допустим у нас кубик с репликами сервиса и у нас будет конечный ивент orders:created:success и тогда сервис, который принял запрос от клиента может не обработать конечный ивент, а например его подхватит другая реплика, где нет req клиента сделавший запрос

Заранее извиняюсь, если вопрос прозвучит как нубский, но спустя сутки гугления ничего отвечающий на мой вопрос я не нашел. Буду рад просто ссылкам на примеры или описание (необязательно на NodeJs, мне хватит просто понять смысл и идею)

Спасибо!

3 ответов

13 просмотров

@oop_ru

А в чём логика отдавать ответ клиенту до того, как будет известен результат обработки его запроса?

Что если при получении запроса держать его 30 секунд и в течение этого времени каждую секунду проверять статус заказа? У вас система разделена на микросервисы, как вы связываете их между собой? База у вас тоже разделена или монолитная?

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта