【问题标题】:EventMachine vs Node.jsEventMachine 与 Node.js
【发布时间】:2011-07-29 06:28:27
【问题描述】:

我将开发一个协作网站,其中一项功能将是协作编辑和实时更改。即当两个或更多用户正在编辑同一个文档时,他们可以在发生更改时立即看到彼此的更改。 我有一些使用 Ruby on Rails 的经验,所以我在考虑使用 EventMachine,但是由于围绕 Node.js 的所有这些炒作,我知道我正在考虑使用它。那么,使用 Node.js 代替 EventMachine 的主要好处是什么?

tl;博士 EventMachine 和 Node.js 的主要区别是什么(除了语言)?

【问题讨论】:

  • @Juliusz 有趣,以前从未听说过抽筋。我来看看。谢谢。
  • @PabloB。这里有几个很好的答案。您选择的不是其中之一。我想建议你再看看这个。
  • @JuliuszGonera cramp.in 还存在吗?
  • @AlexMills 似乎没有...我现在可能会使用 Node.js,它非常稳定、流行并且适合这种应用程序。此外,它不太可能像抽筋一样消失。
  • 好的,我标记了你原来的评论,因为抽筋已经不存在了

标签: ruby-on-rails node.js eventmachine event-driven commonjs


【解决方案1】:

我倾向于“使用你所知道的”(即使它是一个更重的架构)。因此,我认为它不像“EventMachine vs NodeJS”那么简单。主要可以总结如下:

  • NodeJS 是一种框架/语言,用于处理 JavaScript 中基于事件的编程。这就是它的驱动力。这不是事后的想法,也不是第三方机制。它已融入语言。您创建回调/事件,因为这就是语言的构建方式。它不是第三方插件,不会改变您的工作流程。
  • EventMachine 是 Ruby 中的一个 gem,它使开发人员可以访问基于事件的编程模型的一些优点。它被大量使用并经过良好测试,但并未直接融入语言。两者都锁定在一个 CPU 上,但通过 Nodes 核心的事件编程,它仍然有优势。编写 Ruby 时并没有考虑到并发性。

也就是说,技术问题是可以克服的。应该指导您做出决定的更重要的问题(在我看来)是:

  • 您的生产环境会是什么样子?你对服务器有完全的控制权吗?您可以随心所欲地托管它吗?还是一开始就在共享系统上,然后您必须对此进行扩展?
  • 您团队中的所有开发人员都具备快速学习一门新语言的能力吗?他们能够以多快的速度理解中间层的 JavaScript 等基于事件的语言?
  • 您是否需要 Rails 提供的所有架构(完整的测试框架、脚手架、模型、控制器等)?还是说太过分了?

两者之间有不少技术差异。一个是语言,一个是框架。真的,你想运行多重的堆栈?您的开发人员需要学习多少?您是否想要一个完整的堆栈来为您提供很多您可能不会使用的细节,或者您是否想要一个运行速度极快且并发的基本框架,即使您可能需要编写额外的样板代码并学习新语言?

虽然 Rails 不像某些 Web 应用程序架构那样繁重,但您仍然需要比在 NodeJS 中处理类似数量的吞吐量所需的更多处理器能力。假设两个系统的质量代码。在任一堆栈上编写的错误代码都会阻止堆栈发光。这真的归结为 - 你真的想学习一种全新的做事方式,还是想利用你目前对 Ruby 的理解来快速开始工作?

我知道这不是一个确定的答案,但我希望这有助于指导您做出决定!

