预约调度应用程序中的正确聚合根

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

我正在开发一个应用程序,其中一个模块负责安排约会。我在创建正确的聚合根时遇到一些问题。

企业所有者可以在

DailySchedule
中定义工作时段。客户可以安排预约,并且有两个不变量:

  • 预约必须适合工作时间,
  • 预约不能与其他预约重叠

预定的约会将来也可以取消或推迟。

我的主要问题是确保提到的不变量并同时适合其他 ddd 规则,特别是在单个事务中仅修改单个 AR。

#1 尝试 - 具有子实体的单个聚合根

class DailySchedule {
    private UUID id;
    private LocalDate date;
    private UUID businessId;
    private SortedSet<Interval> workingSlots = new TreeSet<>();
    private SortedSet<Appointment> scheduledAppointments = new TreeSet<>();

    void scheduleAppointment(...) { 
        ...
    }
}

这看起来不错,

DailySchedule
是聚合根,约会是实体。我们在这里具有事务一致性,因为我们可以将 DailySchedules 作为一个整体进行读取或持久化。但由于约会还保存着与日程安排无关的数据,并且预定的约会可以稍后取消,所以在我看来
Appointment
也应该是AR。

#2 尝试 - 两个聚合根

我的第二次尝试是在 DailySchedule 中创建工厂方法来创建约会,而不是将约会存储在 DailySchedule 中,现在我只有工作时间和计划时间。 DailySchedule 和 Appointment 现在都是 AR。

class DailySchedule {
    private UUID id;
    private LocalDate date;
    private UUID businessId;
    private SortedSet<Interval> workingSlots = new TreeSet<>();
    private SortedSet<Interval> scheduledAppointments = new TreeSet<>(); //no references to appointments

    Appointment scheduleAppointment (...) { 
        ... 
    }

在应用层它看起来像这样:

class DailyScheduleService {
    //...
    void scheduleAppointment(CreateAppointmentCommand createCommand) {
        DailySchedule schedule = dailyScheduleRepository.findBy(...);
        Appointment scheduledAppointment = schedule.scheduleAppointment(...);
        appointmentRepository.save(scheduledAppointment);
    }
}

不幸的是,没有事务一致性,因为当同时创建两个约会时,它们会重叠。

我的第三个想法是使用

DailySchedule
Appointment
作为两个 AR,并打破在单个事务中只能修改一个聚合的规则。 它看起来与 #1 场景完全相同,但我将能够在 DailySchedule 上使用乐观锁定并在单个事务中保留新的约会。

您认为以下哪种解决方案最好?也许您可以提出其他解决方案,或者我的汇总从一开始就是错误的? 我也将感谢相关资源的链接。

architecture domain-driven-design aggregateroot
1个回答
0
投票

#3 可能是最好的解决方案。两个聚合根、约会和时段。时段有约会列表。保存约会(在提交之前)的一部分是将其自身注册到槽中。如果由于其他人潜入其中而导致槽注册失败,则回滚(预约)事务并向用户抛出异常,表明给定槽中的调度失败。

这就是避免跨聚合的多个分布式事务等复杂性的方法。然而,这只有效一次。当您添加第二个聚合时,您必须接受两阶段提交、分布式事务或最终一致性。

实际上,重复预订的可能性完全取决于应用程序的并发级别。最终一致性适用于调度应用程序(以人类速度运行)的 99%。对于边缘情况(例如流行的音乐会预订系统),您可能需要一些本质上更具事务性的东西。

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