维护聚合之间的引用

问题描述 投票:3回答:1

我正在努力解决如何在两个聚合之间维护id引用的问题。当一方发生事件影响关系时,另一方也会以最终一致的方式进行更新。

在节日的背景下,我有以下两个代码,其中一个用于“团队”,一个用于“事件”:

@Aggregate
public class Event {
    @AggregateIdentifier
    private EventId eventId;
    private Set<TeamId> teams; // List of associated teams

... protected constructor, getters/setters and command handlers ...
}
@Aggregate
public class Team {
    @AggregateIdentifier
    private TeamId teamId;
    private EventId eventId; // Owning event

... protected constructor, getters/setters and command handlers ...
}

团队必须始终与事件关联(通过eventId)。一个事件包含相关团队的列表(通过设置的团队ID)。在团队聚合上创建团队(CreateTeamCommand)时,我希望使用新创建的团队的团队ID更新在事件聚合上设置的TeamId。如果在事件聚合上执行了命令“ DeleteEventCommand”,则也应删除与该事件关联的所有团队。如果团队从团队聚合中的一个事件移到另一个事件(MoveTeamToEventCommand),则应更新团队聚合中的eventId,但应从旧的事件聚合中删除TeamId,并将其添加到新的事件聚合中。

[我当前的想法是创建一个传奇,在事件聚合上的eventId和团队聚合上的teamId都运行SagaLifecycle.associateWith,并在“ CreateTeamCommand”上使用@StartSaga(基本上是关系第一次启动)然后为每个影响关系的事件提供一个事件处理程序。这个解决方案的主要问题是:

1:这意味着对于团队和事件的每种可能组合,我都有一个独特的传奇。如果将其缩放到例如,可能会导致性能问题。每100万场比赛有50个团队? (对于这种情况,这是不现实的,但对于维护聚合之间的关系的通用解决方案而言是相关的。)>

2:这将需要我有专用的自定义命令和事件处理程序来处理事件聚合的团队列表中的团队更新,因为不应在传奇中处理生成的事件,以避免无限循环地更新参考。

感谢您阅读这个小故事,我希望有人可以确认我走在正确的轨道上,或指出正确的解决方案。

我正在努力解决如何在两个聚合之间维护id引用的问题。当一方发生影响关系的事件时,另一方也会在...

cqrs event-sourcing axon
1个回答
1
投票

事件包含相关团队的列表(通过设置的团队ID)。

© www.soinside.com 2019 - 2024. All rights reserved.