Прослушивание нескольких событий

Как работать с коррелированными событиями в архитектуре, управляемой событиями? Конкретно, что, если для выполнения какого-либо действия необходимо инициировать несколько событий. Например, у меня есть микросервис, который прослушивает два события foo и bar и выполняет действие только тогда, когда оба события поступают и имеют одинаковый идентификатор корреляции.

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

Есть ли лучший подход?


person spacemonkey    schedule 29.05.2016    source источник
comment
Вы ищете, похож ли конечный автомат на концепцию SAGA в NServiceBus?   -  person Sean Farmar    schedule 30.05.2016
comment
Это похоже на работу для шаблона Aggregator!   -  person tom redfern    schedule 15.06.2016


Ответы (2)


Классический пример — когда приходит заказ на распродаже и публикуется событие. И Finance, и Shipping подписаны на событие, но доставка также подписана на событие, исходящее от Finance.

ожидание поступления всех событий

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

Здесь есть несколько решений, но мне никогда не нравились графические. Как разработчик .NET в прошлом я использовал K2 и Windows Workflow Foundation, но самые гибкие решения создаются в коде, а не через графический интерфейс.

В настоящее время я бы использовал для этого NServiceBus или MassTransit. Кстати, сейчас я работаю в Particular Software, и мы делаем NServiceBus. У NServiceBus есть Sagas для такой работы (документация), и вы также можете прочитать в моем блоге о презентация, в т.ч. код на GitHub.

Термин saga немного загружен, но в основном он обрабатывает длительные (бизнес) процессы. Грегор Хопе называет это Process Manager (ссылка).

Подводя итог тому, что делают саги: они создаются входящими сообщениями и имеют состояние. Входящие сообщения привязываются/отправляются к конкретному экземпляру саги на основе идентификатора корреляции, например customer id или order id. После обработки сообщения (события) состояние сохраняется до тех пор, пока не поступит новое сообщение или пока код не пометит эпопею как завершенную и состояние не будет удалено из хранилища.

Как было сказано, в мире .NET MassTransit и NServiceBus поддерживают это, но, скорее всего, есть альтернативы в других средах.

person Dennis van der Stelt    schedule 02.06.2016

Если я правильно понимаю, похоже, вам нужен CEP (комплексный обработчик событий), например ws02 cep или other , который делает именно это. cep может агрегировать события и выполнять действия при выполнении определенных условий.

person amir aharon    schedule 01.06.2016