express / node.js中的请求之间的同步问题

我在node.js中想到了一个奇怪的同步问题,我没有find一个优雅的解决scheme:

我设置了一个express / node.js Web应用程序,用于从一行数据库表中检索统计数据。

  • 如果表格为空,则填充长计算任务
  • 如果表中的logging大于15分钟,则通过长计算任务进行更新
  • 否则,用显示DB中的logging的网页进行响应。

问题是,当多个用户同时发出请求时,如果logging是旧的,那么每个请求执行一次长计算任务,而不是一次。

有什么优雅的方式,只有一个请求触发计算任务,所有其他人等待更新的数据库logging?

是的,它被称为

把一个额外的列在你的表中说 ,这将是时间戳types。 一旦一个进程开始使用该logging,将now+timeout时间放入其中(按照经验法则,我select超时为平均处理时间的两倍)。 当进程停止处理时,用NULL值更新该列。

在处理开始时检查该列。 如果value > now条件满足,那么返回一些状态码给客户端(不要强制客户端等待,这是一个糟糕的用户体验,他不知道发生了什么,除非处理时间很短)像409 Conflict 。 否则,开始处理(也理想情况下,处理发生在一个单独的线程/进程,以便用户不必等待:用一个适当的状态代码,如202 Accepted回应)。

如果处理进程崩溃(这样我们避免了死锁),这个now+timeout值是需要的。 还要记住,由于竞争条件,你必须“检查和设置”这个列在交易中(如果你使用类似MongoDB的数据库,可能会相当困难)。