node.js中的节点究竟是什么?

在Erlang中,我能够立即理解“节点”的概念 – 一个独立的Erlang虚拟机。 我可以在一台机器上用erl -name gandalf -setcookie abc和另一台机器上的另一个节点(在同一个局域网上)用erl -name bilbo -setcookie abc启动一个节点。 然后我可以在gandalf上产生与bilbo上的其他进程神奇沟通的进程。 现在,因为我也想用Erlang过程的animationgraphics效果提供一个爵士网页,所以我select了一些Javascript并学习了jQuery。 仍然是一个谦卑的paduwan,但我有点理解Javascript如何适应事物的计划。

我最近遇到了node.js,一个邪恶的声音开始低语:“就是这样! 现在你可以用Javascript来做所有事情! 忘记厄兰和守卫和时期,坚持一个人人都使用的语言'。

我已经阅读了一些文档,但是我仍然不明白node.js中的节点是什么。 我必须运行一个http服务器,并成为我的节点? 如果我不喜欢http,或者我不在乎gandalf如何与bilbo交谈 – 这就是我喜欢的Erlang。 也许我nai:真的期望node.js是用Javascript糖erlang?

与Erlang / OTP相比,Node.js与Twisted有更多的相同之处。 Node.js只是一个单线程的SEDA事件循环。 当涉及到分发,热代码重新加载和通过进程的可伸缩性时,Node.js与Erlang VM相比没有什么特别的地方,它与“Erlang with Javascript sugar”

也许是因为你的Erlang知识,你认为Node.js与“节点”(如erlang节点)有某种关系,但它只是名字。

Node.js的主要思想是推迟所有昂贵的I / O操作,并将callback分配给这些操作的结果。 原因是I / O阻塞了此刻正在运行的(唯一的)进程。 Node.js将为您处理这个问题,因为您正在以正确的方式进行编码。

一个简单的例子就是数据库调用:

 result = SQL.query("EXPENSIVE SELECT HERE") doSomething(result); moreStuff(); // This line must wait until the previous ones are completed. 

在节点中,你可以用一种非常不同的方式来编码:

 SQL.query("EXPENSIVE SELECT HERE", function(result) { doSomething(result); }); moreStuff(); // This line executes inmediately 

如果您在Node.js脚本中有错误的代码,如:

 while(true) { } 

然后你阻塞了这个进程,它将不能处理比​​当前更多的请求,所以在Node.js中必须遵循上面的指导。

据我所知,一个Node.JS节点是V8引擎的一个实例,其中运行了Node.JS运行时和事件循环。 虽然Node.JS运行时使您能够非常快速并简单地开始处理HTTP请求,但这不是强制性的; 真正处理绝大多数的asynchronousI / O是非常好的。

我对Erlang的了解并不多,但我的肤浅认识是,它的强大之处在于高并发计算。 Node.JS本身并不专门。 它的心脏是“I / O”,用asynchronousI / O整齐干净地处理。

node.js中没有“节点”

如上所述,当你运行

 node my_script.js 

您正在运行V8 Java脚本解释器的一个实例(在其生命周期中使用一个内核)。