0

虽然有文章说商业世界不会发生竞争条件,这是我们需要寻找的解决方案,但我不确定情况是否如此。

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

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

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

  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
4

1 回答 1

0

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

项目“CQRS 之旅”是你应该看看的东西:

参考实现将是一个会议管理系统,您可以轻松地在自己的环境中部署和运行该系统。这将使您能够探索和试验按照基于 CQRS 的方法构建的真实应用程序。

特别是看一下SeatsAvailability.MakeReservationSeatsAvailabilityHandler.Handle(MakeSeatReservation command)

于 2014-12-17T21:41:04.737 回答