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

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

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

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

2 ответа

Классический пример - это когда заказ поступает в продажу и публикуется событие. И Финансы, и Судоходство подписаны на событие, но судоходство также подписано на событие, прибывающее из финансов.

в ожидании всех событий, чтобы войти

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

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

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

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

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

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

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

Другие вопросы по тегам