使用事件溯源进行逻辑删除(可能使用敏感数据/GDPR)



我知道事件源应该是不可变的,并且只附加。

但是,我想知道如何处理逻辑删除。如果用户在 UI 上单击"删除",并且他们希望硬删除,我是否在我的事件中包含 IsDelete 标志?这里还有其他选择吗?

编辑:当周围有敏感数据时,这个问题特别有趣,可能存储在事件本身中,并且用户希望它完全从我们的系统中闪存出来。这可能与欧盟 GDPR 法规和法律有关。

您可以发布一个"已删除"事件,该事件将删除/标记为已删除的数据,但这不是硬删除(您在问题中指定(。数据仍保留在事件存储中。

使用事件溯源时,硬删除实际上非常困难。我假设您正在使用事件来源的客户数据?通常有一些解决方案,但它们并不漂亮:

  • 您要么不对敏感的客户数据进行事件采购,但将其单独存储,并以某种方式从聚合中引用这些数据

  • 您要么删除旧事件(请注意,这可能会破坏比您想要的更多,但这取决于您的设计/应用程序(

  • 您可以添加已删除的事件并更改现有事件以去除敏感数据。

是否在我的事件中包含IsDeleted标志?这里还有其他选择吗?

如果你问"我可以通过设置 isTDelete 标志来撤消事件吗?";不,我们通常不是这样做的。 相反,我们附加一个新事件来"反转"第一个事件的效果。 您有时会看到这被描述为补偿事件。 在成熟的领域(想想会计(,通常有一个明确的协议来逆转事件。

通常,不会在 UI 中显示事件,而是显示根据事件计算的读取模型。

例如,您可以有事件

TASK_CREATED"一">

TASK_CREATED"二">

TASK_CREATED"三">

TASK_DELETED"二">

在读取模型(任务列表(中,更新代码只需在事件TASK_CREATED添加项,并在事件TASK_DELETED删除它,因此结果列表将是:

"一">

"三">

因此,如果用户在 UI 中单击"删除",它会DELETE_TASK命令发送到聚合,聚合发布TASK_DELETED事件,并将此事件应用于读取模型(从列表中删除项(。现在,当您查询读取模型时,它将删除一个项目。

正如@Vincent Hendriks所说,"您可以发布一个'已删除'事件,该事件将删除/标记为读取数据库中已删除的数据"。

下面是一个很好的示例来演示此概念: http://next.belus.com/Demos/Events

在演示中,单击编辑链接,然后按删除按钮。在页面底部,查看创建的事件。

最新更新