EventMachine与Node.js的比较

31

我打算开发一个协作网站,其中一个特点是具有实时更改的协同编辑功能。即当两个或多个用户同时编辑同一文档时,他们可以立即看到对方所做的更改。我对Ruby on Rails有一些经验,因此我正在考虑使用EventMachine,但由于Node.js周围存在如此之多的炒作,我现在正在考虑使用它。那么,与EventMachine相比,使用Node.js的主要好处是什么?

简而言之:除了语言之外,EventMachine和Node.js之间的主要区别是什么?


@Juliusz 很有趣,以前从未听说过cramp。我会去看一下的。谢谢。 - Pablo B.
2
@PabloB。这里有几个很好的答案。你选择的那个不是其中之一。我建议你再仔细看一遍。 - user636044
@JuliuszGonera cramp.in 还存在吗? - Alexander Mills
1
@AlexMills 看起来不是很行啊...我现在可能会选择Node.js,它非常稳定、流行,并且非常适合这种应用程序。此外,它不太可能像Cramp一样消失。 - Juliusz Gonera
好的,我已经标记了你的原始评论,因为cramp不再存在。 - Alexander Mills
5个回答

72

除了它们都是使用相同的语言编写之外,EventMachine与Rails没有任何关系。你可以像Node.js一样轻松使用EventMachine,只需不向项目添加库即可。在我的经验中,EventMachine库(例如em-http)比Node的任何东西都要好。您可以使用纤程而不是回调来避免回调地狱。由于所有的回调,完整的异常处理在Node中几乎不可能实现。此外,Ruby是一种比JavaScript更好、更完整的语言。


7
在Node.js中,如果你使用了Deferreds和Promises(这是非常常见的),你可以很好地处理异步代码中的异常。例如,请参考https://github.com/kriskowal/q。 - edwin
3
@Phill Kulak,我想知道,如果是在2014年,你的回答会是一样的吗? - scaryguy
3
嗯,我认为现在EM已经成了一团烂摊子,所以可能不会参加。 - Phil Kulak
@PhilKulak为什么?人们总是以事实的形式陈述关于EM的缺点,但从来不解释为什么EM不好。我认为Node.js很棒,但我仍然更喜欢使用带有Ruby的EM,并发现它同样具有能力(如果不是更强大)。 - Ten Bitcomb

21

我倾向于“使用自己熟悉的东西”(即使它是一个较重的架构)。因此,我不认为这很简单,“EventMachine vs NodeJS”。主要的区别可以概括为:

  • NodeJS是一个用JavaScript编写的框架/语言,用于处理基于事件的编程。这是它的驱动力。它不是事后想法或第三方机制。它直接内置在语言中。你创建回调/事件,因为这就是语言的构建方式。它不是第三方插件,也不会改变你的工作流程。
  • EventMachine是Ruby中的一个gem,为开发人员提供了访问事件驱动编程模型的一些好处。它被广泛使用和测试,但并没有直接嵌入语言中。两者都锁定在一个CPU上,但由于事件编程在Nodes核心中,它仍然占优势。Ruby不是为并发而设计的。

话虽如此,技术问题是可以克服的。从我的角度来看,应该指导您决策的更重要的问题是:

  • 你的生产环境将会是什么样子?你对服务器有完全控制权吗?你可以按照自己想要的方式进行托管?还是它将首先在共享系统上,然后你必须在此基础上扩展?
  • 你团队中的所有开发人员都有能力非常快速地学习一门新语言吗?他们能多快地理解像JavaScript这样的基于事件的语言用于中间层?
  • 你需要Rails给你的所有架构(完整的测试框架,脚手架,模型,控制器等)吗?还是那太过冗余?

两者之间有相当多的技术差异。一个是语言,一个是框架。真正重要的是你想运行多重的堆栈?你的开发人员需要学习多少?你需要一个完整的堆栈来提供许多漂亮的特性,而你可能不会使用它,还是需要一个精简的设置,以极快且并发地运行,即使你可能需要编写额外的样板代码和学习一种新语言?

