虽然有articles说商业世界不会出现竞争条件,而且我们需要查看的解决方案,我不确定是不是这样。
我需要容量并做活动票务。当对事件的需求很高时,有许多并发预订命令在同一微秒内。传统的方法是使用锁定来防止RACE条件。否则它最终会出售无法获得的座位的门票,这是一项严格的商业禁忌。
下表显示了同时发生的步骤顺序。
1 | 100 | 99 | 1 |seat available?| -
2 | | | | apply | seat available ?
3 | | | | event handle | apply
4 | | 100 | 0 | update state | event handle
5 | | 101 | -1 | | update state
答案 0 :(得分:0)
如果“出售不可用座位的门票是严格禁止的业务。”然后以这种方式进行建模。此要求告诉您的是“出售/预订座位”和“可用座位数”应该在同一笔交易中结束并保持一致。您无法预约并触发事件以更改可用座位数,它必须在单笔交易中。这样,当您尝试减少“可用座位数”(表中的时间5)时,您将收到乐观并发异常,因为有人在此期间对其进行了修改。然后您可以尝试再次处理它,这次可用座位数已经用尽,因此您可以发布“申请/预订被拒绝”事件并通知用户。
Project "a CQRS Journey"是你应该看看的东西:
参考实施将是会议管理系统 您将能够轻松地部署和运行自己的 环境。这将使您能够探索和试验 基于CQRS的方法构建的现实应用程序。
特别要查看SeatsAvailability.MakeReservation和SeatsAvailabilityHandler.Handle(MakeSeatReservation command)