Architecture 重新生成查询数据库

Architecture 重新生成查询数据库,architecture,cqrs,maintainability,event-sourcing,Architecture,Cqrs,Maintainability,Event Sourcing,我拥有的网站有一个简单的CQRS架构,运行良好。一个事件由多个订阅者发布和拾取,其中一个订阅者[在RavenDb中]保持报告数据库的同步 例如,我的报告数据库已损坏/丢失。通过事件源,我可以重播事件并重建报告数据库,但我[目前]没有使用事件源;我有一个简单的关系存储的nHibernate持久器。解决方案是创建一个“重新生成”类型的脚本,该脚本基本上会基于关系存储发送所有事件(例如PersonCreatedEvent,后跟30xPersonLikedBlogPostEvent等)?它本质上做的事情

我拥有的网站有一个简单的CQRS架构,运行良好。一个事件由多个订阅者发布和拾取,其中一个订阅者[在RavenDb中]保持报告数据库的同步

例如,我的报告数据库已损坏/丢失。通过事件源,我可以重播事件并重建报告数据库,但我[目前]没有使用事件源;我有一个简单的关系存储的nHibernate持久器。解决方案是创建一个“重新生成”类型的脚本,该脚本基本上会基于关系存储发送所有事件(例如PersonCreatedEvent,后跟30xPersonLikedBlogPostEvent等)?它本质上做的事情与事件源做的事情相同,但事件是从关系模型推断出来的


这里有点难解,因为可维护性和灾难恢复显然很重要。

您不需要实施全面的事件源解决方案来实现这一点。如果您只是将所有事件存储在事件日志中,则可以根据需要检索和重播它们。

如果您不存储事件,则无法执行重新生成。如果您使用关系存储只生成“创建”的事件,您将无法从“重新生成”中获得任何好处。

我认为没有简单/快速的解决方案。如果您要将数据从关系型迁移到事件源型,这实际上就是您需要做的。正如您所说的,您唯一能做的就是为每个实体按合理的顺序编写事件脚本(即CreatedEvent,然后是其他状态更改事件)。但是,当您捕获这些事件时,我会存储它们,以便您以后可以重新运行它们。

如果您存储了发送到服务器的所有命令(例如,在日志中),您可以从第一个命令到最后一个命令将所有命令发送到总线,并且您可以复制所有查询端。这就是命令来源。
使用命令寻源,您可以随时轻松地进行事件寻源。

谢谢,我不太在意从对象历史记录的真实表示等进行重新生成的好处,但拥有RavenDb报告数据库对于站点的性能SLA很重要。不过,我将转向活动采购。当做