Node.js 或 Erlang

Posted

技术标签:

【中文标题】Node.js 或 Erlang【英文标题】:Node.js or Erlang 【发布时间】:2011-03-01 23:28:45 【问题描述】:

就其可以处理的并发级别而言,我真的很喜欢这些工具。

Erlang/OTP 看起来像更稳定的解决方案,但需要更多的学习和大量深入研究函数式语言范式。看起来 Erlang/OTP 在多核 CPU 方面做得更好(如果我错了,请纠正我)。

但是我应该选择哪个?从短期和长期来看,哪个更好?

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

【问题讨论】:

您可以通过underscorejs.org将javascript 用作函数式语言 @ToddMoses 你确定你评论的问题是对的吗? 苹果和橙子。 Node.JS(其核心)是 libevent (C) + Javascript 互操作。 Erlang 是一个完全自定义的 IO 实现。 Node.JS 是为单线程应用程序而设计的。你的难题是你想在 Facebook/Google 工作,还是想开发超强软件。 @VansS Kickass,当然。但我不太确定 Erlang 是否会像基于 JS 的后端一样快。 Erlang 进程处理它传递的数据副本,以确保安全。复制需要时间(相对于参考文献)。基于 Erlang 的电子病历应用程序(基本上是企业应用程序)能否在医院处理 1000 个并发用户?如果是,我想向我的老板推荐开始将我们基于 JavaEE 的遗留 EMR 应用程序移植到 Erlang :-) 【参考方案1】:

我会更喜欢 Erlang 而不是 Node。 如果你想要并发,Node 可以被 Erlang 或 Golang 替代,因为它们是轻量级的进程。

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

【讨论】:

【参考方案2】:

erlang 所在的虚拟机上还有另一种语言 -> Elixir

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

它还有一个基于它的快速发展的网络框架-> Phoenix Framework

【讨论】:

【参考方案3】:

如果没有 erlang https://www.youtube.com/watch?v=c12cYAUTXXs,whatsapp 永远无法达到可扩展性和可靠性水平

【讨论】:

【参考方案4】:

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

Node 使用 Google 的 V8 引擎将 javascript 实际编译成机器码。所以节点实际上非常快。这是在事件驱动编程和非阻塞 io 提供的速度优势之上。 Node 有一个非常活跃的社区。加入他们在 freenode 上的 IRC 组,你就会明白我的意思了 我注意到上述 cmets 推动 Erlang 的基础是学习函数式编程语言会很有用。虽然我同意扩展你的技能并掌握其中一项很重要,但你不应该将项目建立在你想学习一种新的编程风格这一事实上 另一方面,Javascript 已经处于一种让您可以轻松编写的范式中!此外,它是 javascript,因此当您编写客户端代码时,它的外观和感觉都会一致。 node 的社区已经抽出大量的modules!有 redis、mongodb、couch 等模块,你有什么。另一个值得研究的好模块是 Express(想想 Sinatra for node)

查看 yahoo 博客上的 video,作者 Ryan Dahl,实际上是 node.js 的编写者。我认为这将帮助您更好地了解节点的位置以及它的去向。

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

【讨论】:

我认为 V8 引擎将 JavaScript 编译为机器码而不是汇编。 围绕 Javascript 完成了这么多工作并没有使该语言更适合解决复杂的问题。对于类型转换中的所有这些特殊情况,语言本身很糟糕。还有回调样式,其中变量在数百个不同的地方发生变化,以及寻找发生某些赋值的地方。【参考方案5】:

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

看来您确实需要生成多个进程才能利用多个内核。不过,我看不到任何有关设置处理器亲和力的信息。您可以在 linux 上使用 taskset,但它可能应该在程序中进行参数化和设置。

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

看起来不错。


编辑

Node.js 现在原生支持 Windows。

【讨论】:

这个答案有点老了。现在 Node 是跨平台的,不需要有 Cygwin for windows。 Node 内置了对在一台机器上集群的支持,共享 TCP 套接字。【参考方案6】:

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

【讨论】:

是的,node.js 似乎存在严重的内存泄漏问题。 Node 是相当新的和实验性的,JavaScript 和 V8 引擎都不是为这种服务器场景设计的。另一方面,Erlang 是自下而上设计的,并且经过多年的完善和成熟。 那个链接似乎死了,但它在 WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…【参考方案7】:

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

    您是否重用了这两种语言中的现有代码(无论是在源代码方面,还是在程序员经验方面!) 您是否需要/想要在不停止应用程序的情况下进行即时更新(这是 Erlang 默认胜出的地方 - 它的运行时专为这种情况而设计,OTP 包含所有必要的工具) 就单独的并发操作而非带宽而言,预期流量有多大? 您为每个请求执行的操作有多“并行”?

Erlang 具有真正微调的并发性和网络透明的并行分布式系统。根据项目的具体内容,此类系统的成熟实施的可用性可能超过有关学习新语言的任何问题。您还可以在 Erlang VM 上使用其他两种语言,即类似于 Ruby/Python 的 Reia 和 Lisp-Flavored Erlang。

另一种选择是同时使用两者,尤其是在将 Erlang 用作“集线器”的情况下。我不确定 Node.js 是否有外部函数接口系统,但如果有,Erlang 有 C 库供外部进程与系统接口,就像任何其他 Erlang 进程一样。

【讨论】:

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

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

到目前为止,对于给定项目,我想出的最好的剃须刀是我是否需要使用 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 这样的东西。

【讨论】:

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

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

【讨论】:

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

以上是关于Node.js 或 Erlang的主要内容,如果未能解决你的问题,请参考以下文章

检查 zip 或 gzip 是不是经过密码加密(Node.JS)

如何卸载或升级我的旧 node.js 版本?

如何从 php 或 node.js 获取 websocket url 路径

Node.js socket.io.js 未找到或 io 未定义

Firebase:与此版本的 Node.js 不兼容的 node-tar 或 npm

Node.js 创建文件夹或使用现有的