Я понимаю, что вышеупомянутый вопрос, вероятно, поднимает несколько вопросов «что?», Но позвольте мне попытаться объяснить:
Я пытаюсь обдумать несколько взаимосвязанных концепций, в основном шаблон Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) в сочетании с Event-sourcing (DDD-концепция). : http://en.wikipedia.org/wiki/Domain-driven_design )
Хороший пост, который объединяет его: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
Я подойду к вопросу через минуту, но я думаю, что сначала я должен попытаться суммировать то, что я понимаю о нем (что может быть неправильно, поэтому, пожалуйста, исправьте, если это так), так как это может повлиять на то, почему я задать вопрос для начала:
- Шаблон Saga - это своего рода брокер, который дает действию (конечному пользователю, автоматизированному и т. Д. Практически все, что собирается изменить данные), разделяет это действие в бизнес-действиях и отправляет каждое из этих действий в виде сообщений в шину сообщений, которая в свою очередь отправляет его в соответствующие совокупные корни, о которых нужно позаботиться.
- Эти совокупные корни могут работать полностью автономно (хорошее разделение задач, отличная масштабируемость и т. Д.)
- Сам Saga-экземпляр не содержит никакой бизнес-логики, которая содержится в агрегатных корнях, в которые он отправляет действия. Единственная «логика», содержащаяся в саге, - это «логика процесса» (часто реализуемая как Statemachine), которая на основе полученных действий (а также последующих событий) определяет, что делать (т.е. какие действия отправлять)
- Saga-шаблоны реализуют своего рода шаблон распределенных транзакций. То есть: когда один из агрегатных корней (которые снова работают автономно, не зная о существовании друг друга), терпит неудачу, все действие, возможно, придется откатить.
- Это достигается за счет наличия всех совокупных корней, после завершения отчета о деятельности они возвращаются в Сагу. (В случае успеха, а также ошибки)
- В случае, если все совокупные корни возвращают успех, внутренняя машина состояний, если Saga определяет, что делать дальше (или решает, что сделано)
- В случае неудачи Сага выдает всем совокупным корням, которые принимали участие в последнем действии, так называемое Компенсационное действие, то есть: действие, чтобы отменить последнее действие, которое выполнил каждый из совокупных корней.
- Это может быть просто «минус 1 голос», если действие «плюс 1 голос», но это может быть более сложным, чем восстановление блога в предыдущей версии.
- Источник событий (см. Объединение этих двух статей в блоге) направлен на сохранение результатов всех действий, выполняемых каждым из агрегатных корней, в централизованном хранилище событий (в этом контексте изменения называются «событиями»).
- Это хранилище событий является «единой версией правды» и может использоваться для воспроизведения состояния всех объектов, просто повторяя сохраненные события (по сути, как журнал событий).
- Комбинация двух (то есть: предоставление агрегированным корням возможности использовать Event-Sourcing для передачи своих изменений перед передачей отчета в Saga) дает много хороших возможностей, одна из которых касается моего вопроса
Я почувствовал, что мне нужно снять это с плеча, так как это можно понять сразу. Учитывая этот контекст / мышление (опять же, пожалуйста, исправьте, если не так)
вопрос: когда агрегатный корень получает действие Compensate и если этот агрегатный корень передал на аутсорсинг свои изменения состояния с использованием Event-sourcing, не будет ли действие Compensate Action во всех ситуациях просто удалением последнего события в хранилище событий для этого данный совокупный корень? (Предполагая, что постоянная реализация позволяет удалять)
Это имело бы для меня большой смысл (и было бы еще одним большим преимуществом этой комбинации), но, как я уже сказал, я могу делать эти предположения на основе неправильного / неполного понимания этих концепций.
Я надеюсь, что это не слишком затянуто.
Благодарю.