【问题标题】:Nodejs synchronicity between requests请求之间的Nodejs同步
【发布时间】:2014-07-30 10:08:02
【问题描述】:

我了解节点的异步本质和异步编程概念,我已经做了很长时间。但是我处于一种情况,如果你愿意的话,我需要同时请求检查“同步”的东西。让我解释一下:

  • UserA 请求的资源不存在。
  • 为“isProcessing”设置一个标志,让其他人知道正在创建资源。
  • UserB 请求相同的资源,看到它正在处理,然后等待它准备好(使用轮询 - 不要专注于此,因为这部分按照我们想要的方式工作)
  • [一堆繁重的异步东西碰巧生成了一个资源]
  • 资源已准备就绪,任何轮询它的人都会收到通知(就像我说的,这部分有效)

让我陷入困境的部分是“第 2 步”,我们在其中设置了“isProcessing”标志。这是一个异步数据库操作 (mongo),当 2+ 个请求同时进入 时,该操作尚未完成。结果,多个请求试图创建相同的资源。如果请求之间有足够的时间进行数据库写入(约 5 毫秒),但对于“同时”请求而言,问题就会消失。

谁能提供一些好的建议来解决这个问题。看来我需要以同步(线程阻塞)方式设置“isProcessing”标志。我知道文件系统有同步操作——这是要走的路吗?我们在多核机器上使用节点,有一天它会扩展到云中。我们正在使用 pm2 跨多个内核分发我们的应用程序。任何建议将不胜感激。

【问题讨论】:

  • 标志的设置是否必须是异步数据库操作?它可以是内存中设置的立即标志,因此没有延迟吗?
  • @jfriend00 - 有什么建议可以扩展吗?

标签: multithreading node.js mongodb asynchronous synchronous


【解决方案1】:

您只需要获得数据库访问权限。当你说

UPDATE MyLockTable SET IsProcessing = 1 WHERE IsProcessing = 0

如果 IsProcessing 已设置为 1,您将修改 0 行。否则,修改 1 行。这样您就可以区分这两种情况并只开始一次繁重的工作。

【讨论】:

  • 我真的很喜欢这个,甚至没有考虑过。我将测试并报告(顺便使用 mongodb,但它返回更新的行数)。
  • 这最终使我朝着正确的方向前进。我对重复插入使用了独特的字段约束和错误处理的组合,这个答案让我朝着这个方向前进。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多