express/node.js中请求之间的同步问题
我在node.js中提出了一个奇特的同步问题,我还没有找到一个优雅的解决方案: 我设置了一个express/node.js web应用程序,用于从一行数据库表中检索统计数据express/node.js中请求之间的同步问题,node.js,express,concurrency,synchronization,Node.js,Express,Concurrency,Synchronization,我在node.js中提出了一个奇特的同步问题,我还没有找到一个优雅的解决方案: 我设置了一个express/node.js web应用程序,用于从一行数据库表中检索统计数据 如果该表为空,则通过长计算任务填充该表 如果表中的记录从现在起超过15分钟,请通过长时间的计算任务进行更新 否则,用一个以DB为单位显示记录的网页进行响应 问题是,, 当多个用户同时发出请求时,如果记录是旧的,则长计算任务将对每个请求执行一次,而不是仅执行一次 是否有一种优雅的方式,只有一个请求触发计算任务,而所有其他请
- 如果该表为空,则通过长计算任务填充该表
- 如果表中的记录从现在起超过15分钟,请通过长时间的计算任务进行更新
- 否则,用一个以DB为单位显示记录的网页进行响应
now+timeout
时间放入其中(根据经验法则,我选择timeout为平均处理时间的2倍)。当进程停止处理时,使用NULL值更新该列
在开始处理时,检查该列。如果value>now
条件满足,则向客户端返回一些状态代码(不要强迫客户端等待,这是一种糟糕的用户体验,除非处理时间很短,否则他不知道发生了什么),如409冲突
。否则,启动处理(理想情况下,处理在单独的线程/进程中进行,这样用户就不必等待:使用适当的状态代码(如202 Accepted
)进行响应)
这个
now+timeout
值是需要的,以防处理过程崩溃(因此我们避免死锁)。还请记住,由于竞争条件,您必须在事务中“检查并设置”此锁列(如果您使用的是类似MongoDB的数据库,可能会非常困难)。是否有任何方法可以摆脱DB table r/w访问锁?