现有关系型数据库上的CQRS和事件溯源

3
我们有一个现成的应用程序,它是用c++和关系型数据库编写的。该应用程序需要用c#重写,并且业务要求能够追踪更改历史。CQS似乎适用于读/写操作,但事件溯源似乎几乎不可能实现,因为现有的应用程序仍然需要与新的应用程序一起使用。现有的c++应用程序使用组件(数据视图),直接在数据库中进行写入。
为了升级,我们需要将c++应用程序中所有可编辑表格更改为通过命令调用服务到我们的新应用程序中,这非常昂贵。
我们需要一种架构,在不破坏旧的c++应用程序的情况下从旧的架构演变到新的架构,并且它们需要协同工作。
我们考虑的一个想法是为事件溯源做好准备,但不使用它。然后创建一些跟踪表格,两个应用程序都写入其中。一旦一个模块就绪,我们在新的应用程序中激活该部分并在旧的c++应用程序中停用它。
但实际上,在传输过程中何时将数据存储到现有数据库中才是最佳时机?在CommandHandler中还是在EventHandler中?例如,当用户真正添加时,才逻辑地发送事件UserAdded。我们认为制作临时命令处理程序是最佳选择。
还有其他想法吗?

您是否需要了解遗留的C++应用程序中谁做了什么? - Constantin Galbenu
是的,这是GDPR的要求,但对于遗留系统,他们说他们不那么严格。我们不想冒任何风险,并希望找到适合双方的解决方案。最近的一次会议中出现了一个新想法,即使用事件在SQL Server上进行所有跟踪。问题在于旧的C++应用程序在表中使用SqlUser而不是应用程序中的经过身份验证的用户。 - Emmanuel
您是否有单个数据库?是否使用事务? - Constantin Galbenu
是的,只有一个 MS SQL 数据库。C++ 应用程序有时使用事务。 - Emmanuel
1个回答

2
我认为在SQL数据库中添加触发器并为每个创建/更新/删除生成事件将是有益的。然后,只需使用这些事件来构建新CQRS系统中的读模型。
接下来,您应该考虑要使用哪种数据库,因为您可以使用旧的或新的数据库。对于旧数据库,您应该在sagas中更新它以供新的CQRS应用程序使用。两个应用程序都会从旧数据库中读取。
对于新数据库,您将拥有一个读模型或一些新的数据库,例如Mongo(甚至是SQL-这取决于您的数据大小和结构)。两个应用程序都将从新数据库中读取。是的,您应该更改旧的c ++应用程序中的一些代码。
我们有一个想法,即准备好事件源的所有内容,但不使用它。然后创建一些跟踪表,两个应用程序都会写入其中。一旦准备好一个块,我们就在新应用程序中激活该部分,并在旧的c ++应用程序中停用它。
由于计划迁移到CQRS,我建议您使用第二种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接