сага.
Допустим у меня есть 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, мне хватит просто понять смысл и идею)
Спасибо!
@oop_ru
А в чём логика отдавать ответ клиенту до того, как будет известен результат обработки его запроса?
Что если при получении запроса держать его 30 секунд и в течение этого времени каждую секунду проверять статус заказа? У вас система разделена на микросервисы, как вы связываете их между собой? База у вас тоже разделена или монолитная?
Обсуждают сегодня