C# 获取NEventStore头版本

C# 获取NEventStore头版本,c#,neventstore,C#,Neventstore,我有一个新的ES流,其中已经有50万个事件(还没有快照…我知道,我正在实现),还有一个简单的客户端,atm只是附加(甚至更多)事件 NEventStore.OpenStream(int.MinValue,int.MaxValue)最初打开流需要很长时间;在此之后,我存储最后一个修订版,从那时起,我只存储NEventStore.OpenStream(lastRevision,int.MaxValue)以再次追加。问题只出现在最初的开始阶段 NEventStore中是否有一种机制,可以在不打开的情况

我有一个新的ES流,其中已经有50万个事件(还没有快照…我知道,我正在实现),还有一个简单的客户端,atm只是附加(甚至更多)事件

NEventStore.OpenStream(int.MinValue,int.MaxValue)
最初打开流需要很长时间;在此之后,我存储最后一个修订版,从那时起,我只存储
NEventStore.OpenStream(lastRevision,int.MaxValue)
以再次追加。问题只出现在最初的开始阶段


NEventStore
中是否有一种机制,可以在不打开的情况下简单地追加,也可以在不打开整个流的情况下确定头部修订,这样我就可以从上一个版本开始打开并追加。当然,我也可以直接访问数据库并进行查询,但这是一种我认为不需要的依赖关系。

您已经提到了一种可能的解决方案:快照

此示例从最新快照打开一个流,并在提交事件后添加一个新快照

// 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获取最新快照是否更有效?我希望有一种简单的方法可以直接从流中获取最新版本。好的,查看GetSnapshot定义,因为它正在检索[int.MaxValue]之前的最后一个快照,我希望它得到优化,因此我添加了代码,以便每10000个版本添加一个快照。将恢复并接受,如果这是工作,没有更多的直接提供…我理解这不是一个完美的解决方案,为您的场景,但我不认为有更好的方式。另外,也没有办法删除旧快照。您还可以创建多个流。为每个提交创建一个新流怎么样?听起来太疯狂了?嘿,太疯狂了。在短期内,我只需要开始捕获这个主要事件,最终我将拥有一个来自流的聚合,并将创建真正的快照,到那时问题将消失。也就是说,string.Empty(null不起作用)快照每10000个给了我一个公平的解决方案,所以我接受这个答案。谢谢。