阻止非阻塞http服务器中的代码

时间:2015-08-31 05:20:11

标签: node.js blocking nonblocking

例如,我有一个http服务器,即node.js,因此是非阻塞的。

对于每个请求都将执行数据库操作。

我无法理解的是阻塞数据库操作和非阻塞数据库操作之间的区别是什么?

由于Web服务器是非阻塞的,因此请求中的阻塞DB操作没有区别吗?

2 个答案:

答案 0 :(得分:4)

我猜你在非阻塞和线程之间混淆了。你的nodejs在一个线程上运行,如果你收到多个请求,每个请求都需要访问数据库,在非阻塞中,nodejs只会请求数据库的数据,不会等待DB的响应,继续处理下一个请求,以阻止方式,仅使用线程,当它一次回答一个http请求时,会导致请求超时。

修改:您可以查看this question的答案,我猜他的解释更好。

答案 1 :(得分:2)

这是一个可能有助于您理解的类比。让我们假设您已经开始销售了,今天您有50个电话。

在阻止模式中,您拨打电话,如果此人没有准备好与您通话,您必须坐在线路上等待并等待他们准备好与您通话。当他们终于准备好与你交谈时,你会进行对话,然后挂机,然后才能进行下一次通话并重复此过程。因此,您的电话忙碌且无法拨打电话的时间是您等待客户准备好与您通话的所有时间的总和加上您谈话的所有时间。

在非阻止模式中,您拨打电话,如果此人没有立即可用,您会留下一条快速消息,当他们准备好说话时他们会给您回电话。您挂起留言并立即致电您的下一位客户。手机忙碌的总时间只是留下快速留言的时间,然后是回拨时的通话时间。如果他们在一分钟或三小时内给您回电,那对您来说实际上并不重要 - 这不会影响您拨打电话的整体效率。显然,使用非阻塞模型可以放置和完成更多的呼叫,因为只要等待客户端准备好进行通话,您就不会浪费大量时间做其他事情。

node.js通过使用非阻塞I / O模型而不使用线程来获得其效率。适当地实施,这种非阻塞模型比拥有大量等待阻塞请求的单个线程更有效。

因此,在node.js中,如果您有阻塞数据库请求,那么数据库请求阻止的整个时间,node.js Web服务器就无法执行任何其他操作。它只有一个线程,所以如果该线程忙于阻塞请求需要一段时间才能完成服务器基本上在很长一段时间内都没用了。这将是node.js服务器进程的破坏实现,并且以这种方式使用node.js没什么意义。

使用非阻塞数据库请求,node.js服务器开始处理http请求。它运行一些代码,然后它转到非阻塞数据库请求。该请求已启动并且已注册回调以完成,但由于它是非阻塞的,因此数据库调用会立即返回。 node.js服务器返回其事件循环,并且可以立即开始处理其他http请求或其他事件以供服务器处理(例如,完成其他http请求)。然后,稍后,数据库调用结束并在事件队列中放入一个条目以触发其回调。当nodejs服务器到达事件队列中的该事件时,将调用回调,并且原始请求现在具有来自数据库服务器的答案,并且可以完成该原始请求。与此同时,它一直在等待数据库请求完成,它正在忙于处理其他事情 - 所有这些都是它的一个单一线程。