【问题标题】:Get NEventStore head revision获取 NEventStore 头部修订
【发布时间】:2015-02-01 15:45:54
【问题描述】:

我有一个新的 ES 流,其中已经有 50 万个事件(还没有快照......我知道,我到了那里)和一个简单的客户端,atm 只附加(甚至更多)事件.

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

NEventStore 中是否有一种机制可以简单地追加而不打开,或者确定头部修订而不打开整个流,这样我就可以从最后一个版本打开并追加。当然,我也可以直接访问数据库并进行查询,但这会产生我觉得我不需要的依赖项。

【问题讨论】:

    标签: c# neventstore


    【解决方案1】:

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

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

    // 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] 之前的最后一个快照.如果这行得通并且没有提供更直接的东西,将恢复并接受......
    • 我知道这不是您的方案的完美解决方案,但我认为没有更好的方法。 AFAIK 也无法删除旧快照。
    • 您还可以创建多个流。为每个提交创建一个新流怎么样?听起来太疯狂了?
    • 嘿,太疯狂了。在短期内,我只需要开始捕获这个主要事件,最终我将获得来自流的聚合,并将创建真正的快照,届时问题将消失。也就是说,每 10000 个 string.Empty (null 不起作用) 快照给了我一个公平的解决方案,所以我会接受作为答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多