Прослушивание нескольких событий
Как бороться с коррелированными событиями в архитектуре, управляемой событиями? Конкретно, что, если несколько событий должны быть запущены, чтобы выполнить какое-то действие. Например, у меня есть микросервис, который слушает два события 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 или другой, который делает именно это. Белые грибы могут агрегировать события и выполнять действия при соблюдении определенных условий.