Node.js或Erlang


86

当涉及到它可以处理的并发级别时,我真的很喜欢这些工具。

Erlang / OTP看起来更稳定,但是需要更多的学习,并且需要深入研究功能语言范例。看起来,Erlang / OTP在多核CPU方面做得更好(如果我错了,请纠正我)。

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

我的目标是学习一种工具,该工具比传统语言更容易在高负载下扩展Web项目。



2
您确定@ToddMoses评论了正确的问题吗?
Flavien Volken 2014年

苹果和橘子。Node.JS(其核心)是libevent(C)+ Javascript互操作。Erlang是完全自定义的IO实现。Node.JS是为单线程应用程序制作的。你的想法是你想在Facebook / Google上工作,还是想制作kickass软件。
Vans S

Answers:


87

我会尝试一下Erlang。尽管这将是一个陡峭的学习曲线,但是由于您将学习一种函数式编程语言,因此您将获得更多收益。另外,由于Erlang是专门设计来创建可靠的高度并发系统的,因此您将学到很多有关同时创建高度可扩展服务的知识。


10
我认为Erlang不会比Javascript复杂。Erlang中没有任何类型的继承,因此您始终可以确定要调用的函数。Erlang中没有隐式类型转换,因此您始终可以确定使用什么类型的数据。没有破坏性的分配,因此您始终可以确保不会破坏某些旧代码,因为回调中的某些新代码会更改您的内部状态。
Dmitry Belyaev

51

我不能代表Erlang,但是关于node的一些未提及的事情:

  • Node使用Google的V8引擎将javascript实际编译为机器代码。因此,节点实际上非常快。因此,这是事件驱动的编程和非阻塞io所带来的速度优势的基础。
  • Node有一个非常活跃的社区。跳到freenode上的IRC组,您会明白我的意思
  • 我注意到以上评论推动了Erlang的学习,这对学习功能性编程语言很有用。虽然我同意扩大技能并获得其中一员很重要,但您不应基于想要学习新编程风格这一事实而开展项目
  • 另一方面,Javascript已经处于您可以轻松编写的范例中!加上它是JavaScript,因此当您编写客户端代码时,它的外观和感觉将保持一致。
  • node的社区已经抽出大量模块!有用于redis,mongodb,couch和您拥有的模块。另一个值得研究的优秀模块是Express(将Sinatra作为节点)

观看Ryan Dahl在Yahoo博客上的视频,Ryan Dahl是实际编写node的人。我认为这将帮助您更好地了解节点的位置以及去向。

请记住,node仍处于后期开发阶段,因此已经经历了许多更改,这些更改破坏了早期的代码。但是,据推测,正是在这一点上,您可以期望API的更改不会太大。因此,如果您正在寻找有趣的东西,我会说node是一个不错的选择。


26
我认为V8引擎会将JavaScript编译为机器代码而不是汇编代码。
乔纳斯(Jonas)

10
围绕Javascript进行的大量工作甚至无法使该语言适合解决复杂的问题。该语言本身在类型转换中的所有这些特殊情况下都很糟糕。以及回调样式,其中变量在数百个不同的地方进行了更改,并且在地狱中查找了发生某些分配的地方。
Dmitry Belyaev

15

我是Erlang的长期程序员,这个问题促使我看一下node.js。看起来不错。

看来确实需要产生多个进程才能利用多个内核。我看不到任何有关设置处理器相似性的信息。您可以在Linux上使用Taskset,但是可能应该对其参数化并在程序中进行设置。

我还注意到,平台支持可能会弱一些。具体来说,您似乎需要在Cygwin下运行才能获得Windows支持。

看起来不错。


编辑

Node.js现在具有Windows的本机支持。


5
这个答案有点老了。现在,Node是跨平台的,不需要Windows的Cygwin。Node对一台计算机中的群集具有内置支持,可以共享TCP套接字。
Farid Nouri Neshat 2012年

