Как мы должны обрабатывать длительный процесс, используя nservicebus
Я знаю, что это кажется вполне очевидным для многих людей, но мой клиент использует шаблон, который мне не очень удобен.
Дело в том, что их клиент отправляет депозит или вывод, который через nservicebus отправляется в стороннюю систему. Сторонней системе необходимо позаботиться об этой транзакции, но это может занять несколько дней, может быть, даже недель, прежде чем транзакция будет завершена.
Сегодняшнее решение состоит в том, что создается сага, которая сначала отправляет сообщение о переносе транзакции в стороннюю систему. Когда все готово, следующий шаг в сагах - это проверка обновления. Если транзакция не завершена, отправляется запрос timeout, "как ожидание". По истечении времени ожидания та же самая проверка выполняется еще раз и отправляется новый запрос времени ожидания... и так далее. Это был вечный цикл. Что еще он делает, это полностью заполняет ServiceInsight одним и тем же SagaTimeout снова и снова.
Я смотрю на зеркалку, но, кажется, вышло нехватка. Мне нужно только много попыток для конкретного сообщения, а не для всех сообщений.
Чтобы добавить, сторонняя система не может отправить событие транзакции было завершено, что означает, что нам нужно опросить обновления завершений.
Другое, на мой взгляд, лучшее решение - сохранить статус транзакции, отправить транзакцию третьей стороне и завершить эту конкретную сагу. Тогда есть сага, которая проверяет наличие обновлений с использованием временных интервалов.
Является ли обычным способом использовать sagatimeouts таким образом? И лучше ли иметь сагу / обработчик, проверяющий только обновления обновлений?
2 ответа
Насколько я могу сказать, вы делаете это так, как это должно быть сделано. Конечно, вы можете начать отдельную сагу, чтобы справиться с таймаутами, но я не вижу веских причин для этого.
Поскольку вы не знаете, когда транзакция / процесс завершится в сторонней системе, она не может быть очень чувствительной ко времени для конечного пользователя, поэтому вам не нужно часто запрашивать тайм-ауты. Вы даже можете посчитать количество тайм-аутов в данных саги и увеличить временной интервал для следующего тайм-аута, чтобы минимизировать количество тайм-аутов. Вы также можете проверить, как долго работает сага, и предупредить кого-либо (вас или клиента и т. Д.), Что сторонней системе потребовалось "слишком много времени" для завершения транзакции. Это то, где саги NSB действительно сияют, они действительно гибки в обращении с этими ситуациями.
И, конечно, не используйте SLR для такого рода вещей, он предназначен только для повторной обработки обработчиков при возникновении периодической ошибки.
Похоже, что ваша сага смешивает технические проблемы (опрос внешней службы, ожидание чего-либо случится) с проблемами домена (желание получать уведомления, когда это происходит).
По моему опыту, вы часто можете извлечь выгоду из изоляции своего домена от технических вещей, и в этом случае это, вероятно, будет означать, что вы должны поместить опрос в службу интеграции где-нибудь, что будет генерировать соответствующие события, когда что-то случится.
Таким образом, у саги может быть тайм-аут на весь процесс (например, чтобы проверить, что процесс завершился в течение четырех недель, или, как вы думаете, это максимальное время, которое должно пройти, прежде чем кто-либо) и просто подписаться на TransactionCompleted
событие от службы интеграции.