【发布时间】:2014-07-30 10:08:02
【问题描述】:
我了解节点的异步本质和异步编程概念,我已经做了很长时间。但是我处于一种情况,如果你愿意的话,我需要同时请求检查“同步”的东西。让我解释一下:
- UserA 请求的资源不存在。
- 为“isProcessing”设置一个标志,让其他人知道正在创建资源。
- UserB 请求相同的资源,看到它正在处理,然后等待它准备好(使用轮询 - 不要专注于此,因为这部分按照我们想要的方式工作)
- [一堆繁重的异步东西碰巧生成了一个资源]
- 资源已准备就绪,任何轮询它的人都会收到通知(就像我说的,这部分有效)
让我陷入困境的部分是“第 2 步”,我们在其中设置了“isProcessing”标志。这是一个异步数据库操作 (mongo),当 2+ 个请求同时进入 时,该操作尚未完成。结果,多个请求试图创建相同的资源。如果请求之间有足够的时间进行数据库写入(约 5 毫秒),但对于“同时”请求而言,问题就会消失。
谁能提供一些好的建议来解决这个问题。看来我需要以同步(线程阻塞)方式设置“isProcessing”标志。我知道文件系统有同步操作——这是要走的路吗?我们在多核机器上使用节点,有一天它会扩展到云中。我们正在使用 pm2 跨多个内核分发我们的应用程序。任何建议将不胜感激。
【问题讨论】:
-
标志的设置是否必须是异步数据库操作?它可以是内存中设置的立即标志,因此没有延迟吗?
-
@jfriend00 - 有什么建议可以扩展吗?
标签: multithreading node.js mongodb asynchronous synchronous