在 EventSourcing 中,关于订阅的公认智慧是什么?

In EventSourcing, what's the accepted wisdom around subscriptions?

如标题所示。目前,我正在为我的活动使用 GetEventStore 后端,而且效果很好。我的困惑是订阅使我的阅读商店保持最新。

目前我正在使用

创建一个追赶订阅
EventStoreConnection.SubscribeToAllFrom(Position.Start, _subscriptionSettings, OnEventMaterialized, OnLiveProcessingStarted, OnSubscriptionDropped);

方法。这很好用,我有办法缓存我所有的特定事件观察者,它们可以很好地构建我的读取模型。

但是,如果我想重放特定聚合的事件怎么办?就目前而言,我需要重新从头开始订阅并让它完成。到目前为止,我这样做的方法是存储每个观察者当前的 Stream Position,将其与订阅进行比较,如果更大,则跳过。

让每个观察者都有自己的订阅是否更好,这样只有一个可以被清除?在那种情况下,您如何知道流 ID,是否需要保留您创建的每个流 ID,以便在以后 re-subscribe?

一些代码示例或一些阅读会很棒。我觉得我错过了 ES 拼图的最后一块

回答您的一般性问题:是的,每个观察员都应该在队列中保持自己的位置。

How do you know the Stream IDs in that case, do you need to persist every single stream id you create in order to re-subscribe at some later date?

您的流名称应该是可重现的。我使用的格式是 "events-{AggregateType}-{AggregateId}"。我为 GES 启用了投影,因此流 "$events-{AggregateType}" 也存在。如果需要,我可以将其用作我的一位观察员的流。

将观察者的配置存储在数据库中可以轻松添加新配置:

Name: All-Projections
StreamName: $events
Position: 1200 <-- This is updated by the observer as it reads
BufferSize: 100 <-- Number of records to read at a time

Name: Customers-Rebuild
StreamName: $events-CustomerAggregate
Position: 0 <-- This consumer has not run yet
BufferSize: 100

然后您可以 运行 您的基本消费者可执行文件并将观察者名称作为参数传递。