Этот вопрос касается очень низкого уровня представления источников событий и во многом зависит от фактической реализации хранилища событий.В общем, я могу дать вам ответ, надеясь пролить свет на ваше понимание хранилищ событий.
Единственная цель потока событий - дать возможность перебиратьсписок событий, которые не кажутся такими полезными, может быть, я что-то упускаю, но почему я не могу просто избавиться от потока событий и назвать его днем?
Да, поток событий предоставляет средство дляпереберите возможный большой список событий, не извлекая их все из хранилища событий блокирующим образом.Обычно он используется только для чтения событий, поэтому его интерфейс не содержит методов для добавления событий в хранилище событий.
Итак, клиентскому коду нужны только события из потока.
При добавлении событий в хранилище событий для защиты от одновременных записей необходимо передать ожидаемую версиюПоток событий.Это можно сделать, используя параметр version
для метода EventStore.appendEvents(expectedVersion, newEvents)
, или он может передать ранее загруженный поток событий и позволить хранилищу событий получить последний увиденный version
, тем самым уменьшая связь кода клиента с фактическимреализация механизма блокировки потока событий.Таким образом, подпись добавляющего метода может быть такой:
EventStore.appendEvents(previousEventStream, newEvents)
Итак, клиентский код не знает / не заботится о том, какой механизм блокировки (оптимистический или пессимистический) использует хранилище событий для защиты от одновременныхпишет.
Один пример этого можно найти здесь (заявление об отказе: это мое) :
public function appendEventsForAggregate(AggregateDescriptor $aggregateDescriptor, $eventsWithMetaData, AggregateEventStream $expectedEventStream): void;