Nservicebus CQR和种族:如何处理种族要求

Nservicebus CQR和种族:如何处理种族要求,nservicebus,cqrs,axon,Nservicebus,Cqrs,Axon,虽然有人说商业世界中不存在种族歧视,我们需要寻找的是解决方案,但我不确定情况是否如此 我有一个容量和做活动票务的需要。当对活动的需求很高时,会有许多并发预订命令在同一微秒内发出。实现这一点的传统方法是使用锁定来防止竞争条件。否则,它最终会为无法获得的座位卖票,这是严格的商业禁忌 下表显示了同时发生的步骤顺序 时间|总容量|消耗|可用|客户1 |客户2 如果为没有座位的座位卖票是一个严格的商业禁忌,那么就这样做吧。该要求告诉您的是,销售/预订座位和可用座位数量应在同一笔交易中结束,并保持一致。您不

虽然有人说商业世界中不存在种族歧视,我们需要寻找的是解决方案,但我不确定情况是否如此

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

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

时间|总容量|消耗|可用|客户1 |客户2 如果为没有座位的座位卖票是一个严格的商业禁忌,那么就这样做吧。该要求告诉您的是,销售/预订座位和可用座位数量应在同一笔交易中结束,并保持一致。您不能通过预订和启动活动来更改可用座位的数量,它必须是单笔交易。这样,当您试图减少表中的可用座位数时,您将收到乐观并发异常,因为在此期间有人对其进行了修改。然后,您可以再次尝试处理该事件,此时可用座位数已用完,因此您可以发布应用程序/预订拒绝事件并通知用户

是你应该看看的东西:

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


特别是看一下,这里有问题吗?base.updateservation。这是设置交易边界的地方吗?这些事务边界是使用服务器代码中的信号量还是db行级锁实现的?无论哪种方式,我们都需要锁,不是吗?您必须对数据库进行ACID事务处理,但不必锁定它,您可以利用-如果您试图将某些内容保存到数据库中,而该数据库在此期间已被修改,您将得到一个异常。
  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