EventStore 通过 gRPC 从 $all 读取批量事件

问题描述 投票:0回答:2

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?

grpc event-sourcing eventstoredb event-store
2个回答
2
投票

为了从 $all read,您需要使用有效的提交位置。您不能使用

778
,因为提交位置不是 $all 中事件的序号,它更像是全局日志中的偏移量。虽然很混乱,但事实就是这样。

从 $all 读取并不常见,因为您通常会订阅 $all 以接收附加到数据库的事件。对 $all 的订阅从您提供的开始位置后的下一个事件开始。此外,订阅允许您过滤服务器上的事件,例如系统事件。从 $all 读取时,您将获得系统事件以及实际数据事件。

如果您出于某种原因需要读取 $all,我可以建议如果起始位置不是

Position.Start
,则在迭代异步枚举时故意跳过一个事件。


0
投票

我也推荐 Alexey 的方法,但如果您确实需要从

$all
流中读取内容,您的应用程序可以从其最后一个已知的有效位置(在您的示例中为
777
)开始,然后跳过第一个事件。

© www.soinside.com 2019 - 2024. All rights reserved.