w dniu
dev
devops
platform_engineering
security
- Pobierz link
- X
- Inne aplikacje
MSA Patterns: Event Sourcing – Wzorzec Projektowy w Architekturze Mikrousług
W architekturze mikrousług (MSA), zarządzanie stanem aplikacji i danymi to jedno z najważniejszych wyzwań. Tradycyjne podejścia, w których systemy po prostu aktualizują swoje bazy danych, mogą być problematyczne, gdy system staje się bardziej złożony i rozproszony. Event Sourcing to wzorzec, który pozwala na efektywne zarządzanie stanem aplikacji poprzez przechowywanie wszystkich zdarzeń, które zmieniają ten stan.
W tradycyjnych systemach aktualizujemy dane, nadpisując poprzednią wartość – np. w bazie danych. W Event Sourcingu każda zmiana stanu systemu jest zapisywana jako zdarzenie (ang. event). Zamiast zapisywać aktualny stan, zapisujemy historię zdarzeń, które doprowadziły do tego stanu. Dzięki temu możemy odtworzyć dowolny poprzedni stan systemu, co daje większą elastyczność i niezawodność.
Poniżej przedstawiamy przykład prostego systemu zarządzania kontem bankowym z zastosowaniem wzorca Event Sourcing w Javie.
Najpierw definiujemy zdarzenia, które będą zapisywane w systemie:
public interface Event {}
public class MoneyDepositedEvent implements Event {
private final String accountId;
private final double amount;
public MoneyDepositedEvent(String accountId, double amount) {
this.accountId = accountId;
this.amount = amount;
}
public String getAccountId() {
return accountId;
}
public double getAmount() {
return amount;
}
}
public class MoneyWithdrawnEvent implements Event {
private final String accountId;
private final double amount;
public MoneyWithdrawnEvent(String accountId, double amount) {
this.accountId = accountId;
this.amount = amount;
}
public String getAccountId() {
return accountId;
}
public double getAmount() {
return amount;
}
}
Kolejnym krokiem jest odtworzenie stanu konta na podstawie sekwencji zdarzeń:
public class Account {
private String accountId;
private double balance = 0.0;
public Account(String accountId) {
this.accountId = accountId;
}
public void apply(Event event) {
if (event instanceof MoneyDepositedEvent) {
this.balance += ((MoneyDepositedEvent) event).getAmount();
} else if (event instanceof MoneyWithdrawnEvent) {
this.balance -= ((MoneyWithdrawnEvent) event).getAmount();
}
}
public double getBalance() {
return balance;
}
}
Na koniec implementujemy mechanizm, który będzie obsługiwał zapisywanie i odtwarzanie zdarzeń:
import java.util.ArrayList;
import java.util.List;
public class EventStore {
private List<Event> events = new ArrayList<>();
public void addEvent(Event event) {
events.add(event);
}
public List<Event> getEvents() {
return events;
}
}
Wzorzec CQRS (Command Query Responsibility Segregation) często współpracuje z Event Sourcing. CQRS rozdziela operacje zapisu (zmian stanu) i odczytu, co pozwala na lepszą optymalizację tych procesów. Dzięki Event Sourcing możemy odtworzyć aktualny stan systemu na podstawie historii zdarzeń, a CQRS pozwala na rozdzielenie obsługi tych zdarzeń od zapytań.
Poniżej znajduje się przykład diagramu sekwencji, który przedstawia przepływ zdarzeń w systemie opartym na Event Sourcing.
Wyzwania związane z Event Sourcing
Chociaż Event Sourcing oferuje wiele korzyści, warto również pamiętać o kilku wyzwaniach:
Event Sourcing to potężny wzorzec projektowy, który umożliwia pełne śledzenie i odtwarzanie stanu aplikacji. Jest szczególnie przydatny w rozproszonych systemach opartych na mikrousługach, gdzie konieczna jest niezawodność, elastyczność i pełna historia działań. Dzięki zastosowaniu Event Sourcing można lepiej zarządzać stanem aplikacji, integrując go z innymi wzorcami, takimi jak CQRS, oraz czerpać korzyści z asynchronicznego przetwarzania danych
Komentarze
Prześlij komentarz