Od wielu lat rozmawiamy o tworzeniu systemów, które są lepiej podzielone. Łatwiejsze w rozbudowie i utrzymaniu, pięknie napisane i dobrze podzielone na moduły. Wiele czasu poświęciliśmy na dyskusje o mikroserwisach, CQRS, event sourcingu, itp. Ale czy można prościej? Postaram się przybliżyć proste podejście do event-driven architecture, wspomnę też o wadach.
35. Zła nazwa
- brak czasu przeszłego
- AssignTask
- przekazanie intencji
- SendNotification
- powoduje brak rozszerzalności kodu
- nazwa handlera
36.
37. Generalizowanie
- skup się na zachowaniu
- a nie na danych
- Prawidłowo:
- OrderConfirmed
- OrderShipped
- Nieprawidłowo:
- OrderChanged, OrderUpdated
41. “Prosty” async - zgubione zdarzenie
- gubimy np. start transakcji, albo utworzenie czegoś
- co jeśli przyjdzie event zakończenia, albo zmiany tego
“Czegoś”
46. Przepływ zdarzeń i transakcje
● Zdarzenie wysłane, a transakcja odrzucona
● Transakcja przeszła, ale nie udało się wysłać zdarzenia
47. Przepływ zdarzeń a transakcje
commit do db jest tu
DispatchAfterCurrentBusStamp, DispatchAfterCurrentBusMiddleware
48. Async a przepływ zdarzeń a transakcje
- At most once delivery - możliwe przeoczenie
- At least once delivery - możliwa duplikacja
- at most once processing
- “Listen to yourself”
49.
50. Obsługa błędów
- Jak wpływa na przepływ zdarzeń w systemie?
- Czy błąd jest “blokujący”
- Czy warto błąd obsługiwać?
51. Ukryte intencje
- Co jeśli OCZEKUJEMY reakcji na event?
- Co jeśli OCZEKUJEMY informacji zwrotnej?
Wzorzec SAGA, Process Manager
52. Zdarzenia a czas
- kiedy zdarzenie zaszło?
- problem z danymi w zdarzeniu, czy są aktualne
- dotyczy “grubych” zdarzeń
57. “Gratisowe” zalety
- bardzo prosta integracja z innymi systemami
- uproszczone debugowanie
- korzystamy z causation/correlation id i Datadog
- i więcej