在
C#
上编写了一个应用程序,正在尝试使用 EventStore.Client.Grpc.Streams
版本 23.1.0 来访问 EventStore
。
var positionToRead = startFromPosition == 0 ? Position.Start : new Position(startFromPosition, startFromPosition);
var readStreamAsync = _client.ReadAllAsync(Direction.Forwards, positionToRead, take);
当收到最后一个事件时,应用程序知道其位置。让我们假设它是 777。 该应用程序重新启动后,当它重新启动时,另一个事件被写入
EventStore
,让我们想象一下它的位置1111。
如何继续阅读新的(1111)活动?
如果你尝试在
ReadAllAsync
期间使用位置778(期望它表明你的目标是读取777之后的事件)-应用程序会抛出异常,我猜这是因为下一个事件位置是1111,你需要知道精确的位置1111 .
如何从$all中读取事件A,在某个事件B之后,如果你不知道A的位置,但你知道位置B高于位置A?
为了从 $all read,您需要使用有效的提交位置。您不能使用
778
,因为提交位置不是 $all 中事件的序号,它更像是全局日志中的偏移量。虽然很混乱,但事实就是这样。
从 $all 读取并不常见,因为您通常会订阅 $all 以接收附加到数据库的事件。对 $all 的订阅从您提供的开始位置后的下一个事件开始。此外,订阅允许您过滤服务器上的事件,例如系统事件。从 $all 读取时,您将获得系统事件以及实际数据事件。
如果您出于某种原因需要读取 $all,我可以建议如果起始位置不是
Position.Start
,则在迭代异步枚举时故意跳过一个事件。
我也推荐 Alexey 的方法,但如果您确实需要从
$all
流中读取内容,您的应用程序可以从其最后一个已知的有效位置(在您的示例中为 777
)开始,然后跳过第一个事件。