EventStore和应用程序生命周期

时间:2012-11-29 12:00:55

标签: design-patterns cqrs event-store

也许这个问题很愚蠢,但我有点困惑。 让我们假设我们想要利用这种模式:

  • 企业应用程序中的事件存储范围究竟是什么?

  • 事件存储是否在多个进程之间共享,或者只是一个进程内概念?

  • 应用程序关闭时,事件会发生什么?它们是绑定到应用程序“实例”还是应用程序?

  • 事件存储与MessageBus与发布者/订阅者之间有什么区别(我们可以存储消息历史记录的一部分?

  • 谁负责信息幂等?

  • 这句话实际意味着什么:“有趣的是,即使没有跨越所涉及的各种资源的分布式事务,例如消息队列和持久存储,EventStore也能够确保完全的事务性体验。这是通过将分布式事务拆分为较小的部分并单独执行每个部分来实现的“from this project)我无法理解如何以几个小块来破坏事务,即使所有事务都是事务性的 - se可以替换分布式事务。

2 个答案:

答案 0 :(得分:7)

  

企业应用程序中的事件存储范围究竟是什么?

事件存储就像这个意义上的数据库一样。它不受任何给定应用程序的限制。然而,它可以通过业务/语言边界来确定范围。例如,如果将系统划分为子系统,则每个子系统都可以拥有自己的事件存储实例。

  

事件存储是否在多个进程之间共享,或者只是一个   进程中的概念?

这不是一个过程中的概念。它就像数据库一样在进程/应用程序之间共享。

  

应用程序关闭时,事件会发生什么?他们受到约束吗?   应用程序“实例”或应用程序?

事件存储将存储应用程序要求存储的所有事件。事件由流ID键入,流ID通常是aggregate root的ID。这不受特定应用程序实例的约束。

  

事件存储和MessageBus之间有什么区别   与发布者/订阅者(我们可以存储消息的一部分)   历史?

存储消息历史记录基本上是功能方面的核心差异。用例的不同之处在于消息总线用于在端点之间传递消息,其中事件存储用于保留消息(通常是事件)。

  

谁对信息幂等负责?

您是开发人员。事件存储将事件视为由流键控的序列化数据,可能还有版本控制。通过版本控制,它可以处理某些冲突,但您需要确定消息是否是幂等的。

  

我无法理解如何在几件小件中打破交易,   即使所有事务本身都可以替换分布式   事务。

看看Clarifying the Saga pattern。基本思想是,不是在单个分布式事务下对多个操作进行分组,而是将操作分解为多个部分。如果某个部分失败(这将导致分布式tx中的回滚),则会发送错误消息,这可能允许感兴趣的各方进行回滚操作。这可以看作是一种补偿形式,它是分析许多业务场景的更自然的方式。例如,当支付交易被视为无效时,不会删除支付交易,而是添加补偿交易。这种表示活动的方式与现实更加一致,因为实际上很少有“未完成”的东西。

答案 1 :(得分:6)

有多少问题!

  

企业应用程序中的事件存储范围究竟是什么?

事件存储不是一种模式,它是一种通常与两种不同(但强烈相关)模式一起使用的技术:Event SourcingCommand and Query Responsibility Segregation。作为“存储”,它只是一种保持与业务相关的应用程序状态的方法。

这两种模式通常与domain model一起使用,因为它们与Domain Driven Design中Evans引入的模式配合得很好。

EventStore允许您持久保存域事件(事件源方式)或应用程序事件(也称为CQRS中的命令)。它与文档和关系存储不同,因为您不保存模型的状态,而是保存导致它的事件。 但是,您可以使用RDBMS或文档数据库来存储事件。

然后,要检索实体,您可以简单地按顺序播放注册的每个事件/命令。快照可用于加快此过程。

  

事件存储是否在多个进程之间共享,或者只是一个进程内概念?

这取决于商店实施,但没有理由阻止它在多个流程和/或应用程序中使用。

  

应用程序关闭时,事件会发生什么?它们是绑定到应用程序“实例”还是应用程序?

这又取决于商店的实施。最简单的事件存储将事件保存到编号文件中,因此当应用程序关闭时,事件仍然存在 (这总是让我想起汤普森的话:“我们有持久的对象,我们称之为文件”) 但是,如果您的应用程序真的需要它,那么没有什么能阻止您在内存中使用易失事件存储。我会将它实现为仅附加收集,保持录入顺序。

  

事件存储与MessageBus与发布者/订阅者之间有什么区别(我们可以存储消息历史记录的一部分?

消息总线是一种传递消息的工具。事件(和命令)是消息,因此您可以使用它来传递它们。相反,事件存储是一种持久性工具。

  

谁对信息幂等负责?

在大多数常见场景中,设计域模型的人。在非DDD系统中,它是设计消息(事件或命令)的人。实际上,信息的接收者必须保证幂等性,而不是技术本身。

鉴于此,EventStore可以在检测到重复消息时合并它们。但这本身并不能使模型具有幂等性。

  

这句话实际意味着什么:“有趣的是,即使没有跨越所涉及的各种资源的分布式事务,例如消息队列和持久存储,EventStore也能够确保完全的事务性体验。通过将分布式事务分解为更小的部分并单独执行每个部分“(从这个项目)我无法理解如何以几个小块来破坏事务,即使所有事务本身都可以替换分布式事务。” p>

这取决于作者赋予“完全交易经验”的含义。 对我来说,这句话看起来不对,因为它会破坏Brewer's theorem

您可以从Microsoft和Greg Young找到有用的CQRS Journey

明天见,在办公室: - )