Rails虽然不像某些Web应用程序架构那样笨重,但您仍然需要比使用NodeJS处理类似吞吐量时需要更多的处理器功率,前提是两个系统都使用质量代码。无论是在哪个堆栈上编写的糟糕代码都会阻止该堆栈发挥优势。这真的取决于 - 您是否真的想要学习全新的做事方式,还是利用您对Ruby的当前理解快速启动项目?

我知道这并不是一个明确的答案,但我希望这可以帮助您做出决定!


3
是的,这就是我做决定的方式。它们都是完全可接受的事件机制(尽管事件是Node.js的核心,因为这就是语言实际上的编写方式),问题在于你想要围绕这些系统建立多少架构。 - Christopher WJ Rueber
21
一个 Ruby 库如何直接要求一个 Ruby 框架?你可以轻松地将 Event Machine 与 Rails 分开使用。我完全不理解这个答案。JavaScript 不是基于事件的,但你可以将其用于基于事件的编程。这个答案包含错误的信息。 - SpaceGhost
2
我同意SpaceGhost的观点。JavaScript可以用于事件处理,但它并不是一种事件驱动语言。此外,@Chris Rueber,你提到在JavaScript中传递函数好像是使用Node.js的一个优势,但Ruby也支持函数作为一等公民,因此这对两者都是成立的。 - bigtunacan
1
bigtunacan的说法是不准确的。你可以传递lambda和proc,但它们并不像他所说的那样是一等公民。有关更多详细信息,请参见此帖子:https://dev59.com/NnE85IYBdhLWcg3wzm5p - Christopher WJ Rueber
@ChrisRueber 为什么你认为 OP 想要使用 Rails 和 EM?他不可能想要使用 Ruby 吗?因为它是 Rails 的一部分,而且他已经从那个经验中了解了它。他可能会使用另一个 Ruby 框架吗?使用 EM 不是遵循你的建议使用自己熟悉的东西吗?EM 和 Node,哪一个才是语言?最后,你能否用任何严肃的证据证明你的说法“虽然 Rails 不像某些 Web 应用程序架构那样沉重,但你仍然需要比在 NodeJS 中处理类似数量的吞吐量需要更多的处理器功率。”,超越另一个无用的待办事项基准测试? - user636044
显示剩余6条评论

8
值得一提的是生产故事。EM和大多数Rack软件一样,都有充足的测试和监控工具可用,并且经过了良好的测试,而Node.js在这方面明显缺乏。目前为止,似乎几乎不可能从Node中获得清晰的指标来回答类似“我需要扩展吗”的问题。Joyent等公司正在推出各种选项,也可以自己编写工具,但仍没有像NewRelic这样的工具。从性能/可配置性的角度来看,Node.js非常出色,但就个人而言,我暂时不会将其用于生产环境。

3

Node.js

使用 Node.js,您可以更好地控制底层内容。 您可以包含通用库来构建在 Node.js 之上,以调整您的抽象级别以满足自己的喜好。例如,您可以使用 connect 或 express,具体取决于您是否需要为您编写视图引擎。您可以使用 socket.io 或现在,具体取决于您想要多少客户端 - 服务器连接抽象化。您可以选择包含任何数量的 MVC 库或编写自己的库。

Event-Machine

这是一个异步 IO 库,与 Node.js 类似。

这取决于 Ruby vs JavaScript 的偏好,以及您想要多少灵活性和抽象化,以及您是否想将 Node 用作实际的 Web 服务器。


5
不,你没有获得整个RoR堆栈,你不知道自己在说什么。Ruby on Rails是一个用Ruby构建的Web框架,EventMachine是一个用Ruby构建的异步库。它们唯一共同之处就是使用了Ruby语言。EventMachine和Node.js相似。 - alessioalex
7
@alessioalex,您是正确的,我不知道我在说什么。 - Raynos

-2

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

[] 如果您准备学习和尝试更多,那么 node.js 将是更好的选择,因为:

  • 它的线程机制非常棒(受 'erlang' 启发)

  • 您可以轻松构建特定于目的的服务器,这将真正提高生产力


3
你能解释一下你所说的“更好”是什么意思吗? - SpaceGhost

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