如何使用EventStore在praxis中构建新的应用程序视图?

时间:2011-08-17 13:35:49

标签: cqrs event-sourcing event-store

是的,之前至少有几次问过类似的事情。因此,我知道答案:您只需重放新处理程序上的事件,简单。但是,实际执行会引发一些问题。

我正在使用JOlivier的EventStore,这看起来不错。对于初学者,我会忽略SnapShots的概念,只是看一下让我的事件出来的方法。我能做的就是这段代码:

var commitList = Store.GetFrom(DateTime.UtcNow.AddSeconds(-1));
foreach (var commit in commitList)
{
    foreach (var comittedEvent in commit.Events)
    {
        if (comittedEvent.Body is SomeDomainEvent)
            Console.WriteLine(string.Format("Found interesting event: {0}", ((SomeDomainEvent)comittedEvent.Body).Value));
    }
}

这里的第一个问题当然是:这是做到这一点的方法吗?我在使用“GetFrom”参数时遇到了麻烦,因为它只是一个DateTime,我无法确定所有服务器是否在时间上同步。如果一台服务器上的时钟落后于另一台服务器1分钟怎么办?还是½小时?我也在使用NServiceBus,所以新的处理程序队列会在某个时间点堆积事件 - 但我怎么能100%确定这里没有10秒丢失?请告诉我如何从EventStore中获取事件,同时100%(不是99%)确保新应用程序视图在启动时完全同步。

另外:您是否在代码中创建了一种特殊的导入方法?我的意思是,假设我的新应用程序中的处理程序在处理“SomeDomainEvent”时发送了一封电子邮件。我不希望它发送所有10.000个旧活动的电子邮件。你如何在praxis / code中执行“import”?

感谢。

1 个答案:

答案 0 :(得分:1)

  1. 为混合添加幂等性。 Jonathan在他关于EventStore项目(v2)的博客文章中谈到了这一点。至少一旦消息传递与幂等性相结合,将确保您不会两次处理相同的消息。因此,关闭几分钟(甚至半小时)并不重要。您还需要在NSB处理程序中集成此幂等性行为(例如,作为第一个处理程序)。
  2. 如果您的处理程序有副作用(这看起来很奇怪,因为我正在重播以获得新的报告/视图),那么使用当前时间和事件时间来决定是否应该发送电子邮件是没有害处的过去的东西。或者,您可以使用NullEmailSender编写处理程序(使用IoC):不执行任何操作的IEmailSender(因为您知道您所使用的路径是重放过去的路径)。