12

我研究了一些 CQRS 示例实现(Java / .Net),它们使用事件源作为事件存储,使用简单的(否)SQL 存储作为“报告存储”。

看起来一切都很好,但我似乎在所有示例实现中都遗漏了一些东西。

在应用程序投入生产后,如何处理添加新的报表存储/屏幕?以及如何将现有(最新)数据从事件存储导入到新的报表存储?

IE:

想象一个基本的 DDD/CQRS 驱动的 CRM 应用程序。每个屏幕(实际上是视图)都有自己的结构化报告存储(一个 SQL 表)。所有这些视图都使用监听域事件(CustomerCreated / CustomerHasMoved 等)的处理程序进行更新。

CRM 的一项功能是它可以记录电话呼叫(PhoneCallLogged 事件)。由于时间限制,我们仅在 CRM 的 V1 中实现了电话记录(查看和报告谁处理了哪个电话将在 V2 中实现)

在生产运行一段时间后,我们希望对每个客户和销售代表的通话记录进行“报告”。

所以我们需要添加一些屏幕(视图)和支持的报告表(在报告存储中),并用事件存储中已经收集的数据填充它......

这就是我在查看我研究的样本时遇到的问题。他们不处理将现有(历史)数据从事件存储导入(新)报告存储。

EventRepository (DomainRepository) 的所有示例只有一个方法“GetById”和“Add”,它们不支持一次获取所有聚合根以填充新报告表。

如果没有此初始数据导入,新屏幕只会针对新发生的事件进行更新。不适用于已记录的电话(因为 PhoneCallLogged 事件没有报告侦听器)

有什么建议,推荐吗?

提前致谢,

雷姆科

4

3 回答 3

8

您在现有事件日志上重新运行处理程序(例如,您通过新事件处理程序播放旧事件)

考虑你的例子......你的事件日志中有大量的 PhoneCallLoggedEvents。带上您的新手柄并通过它播放所有旧事件。然后就像它一直在运行一样,它将继续处理任何到达的新事件。

干杯,

格雷格

于 2010-04-14T13:56:01.933 回答
2

例如在 Axon Framework 中,这可以通过以下方式完成:

JdbcEventStore eventStore = ...;

ReplayingCluster replayingCluster = new ReplayingCluster(
            new SimpleCluster("replaying"),
            eventStore,
            new NoTransactionManager(),
            0,
            new BackloggingIncomingMessageHandler());

replayingCluster.startReplay();

事件回放是一个没有完全记录并且缺乏成熟工具的领域,但这里有一些起点:

于 2016-01-23T18:07:06.197 回答
1

'EventRepository' 仅包含这些方法,因为您只在生产中需要它们。

在为报告添加新的非规范化时,您可以将所有事件从开始发送到您的处理程序。

您可以通过以下方式在您的开发站点上执行此操作:

  • 将您的事件日志加载到开发站点
  • 将所有事件发送到您的非规范化处理程序
  • 将您的新视图 + 处理程序移动到您的生产站点
  • 运行中间发生的事件
  • 现在你准备好了
于 2010-04-14T14:05:59.240 回答