我们正在使用 CQRS + ES。ES 是 NEventStore(以前的 JOliver EventStore)。我们在不同的命令中有 2 个聚合。第二个 AR 的投影取决于读取模型中第一个 AR 投影写入的数据。问题是,当我们运行软件时,一切都进行得如此之快,以至于有时这两个聚合以相同的日期时间(CommitStamp 列)保存在事件存储中。重放事件时,我们从一开始就按 CommitStamp 列排序。但是,如果这两个流具有相同的 CommitStamp 并且顺序错误,则读取模型预测会出现异常。
知道如何解决这个问题吗?
================================
这是在 github https://github.com/NEventStore/NEventStore/issues/170关于这个问题的讨论
================================
编辑:这是我们目前重播事件的方式。我搜索了 GetFrom(...) 的工作原理,结果发现 commitstamp 列不用于排序。毕竟没有提交顺序。因此,如果我开始重播事件,它可能会从今天返回一个事件,下一个是 2 年前记录的事件,下一个等
public void ReplayEvents(Action<List<UncommittedEvent>> whatToDoWithEvents, DateTime loadEventsAfterDate)
{
var eventPortion = store.Advanced.GetFrom(loadEventsAfterDate);
var uncommitedEventStream = new UncommittedEventStream();
foreach (var commit in eventPortion)
{
foreach (var eventMessage in commit.Events.ToList()))
{
uncommitedEventStream.Append(new UncommittedEvent(eventMessage.Body));
}
}
whatToDoWithEvents(uncommitedEventStream.ToList());
}