2016-07-05 28 views
1

在需要构建新视图的场景中,我们可以重放EventStore中的所有事件。因此,我们会预测新的观点。事件源:避免项目重复事件,同时重播事件并收听新来的事件

因此,这个想法是部署一个新的投影,投影所有旧事件(通过重放),并听取新的传入事件并进行投影。

我认为比赛条件可能发生在阅读旧事件和收听新来的事件。因此,我们可以多次投影同一个事件,然后破坏新视图。

那么,在要重播的事件和新的传入事件之间画一条线是一种好方法?

谢谢!

回答

2

EventStore通过Catch-up Subscriptions

支持这种情况下您会指定流作为起点用户的一开始,就再处理的所有事件,直到“现在”,然后开始听而来事件in。

Connection.SubscribeToStreamFrom(
    StreamName, 
    checkpoint, 
    resolveLinkTos, 
    OnEventReceived, 
    OnLiveProcessingStarted, 
    OnSubscriptionDropped); 

您甚至会在您开始处理实况时收到事件。 :)对于这样的事情

更普遍的建议是:

  1. 使这一进程不可改变的,因此,如果您收到相同的事件两次
  2. 在接收端去复制它并不重要 - 你需要保持它的事件已经处理
0

从Greg Young的通话记录,我可以总结一下EventStore的工作原理类似Atom提要。因此,预测(aka用户)轮询事件是因为跟踪哪个用户保持的id

然后EventStore不知道新投影是否需要重播所有事件。 EventStore,在Greg Young的话,接收

给我'n个事件 'X'

+0

不,你没有正确描述GES后。当他们的客户使用GES进行集成和其他外来原因时,您已经听他的谈话描述了一些边缘用例。虽然是完全有效的用例,但这与事件采购无关。 –

+0

对不起,我没有看到这与原始问题有关。你是正确的,订阅者在流中的位置是订阅者的责任,但你原来的问题是关于提出一个新的订阅者,并避免处理我认为我的答案涉及的重复事件。在这个例子中,X是流的开始(-1?)。也同意alexey,这不是与事件采购 – tomliversidge

+0

@AlexeyZimarev,(@)tomliversidge请检查下面的谈话从41:30 https://www.youtube.com/watch?v=uBzS9JoMJW0也许我不明白但是我认为他解释得很好。否则,请用新的答案澄清。我会感激的。 – martinezdelariva