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

时间:2015-08-07 12:26:24

标签: cqrs event-sourcing

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

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

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

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

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

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

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

    非常感谢。

1 个答案:

答案 0 :(得分:6)

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

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

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