Почему Event Stream в шаблоне событий? - PullRequest
0 голосов
/ 24 апреля 2018

Хотел убедиться, что у меня есть ясность, просто выбрасывая вещи случайным образом.

База данных EVENT STORE

| p_key | invoice_id | Event type        | Version | Data |
|-------|------------|-------------------|---------|------|
| 1     | 41234      | Invoice_Generated | 1       | JSON |
| 2     | 34241      | Invoice_Generated | 1       | JSON |
| 3     | 12345      | Invoice_Generated | 1       | JSON |
| 4     | 12345      | Invoice_Reviewed  | 2       | JSON |
| 5     | 12345      | Invoice_Paid      | 3       | JSON |

боковые компоненты JAVA

  1. Магазин событий:
  2. Поток событий
  3. Событие

Хранилище событий отвечает как за получение списка событий, так и за сохранение событий в базе данных, когда все будет сделано.

public interface EventStore {
    EventStream loadEventStream(AggregateId aggregateId);
    void store(AggregateId aggregateId, long version, List<Event> events);

}

Событие - это, по сути, одна из строк, извлеченных из базы данных.

public interface Event<T> {
    AggregateId getAggregateId();

    int getVersion();

    String getEventType();

    void applyOn(T account);
}

что я не получаю - это использование потока событий. Для меня нет смысла, зачем мне нужен поток событий

public interface EventStream extends Iterable<Event> {
    long version();

    void addAll(List<Event> changes);
}

Является ли единственной целью потока событий дать возможность перебирать список событий, который не кажется настолько полезным, может быть, я что-то упускаю, но почему я не могу просто избавиться от потока событий и вызвать его за день?

Источник: https://github.com/Pragmatists/eventsourcing-java-example/tree/excercise_1_solution/eventsourcing/src/main/java/com/pragmatists/eventsourcing

1 Ответ

0 голосов
/ 25 апреля 2018

Этот вопрос касается очень низкого уровня представления источников событий и во многом зависит от фактической реализации хранилища событий.В общем, я могу дать вам ответ, надеясь пролить свет на ваше понимание хранилищ событий.

Единственная цель потока событий - дать возможность перебиратьсписок событий, которые не кажутся такими полезными, может быть, я что-то упускаю, но почему я не могу просто избавиться от потока событий и назвать его днем?

Да, поток событий предоставляет средство дляпереберите возможный большой список событий, не извлекая их все из хранилища событий блокирующим образом.Обычно он используется только для чтения событий, поэтому его интерфейс не содержит методов для добавления событий в хранилище событий.

Итак, клиентскому коду нужны только события из потока.

При добавлении событий в хранилище событий для защиты от одновременных записей необходимо передать ожидаемую версиюПоток событий.Это можно сделать, используя параметр version для метода EventStore.appendEvents(expectedVersion, newEvents), или он может передать ранее загруженный поток событий и позволить хранилищу событий получить последний увиденный version, тем самым уменьшая связь кода клиента с фактическимреализация механизма блокировки потока событий.Таким образом, подпись добавляющего метода может быть такой:

EventStore.appendEvents(previousEventStream, newEvents)

Итак, клиентский код не знает / не заботится о том, какой механизм блокировки (оптимистический или пессимистический) использует хранилище событий для защиты от одновременныхпишет.

Один пример этого можно найти здесь (заявление об отказе: это мое) :

public function appendEventsForAggregate(AggregateDescriptor $aggregateDescriptor, $eventsWithMetaData, AggregateEventStream $expectedEventStream): void;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...