使用CQRS和EventSourcing时如何确保外部预测同步?

Nat*_*tan 1 cqrs event-sourcing

我正在开始一个新的应用程序,我想使用cqrs和eventsourcing.我想到了重播事件以重新创建聚合和快照,以便在需要时加速,使用内存模型,缓存等.

我的问题是关于我不想在内存中保存的大型读取模型.假设我有一个销售产品的应用程序,我想收听"ProductRegistered""ProductSold"等事件流,并在关系数据库中构建一个表,用于报告或与另一个系统集成.假设有很多记录,这个表可能需要几秒到几分钟来截断/重建,并且应用程序会出于多种目的导出数十个这些预测.

在这种情况下,如何处理预测的一致性?

使用内存数据,重放事件非常简单快捷.但是我觉得保留在磁盘中的外部投影在重建时要慢得多.

  1. 我是否应该始终使用TRUNCATE TABLE + rebuild为每个外部投影启动我的应用程序?这对我来说似乎不切实际,但我可能会担心我还没有遇到的问题.

  2. 由于表本身就像一个快照,我可以保留一个"控制表"来告诉哪个事件是我为该投影处理的最后一个事件,所以我只能重播所需的内容.但是我担心如果应用程序或数据库崩溃会出现不一致.似乎检查表的一致性和重建将是相同的,这再次指向解决方案1.

你会如何以一种可维持的方式处理它?有更好的解决方案吗?

非常感谢你.

Phi*_*ler 6

处理此问题的一种方法是检查点的概念.基本上,您的事件流或整个系统都有一个版本号(检查点),随每个事件递增.

对于每个投影,您将存储应用的最后一个提交的检查点.在启动时,您拉出的事件大于应用于投影的最后一个检查点编号,并从那里继续构建投影.如果需要重建投影,则删除数据和检查点,然后重新运行整个流(或一组流).

注意:最后应用的检查点和投影的读取模型需要在单个事务中保留,以确保它们不会失去同步.