5

Here это хорошая статья, которая описывает, что такое ES и как с этим бороться.EventSourcing race состояние

Все в порядке, но одно изображение беспокоит меня. Здесь

ES example

Я понимаю, что в распределенных системах на основе событий, мы можем достичь только в конечном итоге консистенцию. В любом случае ... Как мы гарантируем, что мы не заказываем больше мест, чем доступно? Это особенно проблема, если есть много параллельных запросов.

Возможно, что n агрегатов заполнены с таким же количеством зарезервированных мест, и все эти совокупные экземпляры позволяют резервировать.

+0

Это просто простая оптимистическая блокировка ... – plalx

ответ

2

Существует несколько способов борьбы с таким сценарием.

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

Хорошо, если ваши команды обработаны за очередью, все отказы следует повторить. Если вам не удастся обработать запрос, вы должны ввести нормальный сценарий «Прошу прощения, Дейв, я боюсь, что не могу этого сделать», сообщив пользователю, что им следует попробовать что-то еще.

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

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

Надежда, что помогает :)

0

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

Все события являются закрытыми для команды, выполняющей их, пока книга записи не признает успешную запись. Таким образом, мы вообще не обмениваемся событиями, и мы не сообщаем об этом вызывающему абоненту, не зная, что наша версия «что произошло дальше» была принята в книге записей.

Запись событий аналогична сравнению и свопинга указателя хвоста в совокупной истории. Если другая команда изменила указатель на хвост во время работы, наша своп завершилась неудачно, и мы должны уменьшить/повторить/сбой.

На практике это обычно реализуется, если команда записи в книгу записи включает ожидаемую позицию для записи. (Пример: ES-ExpectedVersion в GES).

Ожидается, что книга записи отклонит запись, если ожидаемая позиция не в том месте.Подумайте о позиции как уникальном ключе в таблице в РСУБД, и у вас есть правильная идея.

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

Это типично для команд, чтобы читать потоки событий непосредственно из книги записей, а не в конечном итоге согласованные модели чтения.

Может случиться так, что n-AggregateRoots будет заполнено таким же количеством зарезервированных мест, что означает, что проверка в резервном методе не поможет. Затем n-AggregateRoots выдает событие успешного резервирования.

Каждый бит состояния должен контролироваться одним корнем агрегата. У вас может быть n разных копий этого корня, все из которых конкурируют за запись в одну историю, но операция сравнения и свопа разрешает только один победитель, который гарантирует, что «совокупность» имеет единую внутренне согласованную историю.

 Смежные вопросы

  • Нет связанных вопросов^_^