【发布时间】:2020-05-09 14:50:31
【问题描述】:
我正在努力思考如何维护两个聚合之间的 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 集)。 在 Team 聚合上创建团队 (CreateTeamCommand) 时,我希望使用新创建的团队的团队 ID 更新 Event 聚合上设置的 TeamId。 如果执行事件聚合上的命令“DeleteEventCommand”,则与该事件关联的所有团队也应被删除。 如果团队从一个事件转移到团队聚合上的另一个事件 (MoveTeamToEventCommand),则应更新团队聚合上的 eventId,但应从旧 Event 聚合中删除 TeamId,并将其添加到新 Event 聚合中。
我目前的想法是创建一个传奇,我将在 Event 聚合上的 eventId 和 Team 聚合上的 teamId 运行 SagaLifecycle.associateWith,并在“CreateTeamCommand”上使用 @StartSaga(基本上是关系第一次开始) 然后为影响关系的每个事件都有一个事件处理程序。我对这个解决方案的主要问题是:
1:这意味着对于团队和赛事的每种可能组合,我都会有一个独特的传奇。如果将其缩放到例如,这是否会导致性能问题。 100 万场赛事,每场赛事有 50 支球队? (这对于这种情况是不现实的,但与维护聚合之间关系的一般解决方案相关)。
2:这将需要我有自定义命令和事件处理程序专门用于处理事件聚合的团队列表中的团队更新,因为不应在 saga 中处理结果事件以避免更新引用的无限循环。
感谢您阅读这个小故事,我希望有人可以确认我在正确的轨道上,或者为我指明正确解决方案的方向。
【问题讨论】:
标签: cqrs event-sourcing axon