代码之家  ›  专栏  ›  技术社区  ›  Noel Widmer

事件存储无法写入软删除流

  •  0
  • Noel Widmer  · 技术社区  · 7 年前

    我尝试软删除包含2个事件的流:

    var slice = con.ReadStreamEventsBackwardAsync(streamName, 0, 1, resolveLinkTos: true).Result;
    es.DeleteStreamAsync(streamName, slice.LastEventNumber, hardDelete: false).Wait();
    

    $metadata 并包含:

    {
      "$tb": 9223372036854775807
    }
    

    $tb Deleting streams and events . 文件上说:

    流式处理当前的最后一个事件编号。

    long.MaxVaue 问题是我不能再写流了。 调用以下截取的事件成功完成,但不会将任何事件附加到流中:

    await es.AppendToStreamAsync(persistenceId, expectedVersion < 0 ? ExpectedVersion.NoStream : expectedVersion, events);
    

    在上面的剪报里, expectedVersion 设置为 -1 . 软删除流的元数据显示:

    Stream is deleted: False
    Meta Stream version: 0
    Truncate before: 9223372036854775807
    Max count:
    Max age:
    

    Last Event number: 1
    Next Event number: -1
    Status: StreamNotFound
    

    是否有人遇到过相同的问题,并且可能找到了一个允许继续向已删除的流附加事件的解决方案?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Noel Widmer    6 年前

    通过我的请求,我收到了一些有价值的信息。 首先,事件存储的行为是正确的 即使它在当前时间点的行为与文档中描述的不一致。

    我们无法写入流的原因是 EventStore将我们的事件识别为重复事件并将其忽略。重复事件是与以前接收到的事件具有相同id的事件 . 事件id由客户端生成,既不是流名称,也不是事件索引。

    确保您的事件ID是唯一的!

    我们的问题是我们的事件ID Guid 从流名称和事件计数确定地生成。事件计数是流中的事件数。软删除流包含0个事件,这些事件导致软删除后的第一个事件的id与删除流前的第一个事件的id相同(删除后的第二个事件与删除前的第二个事件的id相同,依此类推)。

    我们的解决方案是根据 StreamEventSlice.LastEventNumber