如果是,一定是吗?


是的,框架是非同步非阻塞的。但你还要在你的代码里控制不要用同步阻塞IO,以及任何耗时较长的同步方法--比如说解析一个大xml文件等。否则,你这个后端应用就还是阻塞的。

有不少朋友曾经和我说有些相应时间很短的IO操作是不是就用同步算了,比如说memcached和Redis。现实的血泪教训是不行,IO操作受网路延时影响有时候会延时莫名增加,有时候tail latency会比较明显,都会让你的后端应用出现进程阻塞,这里会有个放大效应,严重影响sla。


不了解Koa或者Egg,但是经常用Express。不过基本原理和node自身的构造更相关一些(而非其上的框架)。Node的本质是当运行JavaScript代码时,代码本身是阻塞的(JS单线程的缘故)。但是当你使用Node API时,非同步API可以选择创建另一线程并在其之上执行读写任务。当JS本身运行完毕后,event loop会开始检查非同步API的执行是否完成,如果完成的话会向js引擎v8要求运行对应callback里的代码并提供对应处理完成的数据。也就是说node背后其实有很多线程用来执行具体读写任务,但真正由你写的javascript代码本身永远都是单线程阻塞运行的(除非你使用worker thread)


单线程,如果不是非同步的,怎么并发处理多请求。


是的,正好应了node.js简介事件驱动非阻塞


nodejs的io模型是非同步非阻塞的,大部分介面都是,只要不写cpu密集型的代码,整体性能就不会差


Nodejs的引擎v8是非同步非阻塞的,但是这个引擎由于非同步,会诞生诸多问题。

比如我在用oracledb做资料库读写操作的时候,由于同时并发100+个操作,而这个库是将一个操作分成很多个cb回调的,但是资料库看来就乱套了,所以会有不可避免的但是又不可修复的各种线程占用错误...

后来用.net多线程方式重写了才流畅起来....

经验就是,至多用来读取一下redis,其他的嘛还是交给jvm或.net来,他们的更成熟


网路部分非同步,阻塞还是非阻塞忘记了,模糊libuv里用的是阻塞io


推荐阅读:
查看原文 >>
相关文章