Node.js或Erlang

时间:2010-06-10 02:46:45

标签: concurrency erlang multicore node.js

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

Erlang看起来更稳定的解决方案,但需要更多的学习和大量潜入功能语言范例。看起来Erlang在多核CPU方面做得更好(如果我错了就解决我的问题)。

但我应该选择哪个?从短期/长期角度来看哪一个更好?

我的目标是学习一种工具,使得在高负荷下扩展我的网络项目比传统语言更容易。

9 个答案:

答案 0 :(得分:87)

我会试试Erlang。即使它将是一个更陡峭的学习曲线,你将获得更多,因为你将学习一种函数式编程语言。此外,由于Erlang专门用于创建可靠,高度并发的系统,因此您将学习很多有关同时创建高度可伸缩服务的知识。

答案 1 :(得分:50)

我不能代表Erlang,但有一些关于节点没有提及的事情:

  • Node使用Google的V8引擎实际将javascript编译为机器代码。所以节点实际上非常快。所以这是事件驱动编程和非阻塞io提供的速度优势之上。
  • Node有一个非常活跃的社区。在freenode上跳到他们的IRC小组,你会明白我的意思
  • 我注意到上面的评论推动Erlang的基础是学习函数式编程语言会很有用。虽然我同意扩展你的技能并获得其中一项很重要,但你不应该根据你想要学习新编程风格的事实来建立项目
  • 另一方面,Javascript已经处于一种你觉得写得舒服的范例中!加上它的javascript,所以当你编写客户端代码时,它会看起来和感觉一致。
  • 节点的社区已经抽出了大量的modules!有redis,mongodb,沙发的模块,以及你有什么。另一个值得研究的好模块是Express(想想节点的Sinatra)

在实际编写节点的人Ryan Dahl的yahoo博客上查看video。我认为这将有助于您更好地了解节点所处的位置以及它的发展方向。

请记住,节点仍处于后期开发阶段,因此一直在进行相当多的更改 - 这些更改已经破坏了早期的代码。但是,据说它可以指望API不会改变太多。所以,如果你正在寻找有趣的东西,我会说节点是一个很好的选择。

答案 2 :(得分:15)

我是一名长期的Erlang程序员,这个问题促使我看看node.js.它看起来非常好。

看起来您需要生成多个进程才能利用多个核心。我无法看到有关设置处理器关联性的任何信息。您可以在linux上使用taskset,但它可能应该参数化并在程序中设置。

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

看起来不错。


修改

Node.js现在支持Windows。

答案 3 :(得分:9)

我正在为多个项目寻找相同的两种替代方案。

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

另一个考虑因素是Erlang可以扩展到多个核心,它可以扩展到整个数据中心。我没有在node.js中看到一个内置机制,它允许我向另一个JS进程发送一条消息而不关心它所在的机器,但是它是在最低级别的Erlang中构建的。如果你的问题不够大,不需要多台机器,或者它不需要多个合作进程,那么这个优势就不大了,所以你应该忽略它。

Erlang确实是一个深入潜水的游泳池。我建议您在开始构建Web应用程序之前先编写一个独立的功能程序。更简单的第一步,因为您似乎对Javascript感到满意,就是尝试以更实用的方式编写JS。如果您使用jQuery或Prototype,那么您已经开始使用这条路径了。尝试在Erlang中的纯函数式编程或其中一个kin(Haskell,F#,Scala ...)和函数式JS之间进行反弹。

一旦您对函数式编程感到满意,请找出许多Erlang Web框架之一;你可能不应该在这个晚期阶段将你的应用程序直接写入inets这样的低级别。例如,查看Nitrogen之类的内容。

答案 4 :(得分:9)

虽然我个人会选择Erlang,但我承认我对JavaScript有点偏见。我的建议是你评估几点:

  1. 您是否正在重复使用其中任何一种语言的现有代码(无论是源代码还是程序员经验!)
  2. 您是否需要/想要在不停止应用程序的情况下实时更新(这是Erlang默认获胜的地方 - 它的运行时是针对该情况设计的,而OTP包含所有必需的工具)
  3. 就单独的并发操作而不是带宽而言,预期流量有多大?
  4. 您为每个请求执行的操作的“并行”程度如何?
  5. Erlang真的很好地调整了并发性。网络透明的并行分布式系统。根据项目的确切内容,这种系统的成熟实施的可用性可能超过学习新语言的任何问题。还有另外两种可以使用Erlang VM的语言,类似Ruby / Python的ReiaLisp-Flavored Erlang

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

答案 5 :(得分:5)

看起来Erlang在相对低端的服务器(512MB 4核2.4GHz AMD VM)中的部署效果更好。这来自SyncPad's experience比较Erlang与其虚拟白板服务器应用程序的Node.js实现。

答案 6 :(得分:4)

在同一个VM上还有一种语言是erlang - > Elixir

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

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

答案 7 :(得分:3)

如果没有erlang https://www.youtube.com/watch?v=c12cYAUTXXs

,whatsapp永远无法达到可扩展性和可靠性的水平

答案 8 :(得分:0)

我会优先选择Erlang over Node。 如果你想要并发,Node可以被Erlang或Golang代替,因为它们的重量很轻。

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