Mówi się, że w CQRS łatwo jest naprawić błąd, wystarczy ponownie wdrożyć, a następnie odtworzyć zdarzenia.
Ale co jeśli jedno ze zdarzeń spowoduje, że zewnętrzny system, który nie jest w twojej kontroli, „wyśle przedmiot” do klienta, jeśli po prostu odtworzysz zdarzenia, przedmiot zostanie wysłany dwukrotnie.
Jak to rozwiązujesz?
Z artykułu Martina Fowlera poświęconego zaopatrzeniu w wydarzenia :
Kiedy więc musisz przywrócić stan systemu do określonego momentu, odtwarzasz stan przechowywany , a nie procedury obsługi zdarzeń, aż do tego momentu.
Biorąc to pod uwagę, jeśli pracujesz tylko z danymi stanu, nie powinno to mieć żadnego wpływu na system zewnętrzny. O ile nie masz wyzwalaczy lub obserwatorów w swoim sklepie zdarzeń, w takim przypadku powinieneś je wyłączyć na czas przywracania. Ponieważ mówisz, że nie masz kontroli nad systemem zewnętrznym, nie powinieneś podejmować żadnych prób przywrócenia jego stanu za pomocą odsłoniętego interfejsu API, ponieważ nie wiesz, jakie skutki uboczne może mieć w tym systemie. Jeśli przywrócenie powoduje, że system znajduje się w stanie pośrednim (np. Z powodu nieudanych operacji w systemie zewnętrznym), nie powinno to wchodzić w zakres odpowiedzialności za odtworzenie zdarzenia.
źródło
Aby wybrać konkretny przykład, zastanówmy się, jak może działać „przynajmniej raz” podejście do skutków ubocznych.
Model domeny śledzi więc, co należy zrobić; ale pozostawia faktyczne działanie aplikacji
W kontekście uruchamiania polecenia podstawowy pomysł wygląda tak samo. Rzeczywiste skutki uboczne występują poza transakcją aktualizującą model.
Testy jednostkowe dla twojego modelu mogą wyglądać mniej więcej tak
Głównymi punktami są tutaj
źródło