我仍在努力解决与 CQRS 风格架构相关的基本(和已解决)问题:
我们如何实现依赖于一组聚合根的业务规则?
以预订应用程序为例。它可以让您预订音乐会的门票、电影的座位或餐厅的餐桌。在所有情况下,只有有限数量的“物品”可供出售。
让我们假设某个事件或地点非常受欢迎。当新活动或时间段的销售开始时,预订开始很快到达 - 可能每秒很多。
在查询方面,我们可以大规模扩展,并将预订放在队列中,由自治组件异步处理。起初,当我们从队列中拉出保留命令时,我们将接受它们,但在某个时间我们将不得不开始拒绝其余的命令。
我们如何知道何时达到极限?
对于每个预订命令,我们都必须查询某种存储来确定我们是否可以容纳该请求。这意味着我们需要知道当时我们已经收到了多少预订。
但是,如果域存储是非关系数据存储,例如 Windows Azure 表存储,我们就不能很好地做一个SELECT COUNT(*) FROM ...
一种选择是保留一个单独的聚合根,它只跟踪当前计数,如下所示:
- AR:预订(谁?多少?)
- AR:事件/时间段/日期(总计数)
第二个聚合根是第一个聚合根的非规范化聚合,但是当底层数据存储不支持事务时,这些很可能在大容量场景中不同步(这是我们正在尝试的首先是地址)。
一种可能的解决方案是将保留命令的处理序列化,以便一次只处理一个,但这违背了我们的可扩展性(和冗余)目标。
这样的场景让我想起了标准的“缺货”场景,但不同的是我们不能很好地将预订放在延期交货上。一旦一个活动售罄,它就已经售罄,所以我看不出有什么补偿措施。
我们如何处理这样的场景?