CQRS和Race:如何处理比赛要求

时间:2014-12-17 06:50:20

标签: nservicebus cqrs axon

虽然有articles说商业世界不会出现竞争条件,而且我们需要查看的解决方案,我不确定是不是这样。

我需要容量并做活动票务。当对事件的需求很高时,有许多并发预订命令在同一微秒内。传统的方法是使用锁定来防止RACE条件。否则它最终会出售无法获得的座位的门票,这是一项严格的商业禁忌。

下表显示了同时发生的步骤顺序。

时间|总容量|消费|可用|客户1 |的customer2

  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

1 个答案:

答案 0 :(得分:0)

如果“出售不可用座位的门票是严格禁止的业务。”然后以这种方式进行建模。此要求告诉您的是“出售/预订座位”和“可用座位数”应该在同一笔交易中结束并保持一致。您无法预约并触发事件以更改可用座位数,它必须在单笔交易中。这样,当您尝试减少“可用座位数”(表中的时间5)时,您将收到乐观并发异常,因为有人在此期间对其进行了修改。然后您可以尝试再次处理它,这次可用座位数已经用尽,因此您可以发布“申请/预订被拒绝”事件并通知用户。

Project "a CQRS Journey"是你应该看看的东西:

  

参考实施将是会议管理系统   您将能够轻松地部署和运行自己的   环境。这将使您能够探索和试验   基于CQRS的方法构建的现实应用程序。

特别要查看SeatsAvailability.MakeReservationSeatsAvailabilityHandler.Handle(MakeSeatReservation command)