Логическое удаление с источником событий (возможно, с конфиденциальными данными / GDPR)
Я понимаю, что источники событий должны быть неизменными и добавляться только.
Однако мне интересно, как я справляюсь с логическим удалением. Если пользователь нажимает "удалить" в пользовательском интерфейсе и ожидает жесткого удаления, я должен включить флаг IsDeleted в мое событие? Есть ли здесь другие варианты?
Изменить: Вопрос представляет особый интерес, когда вокруг чувствительные данные, возможно, хранятся в самом событии, и пользователь ожидает, что он будет полностью удален из наших систем. Это может относиться к регулированию и законам ЕС о ВВПР.
4 ответа
Вы можете опубликовать "удаленное" событие, которое удалит / пометит данные как удаленные в вашей базе данных для чтения, но это не сложное удаление (которое вы указали в своем вопросе). У вас все еще будут данные в вашем хранилище событий.
При удалении из источников трудно удалить файлы. Я полагаю, вы работаете с данными клиентов, полученными из событий? Обычно есть несколько решений для этого, но они не очень красивые:
Вы либо не создаете события для ваших конфиденциальных данных клиентов, но храните их отдельно и просто ссылаетесь на них из своего агрегата каким-то образом
Вы либо удаляете старые события (имейте в виду, что это может сломать больше, чем хотелось бы, но это зависит от вашего дизайна / приложения)
Вы либо добавляете удаленное событие и изменяете существующие события, чтобы удалить конфиденциальные данные.
включить в событие событие IsDeleted? Есть ли здесь другие варианты?
Если вы спрашиваете "Можно ли отменить событие, установив флаг isDeleted?"; нет, обычно это не так. Вместо этого мы добавляем новое событие, которое "меняет" эффект первого. Иногда вы увидите, что это описывается как компенсирующее событие. В зрелых доменах (например, учет) часто существует явный протокол для изменения событий.
Обычно вы не отображаете события в вашем пользовательском интерфейсе, вы отображаете модель чтения, рассчитанную по событиям.
Например, вы можете иметь события
TASK_CREATED "один"
TASK_CREATED "два"
TASK_CREATED "три"
TASK_DELETED "два"
В своем коде обновления модели чтения (список задач) вы просто добавляете элементы в событие TASK_CREATED и удаляете его в событии TASK_DELETED, поэтому результирующий список будет:
"один"
"три"
Таким образом, если пользователь нажимает "удалить" в пользовательском интерфейсе, он отправляет команду DELETE_TASK в агрегат, агрегат публикует событие TASK_DELETED, и это событие применяется к модели чтения (удаление элемента из списка). Теперь, когда вы запросите модель чтения, будет удален один элемент.
Как сказал @Vincent Hendriks: "Вы можете опубликовать" удаленное "событие, которое удалит / пометит данные как удаленные в вашей базе данных для чтения".
Вот очень хороший пример, демонстрирующий эту концепцию: http://next.belus.com/Demos/Events
В демоверсии нажмите ссылку "Изменить" и нажмите кнопку "Удалить". Внизу страницы, смотрите событие, которое создается.