Как мы должны обрабатывать длительный процесс с помощью nservicebus

Я знаю, что это кажется очевидным для многих людей, но мой клиент использует шаблон, который мне не очень удобен.

Дело в том, что их клиент отправляет депозит или снятие средств, которые через nservicebus отправляются в стороннюю систему. Сторонняя система должна позаботиться об этой транзакции, но это может занять дни, а может быть, и недели, прежде чем транзакция будет завершена.

Сегодняшнее решение состоит в том, что создается сага, которая сначала отправляет сообщение для передачи транзакции в стороннюю систему. Когда закончите, следующим шагом саги будет проверка обновления завершения. Если транзакция не завершена, отправляется requesttimeout, «как ожидание». Когда тайм-аут достигнут, та же проверка выполняется еще раз, и отправляется новый запрос тайм-аута... и так далее. Это было вечным циклом. Что еще он делает, так это полностью заполняет ServiceInsight одним и тем же SagaTimeout снова и снова.

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

Чтобы добавить, сторонняя система не может отправить событие о завершении транзакции, что означает, что нам нужно опросить обновления завершения.

Другое, что я считаю лучшим решением, было бы сохранить статус транзакции, отправить транзакцию третьей стороне и закончить эту конкретную сагу. Затем создайте сагу, которая проверяет наличие обновлений завершения с использованием временных интервалов.

Является ли это распространенным шаблоном для использования sagatimeouts таким образом? И лучше ли иметь сагу/обработчик, проверяющий только обновления завершения?


person Per    schedule 04.11.2015    source источник


Ответы (2)


Насколько я могу судить, вы делаете это так, как это должно быть сделано. Конечно, вы могли бы начать отдельную сагу для обработки тайм-аутов, но я не вижу веских причин для этого.

Поскольку вы не знаете, когда транзакция/процесс завершится в сторонней системе, конечный пользователь не может быть очень чувствителен ко времени, поэтому вам не нужно очень часто запрашивать тайм-ауты. Вы даже можете подсчитать количество тайм-аутов в данных саги и увеличить временной интервал для следующего тайм-аута, чтобы свести к минимуму количество тайм-аутов. Вы также можете проверить, как долго выполняется сага, и предупредить кого-либо (вас или клиента и т. д.), если сторонняя система заняла «слишком много времени» для завершения транзакции. Вот где саги NSB действительно сияют, они действительно гибки в решении таких ситуаций.

И, конечно же, не используйте SLR для такого рода вещей, он предназначен только для повторного запуска обработчиков при возникновении прерывистой ошибки.

person Trygve    schedule 04.11.2015

IMO, похоже, что ваша сага смешивает технические проблемы (опрос внешней службы, ожидание того, что что-то произойдет) с проблемами домена (желание быть уведомленным, когда это произойдет).

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

Таким образом, у саги может быть тайм-аут для всего процесса (например, чтобы проверить, что процесс завершился в течение четырех недель, или любое другое, что, по вашему мнению, является максимальным временем, которое он должен занять до всех) и просто подписаться на событие TransactionCompleted из интеграции услуга.

person mookid8000    schedule 05.11.2015
comment
В этом случае вы предлагаете, чтобы служба интеграции была nsb saga внутри отдельной конечной точки, которая в основном просто обрабатывает тайм-ауты/опросы? - person Trygve; 07.11.2015
comment
может быть, да - а может и не надо для этого использовать сагу? не может ли опрос быть чем-то простым, например, System.Timers.Timer, который время от времени проводит опрос и публикует свои открытия как события? - person mookid8000; 09.11.2015
comment
Похоже, mookid8000 предлагает мою первоначальную мысль, проводя опрос вне начальной саги. и Trygve говорит, что это уже правильно реализовано. Да, оба будут работать, но каков на самом деле путь NServicebus? Моя первоначальная мысль заключалась в том, что было бы плохой идеей прерывать сагу и инициализировать новый запуск снова и снова... но, возможно, это способ сделать это. - person Per; 10.11.2015
comment
ИМО и из того, что Андреас Олунд сказал в речи, на которой я присутствовал несколько лет назад, этот сценарий — именно то, для чего предназначена сага. Если вы решите использовать отдельную сагу для тайм-аутов, чтобы не загрязнять основную сагу большим количеством тайм-аутов, это, вероятно, нормально. У саги есть много преимуществ по сравнению с обычными пакетными заданиями или даже таймерами для опроса, они сохраняются, поэтому в случае перезапуска службы они будут выбраны с того места, где они остались. И у него нет проблем с всплесками процесса, типичными для пакетных заданий. В сети много презентаций по использованию NSB в сценариях интеграции... - person Trygve; 12.11.2015