9

我正在为多个项目寻找相同的两种选择。

到目前为止,对于给定的项目,我想出的最好的剃刀是我是否需要使用Javascript。我要迁移的现有系统已经用Javascript编写,因此其下一个版本可能会在node.js中完成。其他项目将在某些Erlang Web框架中完成,因为没有现有的代码库可移植。

另一个考虑因素是,Erlang的扩展范围远远超出了多个内核,它可以扩展到整个数据中心。我没有在node.js中看到一个内置的机制,该机制使我可以向另一个JS进程发送消息,而无需关心它在哪台计算机上,但这是最低级内置在Erlang中的。如果您的问题不够大,无法使用多台计算机,或者不需要多个协作流程,则这种优势不太重要,因此您应该忽略它。

Erlang确实是一个可以潜入的深渊。我建议您在开始构建Web应用程序之前先编写一个独立的功能程序。因为您似乎对Java脚本很熟悉,所以一个甚至更简单的第一步是尝试以更实用的样式来编程JS。如果您使用jQuery或Prototype,那么您已经开始使用此路径。尝试在Erlang中的纯函数式编程或其亲属之一(Haskell,F#,Scala ...)和函数式JS之间弹跳。

一旦您对函数式编程感到满意,就可以从许多Erlang Web框架中找到一种。您可能不应该inets在后期阶段直接将应用程序编写为低级的东西。例如,看看类似Nitrogen的东西。


经常没有提到“ Erlang扩展到整个数据中心”这一点要考虑一些非常重要的方面(安全性是一个大问题)。在此处查看有关该章的内容:learnyousomeerlang.com/distribunomicon
jocull 2015年

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 ++用于外部插件。nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice

看起来Reia已经死了,但是长生不老药代替了它……让我想起了Groovy和Java。这里是Elixir和Erlang。
stommepoes 2012年

@EvanPlaice-没什么让我印象深刻。问题是,您基本上是用C ++编写有问题的代码,并将它们添加为内置代码。FFI的实际用途并不是扩展仿真器。(好吧,个人喜好;)在erlang的情况下,提到的外部库是用其他语言制作异步进程,这些异步进程显示为节点或通过开放端口进行对话(请考虑具有结构化数据的双向管道)。所有这些都非常适合异步操作模式。还有NIF,本质上是Node.js拥有的NIF,但不建议使用。
p_l 2012年

1
@p_l据我了解,节点方法略有不同。尽管节点非常擅长处理异步IO调用(即Web请求),但它在单线程环境中运行。因此,它很擅长调度,但不擅长CPU密集型处理。为此,您可以派生另一个运行本机C / C ++代码的进程/线程。如果您所做的只是异步IO调用(例如IPC |双向管道),那么node.js应该能够处理负载。只要不进行编码,就可以花费大量时间等待同步调用。
Evan Plaice 2012年

5

看来,Erlang在较低端服务器(512MB 4核2.4GHz AMD VM)中的部署性能更好。这是根据SyncPad比较其虚拟白板服务器应用程序的Erlang和Node.js实现的经验得出的


2
是的,node.js似乎有一个令人讨厌的内存泄漏问题。Node相当新并且处于试验阶段,JavaScript和V8引擎都不是针对此类服务器方案设计的。另一方面,Erlang是专为自下而上设计的,并且经过多年的完善和成熟。
罗尔夫(Rolf)

2
该链接似乎已死,但在WayBackMachine上它位于web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…–
jocull

4

erlang在同一台VM上还有另一种语言-> Elixir

这是Erlang的一个非常有趣的替代品,请检查一下。

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



0

我将优先使用Erlang而不是Node。如果您希望并发,则可以使用轻量级的Erlang或Golang代替Node。

Erlang不容易学习,因此需要大量的努力,但是它的社区很活跃,因此可以从中获得帮助,这只是人们偏爱Node的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.