Załóżmy, że chcemy wdrożyć mały podsystem bezpieczeństwa dla aplikacji finansowej, która ostrzega użytkowników za pośrednictwem poczty e-mail w przypadku wykrycia dziwnego wzorca. W tym przykładzie wzorzec będzie składał się z trzech transakcji, jak pokazano. Podsystem zabezpieczeń może odczytywać zdarzenia z systemu głównego z kolejki.
Chciałbym otrzymać alert, który jest bezpośrednią konsekwencją zdarzeń, które mają miejsce w systemie, bez pośredniej reprezentacji, która modeluje bieżący stan wzorca.
- Monitorowanie aktywowane
- Transakcja przetworzona
- Transakcja przetworzona
- Transakcja przetworzona
- Alarm wyzwolony (id: 123)
- Wysłano wiadomość e-mail z ostrzeżeniem (dla identyfikatora: 123)
- Transakcja przetworzona
Mając to na uwadze, pomyślałem, że pozyskiwanie wydarzeń może mieć tutaj zastosowanie bardzo dobrze, chociaż mam pytanie bez jasnej odpowiedzi. Alarm wywołany w przykładzie ma wyraźny efekt uboczny, należy wysłać wiadomość e-mail, co powinno nastąpić tylko raz. Dlatego nie powinno się to zdarzyć podczas odtwarzania wszystkich zdarzeń agregatu.
W pewnym stopniu widzę wiadomość e-mail, która musi zostać wysłana, podobnie jak materializacje wygenerowane przez stronę zapytania, którą widziałem tyle razy w literaturze dotyczącej CQRS / zaopatrzenia w zdarzenia, jednak z tak niewielką różnicą.
W tej literaturze strona zapytania jest zbudowana z procedur obsługi zdarzeń, które mogą generować materializację stanu w danym punkcie, ponownie odczytując wszystkie zdarzenia. Jednak w tym przypadku nie można tego dokładnie zrobić z powodów wyjaśnionych wcześniej. Idea, że każdy stan jest przejściowy, nie ma tu tak dobrego zastosowania . Musimy odnotować fakt, że gdzieś wysłano alert.
Łatwym rozwiązaniem byłoby dla mnie posiadanie innej tabeli lub struktury, w której prowadziłbyś zapisy wcześniej uruchomionych alertów. Ponieważ mamy identyfikator, moglibyśmy sprawdzić, czy wcześniej wysłano alert o tym samym identyfikatorze. Posiadanie tych informacji sprawiłoby, że SendAlertCommand byłby idempotentny. Można wydać kilka poleceń, ale efekt uboczny wystąpi tylko raz.
Nawet mając to na uwadze, nie wiem, czy jest to wskazówka, że w tej architekturze jest coś nie tak z tym problemem.
- Czy moje podejście jest prawidłowe?
- Czy jest jakieś miejsce, w którym mogę znaleźć więcej informacji na ten temat?
Dziwne, że nie udało mi się znaleźć więcej informacji na ten temat. Może użyłem złego sformułowania.
Dziękuję bardzo!