Я понимаю, что в распространяет системы на основе событий, мы можем достичь только в конечном итоге консистенцию, так или иначе ... Как не позволяют бронировать места, чем у нас? Особенно с точки зрения многих одновременных запросов?
Все события являются закрытыми для команды, выполняющей их, пока книга записи не признает успешную запись. Таким образом, мы вообще не обмениваемся событиями, и мы не сообщаем об этом вызывающему абоненту, не зная, что наша версия «что произошло дальше» была принята в книге записей.
Запись событий аналогична сравнению и свопинга указателя хвоста в совокупной истории. Если другая команда изменила указатель на хвост во время работы, наша своп завершилась неудачно, и мы должны уменьшить/повторить/сбой.
На практике это обычно реализуется, если команда записи в книгу записи включает ожидаемую позицию для записи. (Пример: ES-ExpectedVersion в GES).
Ожидается, что книга записи отклонит запись, если ожидаемая позиция не в том месте.Подумайте о позиции как уникальном ключе в таблице в РСУБД, и у вас есть правильная идея.
Это означает, что запись в поток событий равна Фактически последовательный - книга записи разрешает запись только в том случае, если позиция, которую вы пишете, верна, а это означает, что позиция не изменилась с тех пор была записана копия истории, которую вы загрузили.
Это типично для команд, чтобы читать потоки событий непосредственно из книги записей, а не в конечном итоге согласованные модели чтения.
Может случиться так, что n-AggregateRoots будет заполнено таким же количеством зарезервированных мест, что означает, что проверка в резервном методе не поможет. Затем n-AggregateRoots выдает событие успешного резервирования.
Каждый бит состояния должен контролироваться одним корнем агрегата. У вас может быть n разных копий этого корня, все из которых конкурируют за запись в одну историю, но операция сравнения и свопа разрешает только один победитель, который гарантирует, что «совокупность» имеет единую внутренне согласованную историю.
Это просто простая оптимистическая блокировка ... – plalx