“Event-Sourcing”是实现“命令处理程序模式”的应用程序的一个奇特名称,它保存了成功执行的每个命令(SeatReserved
,OrderCanceled
,BlaBlaBlaDone
),只是在数据库上插入(没有更新,没有删除,例如:Balance +100
,Account Closed
),所有选择都类似于select top 1 MailAddress from UserAddressTable where UserID=@value order by lastUpdated desc
或select sum(balance) from UserTransactions where UserId=@value
???
答案 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 文章。我不敢说他错了……但这篇文章至少可能令人困惑(尤其是有关外部更新和其他内容的内容)。请注意他开头的免责声明:“我没有时间进一步研究它们”。