Я создаю сервис, который будет действовать как уровень абстракции перед внешним API, который ненадежен. Уровень абстракции обеспечит устойчивость, гарантируя, что команды в конечном итоге сработают в случае сбоя. Позже он обеспечит кеширование запросов.
Мы используем MassTransit в новом сервисе для организации вызовов внешнего API. MT также обеспечивает повторные попытки, автоматическое выключение, регулирование и т. д.
Мне нужен совет о том, когда использовать действия MassTransit vs Consumers из StateMachine. Есть три сценария, которые я хотел бы рассмотреть:
Запрос ресурса у внешнего API изнутри конечного автомата. Нам нужно обрабатывать успехи, неудачи и тайм-ауты. Кажется очевидным использовать здесь потребителя запроса-ответа.
Отправка команды внешнему API из конечного автомата. Нам нужно обрабатывать успехи, неудачи и повторные попытки. Нам также нужны повторные попытки, регулирование и аварийное отключение для обработки сбоев. Является ли активность лучшим выбором здесь?
Отправка команды от одного конечного автомата для взаимодействия с другим. Нам нужно обрабатывать успехи, неудачи и повторные попытки. Уместна ли здесь команда, обрабатываемая другим конечным автоматом?
Спасибо за совет
В настоящее время у меня есть смесь потребителей и действий. Оба подхода работают хорошо. Однако в настоящее время я использую только память; Я еще не рассматривал параллелизм.
Итак, хотя подходы, которые я пробовал, хорошо работают в ситуациях счастливого пути, мне больше интересно узнать о преимуществах каждого подхода с учетом параллелизма и, в меньшей степени, о том, какой подход является более семантически правильным.
Обратите внимание: третья сторона не предоставляет конечные точки DELETE, поэтому в настоящее время не существует компенсирующих действий в случае ошибки.





Publish/Send по мере необходимости.В случае 3 вы можете посмотреть, как MassTransit использует несколько конечных автоматов для службы заданий и как они взаимодействуют.
Потребителей следует использовать для 1 и 2, поскольку время их выполнения недетерминировано, и саги обычно выполняются внутри транзакции базы данных.