Логическое удаление с источником событий (возможно, с конфиденциальными данными / 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

В демоверсии нажмите ссылку "Изменить" и нажмите кнопку "Удалить". Внизу страницы, смотрите событие, которое создается.

Другие вопросы по тегам