С помощью Event Sourcing, как аннулировать и исправить событие, представляющее отчет / заявку / запись? - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в Event Sourcing и планирую использовать его для промышленного применения для отслеживания соединений между резервуарами, трубами и различными физическими компонентами на производственном объекте.

Моя первоначальная идея заключалась в использовании команд и событий.такие как ConnectPipeToTankPipeConnectedToTank.Однако «книга рекордов» - это не само приложение, а то, что физически происходит на производственном объекте.Поэтому более целесообразно использовать команды и события, такие как ReportPipeConnectedToTankPipeConnectedToTankReported.

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

Но, разумеется, ничто не гарантирует точности этих отчетов (опечатки, злонамеренные записи, неполные знания во время ввода и т. Д.).Таким образом, нам нужен способ исправить отчет, не удаляя знания о том, что отчет был неверным в какой-то момент времени: мы должны иметь возможность вносить изменения в отчет.Мы хотим, чтобы двухвременная система могла выполнять аудиты.

В источниках событий события являются неизменяемыми, так что как правильно сделать недействительными и исправить события, представляющие отчеты?

Я думал оДва способа справиться с этим:

Я предоставляю новую пару команд и событий для исправления отчета CorrectPipeConnectedToTankReportPipeConnectedToTankReportCorrected, а также для аннулирования отчета InvalidatePipeConnectedToTankReportPipeConnectedToTankReportInvalidated, где эти события будутссылка на исходное событие.

Или я предоставляю новое универсальное событие для аннулирования любого другого события, представляющего отчет: ReportInvalidated, которое будет ссылаться на рассматриваемое событие.И затем, чтобы исправить отчет CorrectPipeConnectedToTankReportReportInvalidated, PipeConnectedToTankReported и сделать отчет недействительным InvalidatePipeConnectedToTankReportReportInvalidated.

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

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Мартин Фаулер отвечает на этот вопрос на своем веб-сайте о ретроактивном событии .

[…] ретроактивное событие всегда является событием само по себе.[…] Рассмотрим отклоненный случай события - фактически это удаление события в журнале событий.Однако весь смысл журнала событий заключается в том, что мы никогда не удаляем событие.Итак, что мы можем сделать, это вставить событие отклонения в журнал […]

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

К исправить событие отчета / заявки / записи, сначала опубликуйте EventRejected, который содержит event_id события, которое необходимо отклонить, а затем опубликовать новый отчет / заявку / событие с исправленными данными.

0 голосов
/ 26 ноября 2018

Я новичок в Event Sourcing и планирую использовать его для промышленного применения для отслеживания соединений между резервуарами, трубами и различными физическими компонентами на производственном объекте.

«Книга рекордов»это не само приложение, а то, что физически происходит на производственном объекте.

Хороший доклад для обзора - обсуждение Грегом Янгом источников событий для складских систем .

Моя рекомендация: вероятно, будет проще думать о сообщениях, поступающих в вашу систему с производственного объекта, как события , а не как команды.Книга записей - это средство, ваше решение - хранить в кэше копию этой книги записей.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...