我在node.js中提出了一个花哨的同步问题,但我找不到一个优雅的解决方案:
我设置了express / node.js Web应用程序,用于从单行数据库表中检索统计数据。
问题是,当多个用户同时发出请求时,如果记录很旧,则长计算任务将对每个请求执行一次,而不是仅执行一次。
有什么优雅的方法,只有一个请求触发计算任务,而所有其他请求都等待更新的数据库记录?
是的,它称为locks。
在表中增加一列,例如lock,它将是时间戳类型。一旦流程开始处理该记录,就会花一些now+timeout
时间(根据经验,我选择超时为平均处理时间的2倍)。当进程停止处理时,请使用NULL值更新该列。
在处理开始时,请检查该列。如果value > now
满足条件,则向客户端返回一些状态代码(不要强迫客户端等待,这是糟糕的用户体验,除非处理时间很短,否则他不知道发生了什么)409 Conflict
。否则,开始处理(理想情况下,处理也将在单独的线程/进程中进行,这样用户就不必等待:以类似的适当状态代码进行响应202 Accepted
)。
now+timeout
如果您的处理过程崩溃,则需要此值(因此我们避免死锁)。还请记住,由于竞争条件,您必须在事务中“检查并设置”此锁定列(如果使用类似MongoDB的数据库,可能会非常困难)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句