2010-11-21 4 views
9

Gdy migawki agregatów nie są zsynchronizowane z dziennikiem zdarzeń, mogę po prostu odtworzyć moje zdarzenia z wczesnych migawek (które powinny być zsynchronizowane). To samo mogę zrobić, dodając/usuwając nowe pola lub modyfikując logikę istniejących procedur obsługi.Jak radzić sobie z sytuacjami, gdy model odczytu nie był zsynchronizowany z dziennikami zdarzeń?

Jeśli potrzebuję dodać nowy model odczytu (np. Nowy widok raportu), mogę zrobić to samo jeszcze raz - powtórzę swoje zdarzenia.

Ale jak mam sobie radzić z sytuacją, gdy model odczytu nie jest zsynchronizowany z dziennikiem zdarzeń? Przechowywanie zdarzeń i publikowanie odbywa się w jednej transakcji, ale aktualizacja modelu odczytu wystąpiła w innej transakcji, która może się nie powieść. Powtarzanie wydarzeń od samego początku może pomóc, ale może trwać wieczność. Czy potrzebuję koncepcji migawek dla całego przeczytanego modelu?

Jak rozwiązać ten problem? Dziękuję.

Odpowiedz

7

Jaki byłby powód niepowodzenia w obsłudze zdarzenia? Jak długo trwa "wieczność"?

Odczytywanie aktualizacji modelu rzadko kończy się niepowodzeniem (w przeciwieństwie do procedur obsługi komend), ponieważ logika wewnątrz jest niezwykle prosta. Awarie mogą być spowodowane przejściowymi problemami (przerwa w sieci IO/sieci) i będą obsługiwane automatycznie przez magistralę komunikatów.

Jeśli jednak model odczytu ulegnie uszkodzeniu z jakiegoś powodu, najprościej będzie go zresetować i przeskanować zdarzenia. Nawet miliony zdarzeń zajęłyby stosunkowo mało czasu. Ponadto możesz zawsze zastosować metodę Map-Reduce.

Polecam przeciwko wprowadzaniu migawek do odczytu modeli. Myślę, że to po prostu komplikuje architekturę bez żadnych znaczących zysków.

+1

Dziękuję Rinat! Czy w przypadku powtarzania zdarzeń od początku używasz jednego wątku programów obsługi zdarzeń? Ponieważ w przypadku, gdy użyję kilku wątków roboczych, otrzymam niepoprawne wyniki (podczas gdy będą działać w produkcji z powodu natury domenowej - stan wyścigu kilku zdarzeń nie jest możliwy podczas publikowania od prawdziwych użytkowników, ale możliwe podczas publikowania jeden po drugim dla kilku wątków roboczych). Czy na całym świecie przyznano, że powinniśmy używać tylko jednego wątku roboczego do przetwarzania zdarzeń od samego początku? Dziękuję za cenne odpowiedzi. –

+0

Dobre połączenie. Wolę unikać takich problemów ze współbieżnością, zawsze uruchamiając nie więcej niż 1 wątek na instancję jednostki (polecenia lub zdarzenia). Możemy więc mieć wiele wątków dla procedur obsługi zdarzeń, jednak każda pojedyncza instancja * widok * (identyfikowana przez jakąś tożsamość) będzie zawsze obsługiwana tylko przez pojedynczy wątek. Oczywiście jeden wątek może obsłużyć więcej niż jedną instancję widoku lub typ na raz. czy to pomaga? –

+0

Dziękujemy! Po kilku dniach analizy odpowiedzi myślę, że rozumiem mechanikę obsługi zdarzeń z wieloma wątkami roboczymi. Doceniam twoje odpowiedzi. –

Powiązane problemy