Event Sourcing — это архитектурный подход, при котором состояние приложения определяется последовательностью событий (events), которые происходят в системе. Вместо того чтобы сохранять текущее состояние объекта, система сохраняет все события, которые привели к этому состоянию. Эти события можно воспроизвести, чтобы восстановить состояние объекта на любой момент времени.
События — это неизменяемые (immutable) записи о том, что произошло в системе. Например, в системе управления заказами событием может быть "Заказ создан", "Заказ оплачен" или "Заказ отменен".
Хранилище событий — это база данных, которая сохраняет все события в хронологическом порядке. Оно позволяет воспроизводить события для восстановления состояния системы.
Агрегаты — это объекты, которые обрабатывают события и обновляют свое состояние на основе этих событий. Агрегат может быть, например, заказом в системе управления заказами.
Проекции — это представления данных, которые создаются на основе событий. Например, текущее состояние заказа может быть проекцией, которая строится на основе всех событий, связанных с этим заказом.
Рассмотрим простой пример на Java, где мы реализуем базовый Event Sourcing для управления состоянием заказа.
public class Order {
private String orderId;
private OrderStatus status;
private List<OrderEvent> events = new ArrayList<>();
public Order(String orderId) {
this.orderId = orderId;
this.status = OrderStatus.CREATED;
}
public void applyEvent(OrderEvent event) {
events.add(event);
switch (event.getType()) {
case ORDER_PAID:
this.status = OrderStatus.PAID;
break;
case ORDER_CANCELLED:
this.status = OrderStatus.CANCELLED;
break;
// другие типы событий
}
}
public List<OrderEvent> getEvents() {
return Collections.unmodifiableList(events);
}
public OrderStatus getStatus() {
return status;
}
}
public enum OrderStatus {
CREATED, PAID, CANCELLED
}
public class OrderEvent {
private String orderId;
private OrderEventType type;
public OrderEvent(String orderId, OrderEventType type) {
this.orderId = orderId;
this.type = type;
}
public OrderEventType getType() {
return type;
}
}
public enum OrderEventType {
ORDER_CREATED, ORDER_PAID, ORDER_CANCELLED
}
Event Sourcing — это мощный подход, который позволяет сохранять полную историю изменений в системе и восстанавливать состояние на любой момент времени. Он особенно полезен в системах с высокой требовательностью к аудиту, сложной бизнес-логикой и в микросервисных архитектурах. Однако его реализация требует тщательного проектирования и может быть сложной для поддержки.