事件采购定义

时间:2014-05-21 18:10:53

标签: design-patterns event-sourcing

“Event-Sourcing”是实现“命令处理程序模式”的应用程序的一个奇特名称,它保存了成功执行的每个命令(SeatReservedOrderCanceledBlaBlaBlaDone),只是在数据库上插入(没有更新,没有删除,例如:Balance +100Account Closed),所有选择都类似于select top 1 MailAddress from UserAddressTable where UserID=@value order by lastUpdated descselect sum(balance) from UserTransactions where UserId=@value ???

3 个答案:

答案 0 :(得分:4)

你建议的 Command -side的定义基本上是现货。

但是,没有人说你必须将事件存储在关系数据库中。事实上,这往往是一个糟糕的选择。使用简单的银行帐户示例时,您可能事先知道您将需要余额,这意味着您可以在数据库表中保持最新的余额。 / p>

但是,在从正常银行帐户示例中删除的系统中,您可能无法预先确切地知道将如何解释所有事件。

这就是为什么Event Sourcing很有价值。你永远不会丢弃数据,因此,如果将来你意识到你想进行一种你从未预测过的分析,你可以,因为你从未删除任何数据。

当您解释事件流时,您经常会执行这些事件的fold,从而产生汇总结果。有时,出于效率原因,您提前执行此操作,然后通常将其称为快照

与事件采购密切相关的是CQRS的概念。

答案 1 :(得分:0)

事件采购是一回事,CQRS是另一回事。

事件采购,基本上是保留您的模型(Akka演员)在您的系统中执行的所有操作,以便拥有一个无状态模型,可以通过所有的补液来​​及时给出状态那些事件。

(baskedtCreated, productAdded, productAdded, productRemoved,productAdded, baskedPayed)

所以下次如果我想知道我之前篮子的状态是什么,系统会获得一个篮子的新实例,并且可以使用所有之前的事件进行补充,并获得最终状态的篮子。

CQRS 是命令查询责任隔离,它基本上是一种架构模式,用于隔离用于编写的命令中的RestAPI和用于读取的查询,使您有机会单独完全扩展服务器。 / p>

Let´s say 4 machines for Queries(Read always is more expensive), 1 for Commands?

人们对此感到困惑的是,CQRS是一种与事件采购非常相似的模式,因为Command(CreateBasket)能够很好地控制action-event(BasketCreated)

如果有人想在scala中引入事件采购世界,我在这里有一个非常好的开源项目https://github.com/politrons/Scalaydrated

答案 2 :(得分:0)

事件溯源是关于使用过去的事件重建系统状态。

你不持久化命令(当然不禁止这样做,但这与ES无关)。你坚持事件。在您的示例中,SeatReserved、OrderCanceled、BlaBlaBlaDone 是事件。您可以通过读取和应用这些事件来重建“预订系统”的状态,而不仅仅是从数据库中读取当前状态。

我认为这是最基本的定义。事件溯源经常与 CQRS 等其他东西一起被提及,因为将它们结合起来通常很有意义。

如果您想了解事件溯源和 CQRS,我推荐 Greg Young 的 this 文档,他经常被提及是事件溯源一词的创造者。

另外:我建议不要阅读有关该主题的 Matin Fowlers 文章。我不敢说他错了……但这篇文章至少可能令人困惑(尤其是有关外部更新和其他内容的内容)。请注意他开头的免责声明:“我没有时间进一步研究它们”。