我有一个预订位置的Django Model类。一旦我们拥有所有辅助数据并准备好付款,我们就会获得实时可用性并分配预订。整个过程的最后一步需要几秒钟(大多等待付款提供商清除)。在理论中,两次付款可以同时进行双重预订。
这些都由单个函数Booking.book()
处理。是否有任何理智的方式我可以限制,以便只有一个实例可以同时工作而其他实例排队?
部署设计最初非常简单,但最终可能会扩展到多个服务器。
正确这样做的方式是什么?它的缺点是什么?
答案 0 :(得分:0)
您可以做的是在付款开始后锁定预订的插槽。这样你只会“失去”一段时间的可用性。锁可以在保存其余信息的同一集中系统上完成。例如,您可以扩展应用程序服务器,但保留一个数据源入口点。 您在付款遭拒或确认后解除锁定。
答案 1 :(得分:0)
您可以像这样在产品中添加一个外键:
class Reservation(models.Model):
reservations = ForeignKey(Book)
quantity = models.IntegerField(default=0)
creation = models.DateTimeField(auto_now_add)
user = ForeignKey(User)
class Book(models.Model):
...
每当有人准备付款时,您都会为每种图书类型添加预订,并按数量减少您的Book.stock(对于此部分,如果您愿意,还可以使用"保留"列,或使用连接计算可用数量,但这最后会非常有效。
如果付款已经过验证,您只需删除预订条目,如果不是,则将您的库存退回。如果预订过期,您可以每隔几分钟获得一次cron,这将获得股票回报(使用创建字段)。