【问题标题】:Deleting Events with Tombstones and Public / Private Data in an Event-Sourced System在事件源系统中删除带有墓碑和公共/私有数据的事件
【发布时间】:2020-01-07 02:15:08
【问题描述】:

David Schmitz 提到了在事件源系统in this talk 中删除用户数据的解决方案。它的工作原理是这样的:

  • 删除用户的所有事件
  • 为此特定用户发出 Tombstone 事件
  • 其他服务也可能监听 Tombstone 事件并清理数据

问题 #1

墓碑事件写入哪个流?

特定用户的事件流?还是有专门针对墓碑事件的事件流?


此外,为了保留一些数据(例如用户的 id),他建议将用户流拆分为公共和私有事件流。 (Reference to the talk)

问题 #2

您实际上如何将事件附加到两个流?

假设一个命令需要将一个事件附加到公共和私人用户流。您如何确保两个事件都已附加?事件存储是否将SomeUserEventHapppendPrivateSomeUsererEventHappendPublic 都发布到事件总线?您会为两个流独立创建快照吗?在我看来,这似乎是很多开销。


附:我也想听听其他策略(除了加密事件然后删除密钥)来删除事件源系统中的数据。

【问题讨论】:

    标签: microservices domain-driven-design cqrs event-sourcing


    【解决方案1】:

    问题 1: 你可以从一个事件开始,UserDeleteRequested,它有两个标志,一个是公共的,一个是私人的。您将有一个 BoundedContext(和关联的流)负责此更改。如您所述,其他服务可以侦听该事件。

    问题 2: 至于将数据分成两个流,这听起来像是同一个 BC 中的两个聚合。您实际上如何将事件附加到两个流?您将使用流程/传奇来加载每个聚合并在实际上是两阶段提交中引发墓碑事件。

    【讨论】:

    • 问题 #1:能否进一步解释您所说的“标志”是什么意思?正如我正确理解的那样,UserDeleteRequested 事件将存储在被删除用户的流中?
    • 问题 #2:所以我会附加例如SomeUserEventHapppendPrivate 到私有流并使用 saga 触发 SomeUsererEventHappendPublic 附加到公共流?并且事件存储会将这两个事件都发布到事件总线上?
    • @flolu 问题 #1:我所说的标志,只是指布尔值。您可以引发一个事件,UserDeleteRequested(public = true, private = false)。是的,这个事件将在 UserAggregate 的流中。
    • @flolu 问题 #2:我专门指的是向公共和私人两个流添加墓碑事件的问题。您将在 User 流中引发 UserDeleteRequested 事件,然后使用 saga 将这些更改传播到公共和私有聚合/流。这在很大程度上取决于您对流和聚合的实现和定义,因此请谨慎对待所有这些。
    猜你喜欢
    • 2021-02-03
    • 2015-06-04
    • 2014-10-16
    • 2019-07-09
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2018-12-03
    相关资源
    最近更新 更多