Design patterns 活动来源和CQR,我错过了什么?
我开始阅读与CQR相结合的事件源模式。 据我所知,CQRS模式是一种将写操作和读操作分开的模式。 事件源是一种模式,其中系统中的所有内容都由触发事件的命令启动。事件源模式需要一个事件总线。 有几件事我没能理解 事件存储包含发生在某个实体上的所有事件。如果我想查询该实体的当前状态,我需要查询该实体发生的所有事件,并重新创建其当前状态。Design patterns 活动来源和CQR,我错过了什么?,design-patterns,cqrs,event-sourcing,Design Patterns,Cqrs,Event Sourcing,我开始阅读与CQR相结合的事件源模式。 据我所知,CQRS模式是一种将写操作和读操作分开的模式。 事件源是一种模式,其中系统中的所有内容都由触发事件的命令启动。事件源模式需要一个事件总线。 有几件事我没能理解 事件存储包含发生在某个实体上的所有事件。如果我想查询该实体的当前状态,我需要查询该实体发生的所有事件,并重新创建其当前状态。 所有事件历史记录都存在于事件存储中。 为什么我不能有一个负责将每个事件保存到事件数据库的微服务(如果我想记录这些事件以便采取进一步的行动,比如Kafka)和一个单独
所有事件历史记录都存在于事件存储中。
为什么我不能有一个负责将每个事件保存到事件数据库的微服务(如果我想记录这些事件以便采取进一步的行动,比如Kafka)和一个单独的微服务来更新常规数据库中实体的更改(例如,在MongoDB中对实体文档的简单更新)。当这些微服务完成其工作时,该事件将从事件存储中删除(假设我使用队列实现该事件存储)。 这样,每当我需要查询实体的当前状态时,我只需查询数据库,而不是查询事件存储并重建当前状态(或基于事件存储重新计算状态并定期缓存结果)。我不明白为什么必须永远存储所有事件,为什么不是可选的 例如,接收事件的Lambda函数生成事件,并将它们存储在每个事件类型的单独SQ中。每个SQS都有自己的lambda函数,负责处理相应的事件类型。事件处理后将被删除。事件源(有或没有CQR)具体指存储实体的状态,通常使用特定于域的事件。当您需要运行需要来自该实体的数据的业务逻辑时,您应该按顺序将事件投影到某个状态并使用该状态 将域事件存储在类似Kafka的东西中是绝对有效的做法,但将实体本身存储在文档或普通表单数据库中(通过投影事件,然后存储该事件或其他任何内容),这不是事件源 我假设你知道活动外包的好处,所以我在这里不赘述,但请随意添加评论,我会详细介绍 为什么不将事件存储在Kafka之类的东西中,并在加载过程中不使用它们呢?如果您没有将快照存储在与事件相同的数据库中,那么您将面临出现并发冲突的真正风险:例如,如果您决定在引发事件时最多使用一次语义,则会引发重复条目、引发冲突事件或丢失事件。这些直接意味着你不能真正依靠你所发出的事件来成为真相的来源 我不明白为什么必须永远存储所有事件,为什么不是可选的 Per(强调矿山) 我们可以查询应用程序的状态以了解世界的当前状态,这回答了许多问题。然而,有时我们不只是想知道我们在哪里,我们还想知道我们是如何到达那里的 这将导致在事件日志之上构建许多设施:
- 完全重建:我们可以完全放弃应用程序状态并重建它
- 时态查询:我们可以在任何时间点确定应用程序状态
- 事件重播:如果过去的事件不正确,我们可以通过反转它来计算后果