我遇到了一个小的架构问题,希望有一个解决方案。
我有一个销售库存有限的产品的网站,一旦客户单击购买按钮,我的服务器就会更新数据库,就好像他购买了什么以及购买了多少的标志,以防他取消。
产品为客户保存75秒。
如果 75 秒计时器过去或他取消/离开网站,我会将购买和数据库恢复到购买前的原始状态。
如果收到付款,我会取消计时器。
机制复杂的原因是购买操作无法立即进行(我使用第三方加密服务接收付款,从在网站上点击购买到实际付款可能需要几秒钟的时间)已制作)
此解决方案适用于只有一台服务器的情况,但 75 秒计时器在服务器上保存为普通变量。也就是说,在有多个服务器的情况下,可以在一个服务器上创建一个计时器,并将实际的购买操作发送到另一台服务器,该服务器将无法取消恢复购买的计时器,或者如果服务器崩溃以及随之而来的所有变数。
还有其他方法可以实现这一点吗?有没有一种工具可以将所有计时器保存在一个永久位置?
这个变量是一个包含所有 setTimeout 计时器的对象:
let timeouts = {}
当用户打算购买时,我更新数据库并执行以下操作:
timeouts = { ...timeouts, [buyerAddress]: setTimeout(() => restoreBuy(buyerAddress), 75000) }
如果我收到付款,我会取消超时:
clearTimeout(timeouts[buyerAddress])
restoreBuy 功能在用户取消或 75 秒后激活。它将用户对象恢复到购买前的状态。