编写node.js apicallback与否

伙计,假设一个使用NOSQL后端(mongo或dynamo)的NodeJS(restify.js)编写的API。

当你有一个阻塞操作,比如读写文件时,总是用非阻塞的方式写东西的好主意……但是,当你的操作需要几毫秒才能完成时,你应该使用callback函数吗? ?

设想一下诸如https://api.foo.com/v1/bar/baz之类的 api调用,将其路由到一个能够从NoSQL引擎快速响应的函数,以JSON格式化响应并将其放回到浏览器中。

在这种情况下,你应该使用回叫? 编写这个扩展到数百个并发请求。

谢谢!

即使您的操作需要几毫秒才能完成,并且您将使用同步实现(例如 – readFileSync vs readFile – 这是asynchronous) – 您提到的所有其他并发请求都必须等待同步操作完成。

换句话说,如果你有一个select,如果你的目标是编写可伸缩的解决scheme,你应该总是使用非阻塞实现。

纯粹的同步操作的合适场景是在应用程序启动时加载configuration,之后应避免任何可能阻塞事件循环的长操作。

我会以一些事实的forms来回答这个问题:

  1. 使用CPU,空闲的CPU浪费金钱,浪费用户的时间
  2. 在Node中尽可能快地完成排队操作,这是通过在函数内使用asynchronous操作完成的( setImmediate / Timeout / Interval只是将新工作放在队列中而不是asynchronous)
  3. 虽然队列中的每个操作都是同步运行的,并且一次只运行一个操作,只要该操作启动asynchronous操作并完成处理,另一个排队的操作可能会开始
  4. asynchronous工作可能发生在另一个线程上(依赖于实现/平台),也可能发生在另一个进程或另一台机器上。
  5. 当另一个CPU /线程/机器工作时,NodeJS进程可以继续忙于处理队列
  6. 当操作完成时,可以重新检查队列以进行更多的工作,或者处理来自另一个CPU /线程/机器的响应。

由于asynchronous模式在事件或callback函数的forms中非常常见,因此很容易学习(并遵循)。 当处理器可能不忙时,它使处理器保持忙碌状态。 通过保持NodeJS进程繁忙,更多的工作正在完成。

在你提到的情况下,使用NoSQL引擎,假设它支持asynchronous(比如MongoDB),使用asynchronous操作,尤其是在最终用户可能正在等待的时候。 NoSQL数据库的许多本地驱动程序仅以callback/事件的forms提供asynchronous支持。