使用JOliver EventStore 3.0,并从简单示例开始。
我有一个使用 NServiceBus 的简单 pub/sub CQRS 实现。客户端在总线上发送命令,域服务器接收并处理命令并将事件存储到事件存储,然后由事件存储的调度程序在总线上发布。读取模型服务器然后订阅这些事件以更新读取模型。没有什么花哨的,几乎是按部就班的。
它正在工作,但只是在简单的测试中,当事件存储到 EventStore 时,我在域服务器上(间歇性地)收到很多并发异常。它会正确重试,但有时会达到 5 次重试限制,并且命令最终会出现在错误队列中。
我可以从哪里开始调查以查看导致并发异常的原因?我删除了调度程序,只专注于存储事件,它也有同样的问题。
我正在使用 RavenDB 来持久化我的 EventStore。我没有做任何花哨的事情,只是这样:
using (var stream = eventStore.OpenStream(entityId, 0, int.MaxValue))
{
stream.Add(new EventMessage { Body = myEvent });
stream.CommitChanges(Guid.NewGuid());
}
异常的堆栈跟踪如下所示:
2012-03-17 18:34:01,166 [Worker.14] WARN NServiceBus.Unicast.UnicastBus [(null)] <(null)> - EmployeeCommandHandler 处理消息失败。EventStore.ConcurrencyException:引发了“EventStore.ConcurrencyException”类型的异常。在 c:\Code\public\EventStore\src\proj\EventStore.Core\OptimisticPipelineHook.cs: 第 55 行的 EventStore.OptimisticPipelineHook.PreCommit(提交尝试) 在 c:\Code\ 中的 EventStore.OptimisticEventStore.Commit(提交尝试) public\EventStore\src\proj\EventStore.Core\OptimisticEventStore.cs:第 90 行,位于 c:\Code\public\EventStore\src\proj\EventStore.Core\OptimisticEventStream.cs 中的 EventStore.OptimisticEventStream.PersistChanges(Guid commitId): c:\Code\public\EventStore\src\proj\EventStore 中 EventStore.OptimisticEventStream.CommitChanges(Guid commitId) 的第 168 行。