在nosql存储中使用聚合和域事件

在nosql存储中使用聚合和域事件,nosql,domain-driven-design,aggregateroot,aggregates,domain-events,Nosql,Domain Driven Design,Aggregateroot,Aggregates,Domain Events,实际上,我在DDD和NoSql领域徘徊。我现在有一个疑问:我需要从聚合中生成事件,我想使用NoSql存储。但是,如何确保事件保存在存储上,并且聚合根目录上的更改没有事务? 这有意义吗?有没有一种方法可以做到这一点而不必被迫使用事件源或事务数据库? 实际上,我正在考虑实现一个2阶段提交算法,但从性能的角度看,它似乎相当沉重。。。 我是否以错误的方式处理问题? 充满了问题。。。 谢谢你的建议 恩里科 PS 我是stackoverflow的新手,所以有任何建议/批评/。。。非常受欢迎 恩里科 编辑1

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

PS 我是stackoverflow的新手,所以有任何建议/批评/。。。非常受欢迎 恩里科

编辑1

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

使用ES 1场景:我保存数据的差异。然后我生成一个与之关联的事件。2.业务。 使用ES第二个场景:我保存数据的差异。一个过程,观看视频并制作事件。但我只需要一个观察者进程来确保事件的正确顺序。 使用ES 3d场景:幂等事件。事件可以由状态推断,事件的每次重新应用只能对使用者造成一次更改,可以有多个出列进程,不可能发生重复。1操作,但它给消费者带来了很大的限制。 通常:我保存聚合的数据。然后我生成一个与之关联的事件。2.业务。 现在问题变得更广泛了,imho,当域事件是业务流程的基本部分时,是否可以使用域事件和nosql? 我认为这可能是一个更好的选择去。。。即使我需要添加相当多的机器来获得相同的性能

编辑2 为了完整性,在google上搜索域事件nosql幂等元:

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

这应该是顺序:

聚合根收到一个 它触发适当的事件 事件被存储 每个骨料的再水化只能通过在其上执行事件来完成。如果在初始化时度量性能问题,则可以创建聚合的快照,但这不需要两阶段提交,因为可以通过批处理异步构建快照

但是请注意,只有当您的应用程序正在运行并且需要处理和补偿操作时,才需要CQR和/或事件源

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

在我自己的DDD应用程序中,我使用direct events订阅将其与存储库聚合及其持久性解耦。例如,您的存储库可以订阅每个域事件,并执行应用程序所需的操作—持久化到存储、分派到队列等等。。。。但作为一种持久性技术,事件源是可观测对象状态的经典持久性的替代方法。在大多数情况下,你不需要两者兼而有之

编辑2
最后一点注意:如果选择ES,订阅服务器中的一个事件也可以构建关系数据库

是的,我考虑过这一点,因为如果使用ES,我会同时创建事件和状态,因此只有一个事务。但是如果没有ES,我应该首先保存聚合,然后将事件保存到事件队列中。但这样我就必须有一种事务上下文,这在Mongodb中是不可能的。我不能确定聚合修改和事件是否都存储在某个地方,如果该事件有价值,我希望确保该事件已保存。请告诉我我错了!!:你错了。您不需要同时保存事件和对象状态。有关更多详细信息,请参阅我的编辑。因此,如果我想使用单个操作,唯一的方法是ES…:你为什么需要活动?然而,如果您真的需要它们,是的,这应该是您唯一的持久性方法。但是请注意,如果需要,事件的订阅服务器之一可以在数据库上构建读取模型。