将旧数据库迁移到 cqrs/事件溯源视图



我们有旧的遗留应用程序,其中包含复杂的业务逻辑,我们需要重写。我们考虑使用 cqrs 和事件溯源。但目前尚不清楚如何从旧数据库中迁移数据。可能我们只需要将其迁移到读取数据库,因为我们无法重现所有事件来填充事件存储。但是我们至少需要在事件存储中为每个聚合创建一些初始记录,例如AggregateCreated?或者我们需要编写一个脚本并逐个使用所有命令以与通常使用事件溯源相同的方式重新创建聚合?

使用现有数据库或其转换版本作为读取端持久性的开始从来都不是一个好主意。您的事件源系统需要启动,因此您可以获得事件溯源的主要优势之一 - 能够使用多语言持久性按需创建投影。

使用命令进行迁移也不是一个好主意,原因很简单,根据定义,命令可能会由于对不变控制进行条件检查前或后检查而失败。它也没有传达迁移的含义,即表示当前的系统状态。请记住,当前的系统停留不是您可以接受或否认的。它被赋予你,你的工作是捕捉它。

此类迁移的最佳做法是发出所谓的迁移事件,例如EntityXMigratedFromLegacy。当然,这项工作可能是实质性的。主要是因为旧系统模型很可能与新模型不匹配,否则这种迁移的原因并不完全清楚。

通过使用迁移事件,您可以显式声明一段状态按原样从另一个位置移动的事实。您将始终知道迁移的实体如何在新系统中开始其生命周期 - 通过从旧系统迁移或在新系统中初始化。

可能我们只需要将其迁移到读取数据库

不,您的读取模型数据库可以随时根据写入端删除和重新创建,只有写入端是您的真实来源。

但我们至少需要在事件存储中创建一些初始记录 每个聚合,如聚合创建?

当然,只有初始事件是不够的。如果当前 OrderAggregate 具有预留,则必须为其具有的每个预留创建 ItemReservedEvent。

或者我们需要编写一个脚本并一一使用所有命令来 以与事件溯源相同的方式重新创建聚合?

感觉这是你应该走的路。从数据库读取旧的聚合/实体,并尝试将其映射到新的聚合/实体。

最新更新