Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
express/node.js中请求之间的同步问题_Node.js_Express_Concurrency_Synchronization - Fatal编程技术网

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

express/node.js中请求之间的同步问题,node.js,express,concurrency,synchronization,Node.js,Express,Concurrency,Synchronization,我在node.js中提出了一个奇特的同步问题,我还没有找到一个优雅的解决方案: 我设置了一个express/node.js web应用程序,用于从一行数据库表中检索统计数据 如果该表为空,则通过长计算任务填充该表 如果表中的记录从现在起超过15分钟,请通过长时间的计算任务进行更新 否则,用一个以DB为单位显示记录的网页进行响应 问题是,, 当多个用户同时发出请求时,如果记录是旧的,则长计算任务将对每个请求执行一次,而不是仅执行一次 是否有一种优雅的方式,只有一个请求触发计算任务,而所有其他请

我在node.js中提出了一个奇特的同步问题,我还没有找到一个优雅的解决方案:

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

  • 如果该表为空,则通过长计算任务填充该表
  • 如果表中的记录从现在起超过15分钟,请通过长时间的计算任务进行更新
  • 否则,用一个以DB为单位显示记录的网页进行响应
问题是,, 当多个用户同时发出请求时,如果记录是旧的,则长计算任务将对每个请求执行一次,而不是仅执行一次

是否有一种优雅的方式,只有一个请求触发计算任务,而所有其他请求都等待更新的DB记录?

是的,它被称为锁

在表中添加一列,例如lock,它将是timestamp类型。一旦进程开始处理该记录,将
now+timeout
时间放入其中(根据经验法则,我选择timeout为平均处理时间的2倍)。当进程停止处理时,使用NULL值更新该列

在开始处理时,检查该列。如果
value>now
条件满足,则向客户端返回一些状态代码(不要强迫客户端等待,这是一种糟糕的用户体验,除非处理时间很短,否则他不知道发生了什么),如
409冲突
。否则,启动处理(理想情况下,处理在单独的线程/进程中进行,这样用户就不必等待:使用适当的状态代码(如
202 Accepted
)进行响应)


这个
now+timeout
值是需要的,以防处理过程崩溃(因此我们避免死锁)。还请记住,由于竞争条件,您必须在事务中“检查并设置”此锁列(如果您使用的是类似MongoDB的数据库,可能会非常困难)。

是否有任何方法可以摆脱DB table r/w访问锁?