【发布时间】:2015-09-02 10:12:40
【问题描述】:
我在开发我的域时遇到了一个情况,希望有人可以帮助我解决。
在我当前的项目中,我需要从缓存中读取一种类型的所有存储聚合(比如说 ClientAggregate)。我从服务层读取聚合,然后,对于它们中的每一个,我为当前聚合获取一个锁以进行一些处理,然后将其保存回来。业务逻辑要求只发送一个事件,其中包含有关已修改聚合的信息,因为侦听此事件的系统是遗留系统并且已经定义了模式。
我遇到的问题是,由于这个锁定过程,我发送的事件是从服务层而不是域发送的。该逻辑要求在一个事件中发送所有已修改的聚合信息。因为出于性能原因我需要单独锁定聚合,所以我无法将所有聚合传递给域服务来处理那里的逻辑并生成事件。我的选择是直接从域服务内部锁定,然后我会将基础架构逻辑泄漏到我的域中。
因此,在我当前的解决方案中,该服务包含用于迭代聚合并生成事件的域逻辑。在域服务中执行此操作,逻辑将在域中,但需要移动锁定机制。第三种选择是为每个修改过的聚合发布一个事件,但是应该有一些东西能够消耗它们,以某种方式等待整个过程完成,所以我不知道这是否是一个选项。
【问题讨论】:
-
你真的需要悲观锁吗?无论如何,对于聚合的批处理,也许您应该研究 sagas。
-
存储仅基于缓存。如果我不锁定,则在我尝试读取对象以进行此处理时,另一个线程可能会从对象中删除某些内容。我真的不知道如何使用 sagas 和聚合。我对 sagas 的了解是,您有一个协调员,他向不同的服务发送消息,最后发送提交确认或补偿消息,以防出现错误。您如何在同一个服务中使用它来协调聚合?