【讨论】:

  • 谢谢。那么,如果我理解得很好,EventMachine 的主要(不利)优势是 Rails 吗?所以,如果我不需要 Rails 或者我需要更轻的东西,那么我应该使用 Node.js 吗?
  • 是的。我就是这样做出决定的。它们都是完全可以接受的事件机制(尽管事件是 Node.js 的核心,因为这就是语言的实际编写方式),但问题是您希望围绕这些系统构建多少架构。
  • ruby 库如何直接需要 ruby​​ 框架?您可以轻松地将事件机器与 Rails 分开使用。我完全不明白这个答案。 Javascript 不是基于事件的,但您可以将其用于基于事件的编程。此答案包含错误信息。
  • 我同意 SpaceGhost 的观点。 Javascript 可用于事件,但不是事件驱动语言。此外,@Chris Rueber,您提到在 JavaScript 中传递函数似乎是使用 Node.js 的一个优势,但 Ruby 也支持函数作为一等公民,因此两者都是如此。
  • bigtunacan 的说法不准确。你可以传递 lambda 和 proc,但正如他所说,它们不是一等公民。有关详细信息,请参阅此帖子:stackoverflow.com/questions/2602340/…
【解决方案2】:

Node.js

您可以更好地控制对正在发生的事情的低级别控制。您可以包含构建在 node.js 之上的通用库,以根据自己的喜好调整抽象级别。例如,您可以使用 connect 或 express,具体取决于您是否需要为您编写的视图引擎。 您可以使用 socket.io 或现在取决于您希望您的客户端-服务器连接抽象多少。您可以选择包含众多 MVC 库中的任何一个或编写自己的库。

事件机

类似node.js的异步IO库

这归结为 Ruby 与 JavaScript 的偏好,您希望抽象或缺乏抽象的灵活性有多大,以及您是否希望将节点用作您的实际 Web 服务器。

【讨论】:

  • 不,你没有得到整个 RoR 堆栈,你不知道你在说什么。 Ruby on Rails 是使用 Ruby 构建的 Web 框架,EventMachine 是使用 Ruby 构建的异步库。他们唯一的共同点是 Ruby。 EventMachine 和 Node.js 类似。
  • @alessioalex 你是对的,我不知道我在说什么。
【解决方案3】:

已经提出了关于混淆的详细观点......只是个人观点

[] node.js 会更好,如果你准备好学习和实验比你想象的更多,因为:

  • 它的线程机制很棒(灵感来自 'erlang')

  • 您可以(轻松地)构建一个特定用途的服务器,这将是真正的生产力

【讨论】:

  • 你能解释一下你所说的更好是什么意思吗?
【解决方案4】:

EventMachine 与 Rails 没有任何关系,只是它们都是用同一种语言编写的。你可以让 EventMachine 像 Node.js 一样裸露;您所要做的就是不要将库添加到您的项目中。根据我的经验,EventMachine 库(如 em-http)比 Node.js 的任何库都好得多。您可以使用纤维代替回调来避免回调地狱。由于所有的回调,在 Node 中完成异常处理几乎是不可能的。此外,Ruby 是一种比 Javascript 更好、更完整的语言。

【讨论】:

  • 如果你在 Node.js 中使用 Deferreds 和 Promises(这很常见),你可以很好地在异步代码中使用异常处理。参见例如github.com/kriskowal/q
  • @Phill Kulak,我想知道,到 2014 年你的答案会不会一样?
  • @scaryguy 好吧,我认为 EM 在这一点上是一个垃圾箱大火,所以可能不是!
  • @PhilKulak 为什么?人们不断地把关于 EM 的事情说成是事实,但从不解释为什么 EM 不好。我认为 Node.js 很棒,但我仍然更喜欢带有 Ruby 的 EM,并且发现它同样强大(如果不是更强大的话)。
【解决方案5】:

值得一提的是制作故事。 EM 与大多数 Rack 产品一样,有大量可用的测试和监控工具经过良好测试,而 Node.js 在这方面还远远不够。

在撰写本文时,似乎几乎不可能从 Node 获得明确的指标来回答“我是否需要扩展”之类的问题。 Joyent 之类的选择开始形成,而且总是自己动手,但在 NewRelic 等工具附近没有任何选择。

从性能/可配置性的角度来看,Node.js 非常好,但我个人不会在生产环境中托管它目前

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多