2017-08-08 89 views
0

我们即将放弃ES,因为我们需要流程的一致性读取模型,并且在试图弄清楚我们如何节省ES时,我们正在考虑一致的读取方面。基本上,一个命令将由AR运行,生成事件列表。这些事件首先被保存到事件存储器,然后(通过一些额外的编码)专门用于读取模型(以事务处理的方式,即,来自单个命令的所有事件的所有预测都将被包裹在事务中)。只有在此之后才会发布这些活动。所以基本上我的代码将是这样的:事件采购没有最终的一致性?

void ExecuteCommand(Command cmd) { 
    // validate and stuff... 
    var events = GenerateEvents(cmd); 
    PersistAllSync(events); 
    ApplyProjectionsSync(events); 
    PublishAsync(events) 
} 

除了明显的性能问题(一种分布式事务,bascially序列化的所有命令)...为什么没有人做呢?

+0

这可能会在出现错误时变得不一致。例如,说'ApplyProjectionsSync'成功,但是'PublishAsync'失败。这将创建一个读取模型发生更改的情况,但事件不在流中。 –

+0

你应该大概说出这意味着什么; _needing_一致的读取模型实际上很不寻常。当你不这样做时,你需要他们保持一致是相当普遍的。 – VoiceOfUnreason

+0

@Lev你能否满足你为什么需要一致的看法?只有知道为什么我们可以找到采用事件采购的方式...... – Narvalex

回答

0

我不是专家,但我可以尝试回答这个问题。

为了获得事务一致性,我将生成的事件(在相同的聚合/事务范围内)分组,并将它们全部原子地应用于我的读取模型。而且我还发布了分组为事务的事件。它适用于我,所以它当然有可能。

为了避免本地读取模型的最终一致性(以便我可以在命令响应中返回新的一致状态),我也在事务中的本地应用事件。只要你没有太多的读取模型来更新,我想这应该不成问题。如果需要的话,您可以对一些需要非最终更新和更新的读取模型进行设置,并按照“常规”方式进行修改和处理。