Node.js或Erlang?

88

谈到并发处理能力时,我非常喜欢这些工具。

Erlang/OTP看起来更加稳定,但需要更多的学习和深入了解函数式语言范式。而且,当涉及到多核CPU时,Erlang/OTP似乎做得更好(如果我错了请指出)。

但我该选择哪一个呢?从短期和长期角度来看,哪个更好呢?

我的目标是学习一种工具,使我能够更轻松地在高负载下扩展Web项目,比传统语言更容易实现这一点。


你可以使用 http://underscorejs.org/ 作为一个函数式语言来编写 JavaScript。 - Todd Moses
2
@ToddMoses 你确定你评论的是正确的问题吗? - Flavien Volken
2
苹果和橙子。Node.JS (核心部分) 是 libevent (C) + Javascript 互操作性。Erlang 是完全自定义的 IO 实现。Node.JS 是为单线程应用程序而设计的。你的困境是想在 Facebook/Google 找到一份工作,还是想制作出强大的软件。 - Vans S
@VansS 当然是超赞的。但我不确定 Erlang 是否会像基于 JS 的后端那样快。为了安全起见,Erlang 进程会在传递的数据副本上工作。而复制需要时间(相对于引用)。一个基于 Erlang 的电子医疗记录应用程序(基本上是企业应用程序)能够处理1000个医院并发用户吗?如果可以的话,我想建议我的老板开始将我们的传统 JavaEE 应用的 EMR 应用移植到 Erlang :-) - Harry
9个回答

87

我建议尝试使用Erlang。虽然学习曲线比较陡峭,但是既然你在学习一门函数式编程语言,就应该从中获得更多的收益。此外,Erlang是专门设计用来创建可靠、高并发系统的语言,所以你也将同时学到很多有关创建高度可伸缩服务的知识。


10
我认为Erlang并不比JavaScript更复杂。在Erlang中没有任何类型的继承,因此您总是确信调用哪个函数。在Erlang中没有隐式类型转换,因此您总是确定使用哪种数据类型。在Erlang中没有破坏性赋值,所以您总是确信不会因为回调函数中的新代码改变了内部状态而导致一些旧代码出问题。 - Dmitry Belyaev

51

虽然我不能代表Erlang,但有一些关于Node的事情还没有被提到:

  • Node使用Google的V8引擎将JavaScript编译为机器码。所以Node实际上非常快。这是事件驱动编程和非阻塞IO所带来的速度优势之外的又一个优点。
  • Node拥有一个相当活跃的社区。加入他们在freenode上的IRC组,你就会明白我的意思。
  • 我注意到前面的评论推荐Erlang是因为学习函数式编程语言很有用。虽然我认为扩展技能并掌握一门新的编程风格很重要,但你不应该基于你想学习新的编程风格而去决定项目。
  • 另一方面,JavaScript已经处于你写作舒适区内的范式中!此外,它是JavaScript,因此当你编写客户端代码时,它看起来和感觉都很一致。
  • Node的社区已经开发出大量模块!它们包括redis、mongodb、couch等模块。另一个值得关注的好模块是Express(它就像Node的Sinatra)。

在Yahoo博客上,Ryan Dahl是实际编写Node的人。你可以查看视频,我认为这将有助于更好地了解Node的现状和未来方向。

请记住,Node仍处于后期开发阶段,因此经历了许多变化——这些变化可能会破坏早期的代码。然而,据说它已经达到了一个可以预期API不会再太多改变的水平。所以,如果你正在寻找一些有趣的东西,我认为Node是一个很好的选择。


26
我认为V8引擎将JavaScript编译成机器码,而不是汇编语言。 - Jonas
11
围绕JavaScript的大量工作并不能使该语言适用于解决复杂问题。语言本身在类型转换方面存在许多特殊情况,非常糟糕。回调函数的编写方式会导致变量在数百个不同的位置被更改,查找某个赋值发生的地方也十分困难。 - Dmitry Belyaev

15

我是一名长期使用Erlang编程的程序员,这个问题促使我开始了解node.js。它看起来相当不错。

似乎需要生成多个进程才能利用多核心。但我没有看到关于设置处理器亲和性的内容。在Linux上可以使用taskset,但应该将其参数化并在程序中设置。

我还注意到平台支持可能稍微弱一些。具体而言,看起来您需要在Cygwin下运行以获得Windows支持。

看起来不错。


编辑

现在Node.js已经原生支持Windows。


5
这个答案有点过时了。现在Node是跨平台的,在Windows上不需要安装Cygwin。而且Node内置支持在一台机器上进行集群操作,共享TCP套接字。 - Farid Nouri Neshat

9

我正在考虑与你一样的两个选择,gotts,用于多个项目。

到目前为止,我想出的最好方法来决定在给定项目中它们之间的选择是是否需要使用Javascript。 我正在寻找要迁移的一个现有系统已经使用Javascript编写,因此它的下一个版本很可能会使用node.js完成。 其他项目将使用某个Erlang Web框架,因为没有现有的代码库可供迁移。

