获取NEventStore的最新版本

5
我有一个新的ES流,其中已经有了50万个事件(尚未进行快照...我知道,我会去做的),还有一个简单的客户端,目前只能添加(更多)事件。 NEventStore.OpenStream(int.MinValue, int.MaxValue) 首次打开流需要很长时间; 之后我会存储最后的修订版本,并且只需要 NEventStore.OpenStream(lastRevision, int.MaxValue) 来进行添加。问题只出现在初始启动时。
是否有 NEventStore 的机制可以简单地追加而不必打开,或者确定头修订版本而不必打开整个流,以便我可以从最后一个版本打开并追加。当然,我也可以直接转到数据库并查询,但我觉得我不应该需要这样一个依赖。
1个回答

4

你已经提到了一个可能的解决方案:快照。

这个例子打开了最新快照的流,并在事件提交后添加了一个新的快照。

// Get the latest snapshot
var latestSnapshot = _eventStore.Advanced.GetSnapshot(streamId, int.MaxValue);            

// Open the stream from the snapshot if there is one, otherwise open the stream as normal
using (var stream = latestSnapshot == null ? 
    _eventStore.OpenStream(streamId) : 
    _eventStore.OpenStream(latestSnapshot, int.MaxValue))
{
    // Add events and commit
    stream.Add(new EventMessage());
    stream.CommitChanges(Guid.NewGuid());

    // Add a new snapshot (with no payload)
    _eventStore.Advanced.AddSnapshot(
        new Snapshot(streamId, stream.StreamRevision, string.Empty));
}      

可能并不需要这么频繁地添加新快照。这只是一个示例,展示了快照的工作原理。


谢谢,我知道在流的末尾创建快照可以让我从快照向前加载,但如果有很多快照,使用GetSnapshot获取最新的快照是否更有效率?我希望能够直接从流中获取最新版本的简便方法。 - 9swampy
好的,看一下GetSnapshot的定义,它在检索[int.MaxValue]之前的最后一个快照,我期望它已经被优化了,所以我已经添加了代码来每10000个修订版本添加一个快照。如果这样行得通并且没有更直接的方法提供,我会回退并接受这种方案... - 9swampy
1
我知道这不是你情况下的完美解决方案,但我认为没有更好的方法了。据我所知,也没有删除旧快照的方法。 - dillenmeister
您也可以创建多个流。每次提交时创建一个新的流怎么样?听起来太疯狂了吗? - dillenmeister
呵呵,太疯狂了。短期内,我只需要开始捕获这个主要事件,最终我将从流中获取聚合,并创建真正的快照,到那时问题就会消失。话虽如此,每10000个空字符串(null不起作用)的快照给了我一个不错的解决方案,所以我会接受它作为答案。谢谢。 - 9swampy
好的,太棒了!我更新了答案,使用了string.Empty而不是null。 - dillenmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接