1

是的,之前至少有人问过类似的问题。因此我知道答案:您只需在新处理程序上重播事件,很简单。但是尝试实际实施会引发一些问题。

我正在使用 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 秒丢失?请告诉我如何在 100%(不是 99%)确保新应用程序视图在启动时完全同步的同时从 EventStore 中获取事件。

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

4

1 回答 1

1
  1. 将幂等性添加到组合中。Jonathan 在他关于 EventStore 项目 (v2) 的博客文章中谈到了这一点。至少一次消息传递与幂等性相结合将确保您不会两次处理相同的消息。因此,休息几分钟(甚至半小时)并不重要。您还需要将这种幂等行为集成到您的 NSB 处理程序中(例如,作为第一个处理程序)。
  2. 如果您的处理程序有副作用(这似乎很奇怪,因为我的印象是您正在重播以获取新的报告/视图),那么使用当前时间和事件时间来决定是否应该为来自过去的。或者,您可以使用不执行任何操作的 NullEmailSender:IEmailSender 组合您的处理程序(使用 IoC)(因为您知道您所在的路径是重播过去的路径之一)。
于 2011-08-21T12:41:20.213 回答