另一个考虑因素是,Erlang不仅可以扩展到多个核心,而且可以扩展到整个数据中心。 我没有看到node.js中内置的机制,可以让我发送消息给另一个JS进程,而不必关心它在哪台机器上,但这已经内置在Erlang的最低层中了。 如果您的问题不足以需要多台机器或不需要多个协作进程,则这种优势不太重要,因此您应该忽略它。

Erlang确实是一个深入研究的领域。我建议您在开始构建Web应用程序之前,先编写一个独立的函数式程序。如果您已经熟悉JavaScript,那么更容易的第一步是尝试以更函数式的风格编程JS。如果您使用jQuery或Prototype,则已经开始了这条道路。尝试在纯函数式编程中在Erlang或其类似语言(Haskell、F#、Scala等)和函数式JS之间跳转。
一旦您熟悉了函数式编程,请寻找众多的Erlang Web框架之一;您可能不应该直接将应用程序编写到像inets这样的低级别上。例如,看看Nitrogen这样的东西。

1
往往被忽略的是,“Erlang可扩展到整个数据中心”的观点有一些非常重要的限制需要考虑(安全性是其中一个重要因素)。请查看此处的相关章节:http://learnyousomeerlang.com/distribunomicon - jocull

9

尽管我个人更喜欢Erlang,但我承认我对JavaScript有一点偏见。我的建议是您评估以下几个方面:

  1. 您是否在任何一种语言中重用现有代码(包括源代码和程序员经验)?
  2. 您是否需要/希望在不停止应用程序的情况下进行即时更新(这是Erlang默认获胜的地方 - 它的运行时就是为这种情况而设计的,OTP包含了所有必要的工具)?
  3. 预期流量有多大,以分离的并发操作计算,而非带宽?
  4. 您每个请求所执行的操作有多“并行”?

Erlang具有真正精细的并发性和网络透明的并行分布式系统。根据项目的实际情况,这样的系统的成熟实现的可用性可能会超过学习新语言方面的任何问题。还有另外两种运行在Erlang VM上的语言可以使用,类似于Ruby / Python的ReiaLisp-Flavored Erlang

另一个选择是同时使用两种语言,特别是将Erlang用作“中心”。我不确定Node.js是否有外部函数接口系统,但如果有的话,Erlang有C库可用于外部进程与系统进行接口,就像任何其他Erlang进程一样。

根据文档,Node.js可以利用C和C++来进行外部插件的添加。http://nodejs.org/docs/v0.3.1/api/addons.html - Evan Plaice
看起来Reia已经消失了,但是它的位置被Elixir取代了...这让我想起了Groovy和Java;在这里,它将是Elixir和Erlang。 - stommepoes
@EvanPlaice - 这并没有给我留下深刻印象。问题在于,你基本上是在用C++编写有问题的东西,并将它们添加为内置项。你实际上所做的不是很多的FFI,而是扩展了模拟器。(好吧,这是个人偏好;))在erlang的情况下,提到的外部库是为了在其他语言中创建异步进程,这些进程显示为节点或通过开放端口进行通信(考虑双向管道,带有结构化数据)。所有这些都很好地适合异步操作模式。还有NIFs,这基本上就是Node.js所拥有的,但被反对使用。 - p_l
1
据我所知,节点方法略有不同。虽然节点非常擅长处理异步IO调用(即Web请求),但它在单线程环境中运行。因此,它非常擅长分派,但在CPU密集型处理方面并不那么好。为了覆盖这一领域,您可以分叉另一个运行本机C / C ++代码的进程/线程。如果您所做的只是异步IO调用(例如IPC |双向管道),则node.js应该能够处理负载。只要它没有编码以花费大量时间等待同步调用。 - Evan Plaice

5

在与Erlang相同的VM上还有一种语言-> Elixir

它是Erlang的一个非常有趣的替代品,可以了解一下。

此外,它还有一个快速增长的基于它的Web框架-> Phoenix Framework


5

2
是的,node.js似乎存在一个严重的内存泄漏问题。Node相当新和实验性,JavaScript和V8引擎都不是为这样的服务器场景而设计的。另一方面,Erlang从底层开始就专门为此而设计,并有多年的时间来完善自己并成熟。 - Rolf
2
那个链接似乎已经失效了,但是你可以在WayBackMachine上找到它:http://web.archive.org/web/20120902014555/http://blog.mysyncpad.com/post/2073441622/node-js-vs-erlang-syncpads-experience - jocull

3

0

我更喜欢Erlang而不是Node。 如果你需要并发,可以用轻量级进程的Erlang或Golang替代Node。

Erlang并不容易学习,需要付出很多努力,但它的社区非常活跃,因此可以从中获得帮助,这也是人们为什么更喜欢Node的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接