1

我实际上在 DDD 和 NoSql 领域徘徊。我现在有一个疑问:我需要从聚合中生成事件,并且我想使用 NoSql 存储。但是我如何确保事件保存在存储中并且聚合根上的更改没有事务?这有意义吗?有没有办法在不被迫使用事件源或事务数据库的情况下做到这一点?实际上我正在考虑实现一个两阶段提交算法,但从性能的角度来看它似乎很重......我是否以错误的方式解决问题?充满了问题......感谢恩里科的每一个建议

PS我是stackoverflow的新手,所以任何建议/批评/......都非常欢迎Enrico

编辑 1

那么我需要事件来通知聚合发生了一些事情,我他们应该对变化做出反应。当此类事件对业务逻辑很重要时,就会出现问题。据我了解,经过一夜的思考,我不能使用nosql存储来做这样的事情。让我解释一下(大声思考:P):

  • 使用 ES(第一景):我保存数据的“差异”。然后我产生一个与之相关的事件。2 操作。
  • 使用 ES(第二景):我保存数据的“差异”。一个进程,观察 ES 并产生事件。但我只拥有一个观察者进程来确保事件的正确顺序。
  • 使用 ES(3d 场景):幂等事件。事件可以由状态推断,并且事件的每次重新应用只能导致消费者发生一次更改,可以有多个“出队”过程,不可能发生重复。1的操作,但它给消费者带来了很大的限制。
  • 一般来说:我保存聚合的数据。然后我产生一个与之相关的事件。2 操作。

现在问题变得更广泛了恕我直言,当域事件是业务流程的基本部分时,是否可以使用域事件和 nosql?我认为这可能是一个更好的选择关系......即使我需要添加相当多的机器来获得相同的性能。

编辑2 为了完整起见,在google上搜索“域事件nosql幂等”:http: //svendvanderveken.wordpress.com/2011/08/26/transactional-event-based-nosql-storage/

4

1 回答 1

0

如果您需要事件溯源,您应该只存储事件

这应该是顺序:

  1. 聚合根接收命令
  2. 它触发适当的事件
  3. 事件被存储

每个聚合的再水合只能通过对其执行事件来完成。如果您在初始化时测量性能问题,您可以创建聚合的快照,但这不需要两阶段提交,因为您可以通过批处理异步构建快照。

但是请注意,仅当您的应用程序高度并发并且您需要处理分区容差和补偿操作时,您才需要 CQRS 和/或事件溯源。

编辑
事件溯源是对象状态持久性的替代方案。您可以存储事件或对象模型的状态。您可以保存快照,但它们只是性能工具:您的应用程序必须能够在没有它们的情况下工作。您可以将此类快照视为一种缓存技术。作为替代方案,您可以保留对象状态(经典模型),但在这种情况下,您不需要存储事件。

在我自己的 DDD 应用程序中,我使用可观察实体来解耦(通过直接事件从存储库订阅)聚合及其持久性。例如,您的存储库可以订阅每个域事件,并执行应用程序所需的操作(持久存储到存储区,分派到队列等等......)。但是作为一种持久性技术,事件溯源是可观察对象状态的经典持久性的替代方案。在大多数情况下,您不需要两者。

编辑 2 最后一点:如果您选择 ES,其中一个事件订阅者也可以构建关系读取模型

于 2013-04-02T08:52:07.747 回答