EventMachine vs Node.js

我要开发一个协作网站,其中一个function将是实时更改的协作编辑。 即当两个或两个以上的用户正在编辑相同的文档时,他们可以看到彼此的变化,一旦发生。 我有一些Ruby on Rails的经验,所以我在考虑使用EventMachine,但是在Node.js的所有这些炒作,我知道考虑使用它。 那么,使用Node.js而不是EventMachine的主要好处是什么呢?

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

EventMachine与Rails无关,都是用相同的语言编写的。 您可以像Node.js一样获得EventMachine; 所有你需要做的不是添加库到你的项目。 根据我的经验,EventMachine库(比如em-http)比Node的任何东西都好。 你可以使用光纤,而不是callback,以避免callback地狱。 由于所有的callback,完全的exception处理在Node中几乎是不可能的。 加上Ruby比Javascript更好,更完整的语言。

我倾向于“使用你所知道的”(即使它是一个更重的build筑)。 正因为如此,我没有看到它像“EventMachine vs NodeJS”一样简单。 主要的区别可以概括为:

  • NodeJS是一个框架/语言,被编写来处理基于JavaScript的事件编程。 这是它的动力。 这不是一个过时的想法或第三方机制。 它的烘烤正确的语言。 您创buildcallback/事件,因为这是如何build立语言。 这不是第三方插件,也不会改变您的工作stream程。
  • EventMachine是Ruby中的一个gem,它使开发人员能够使用基于事件的编程模型的一些优点。 它被大量使用和testing,但不直接在语言中烘焙。 两者都被locking在一个CPU上,但是在Nodes核心的事件编程中,它仍然有一个起作用。 Ruby并没有考虑到并发性。

这就是说,技术问题是可以克服的。 应该指导你的决定的更重要的问题(从我的观点来看)是:

  • 你的生产环境是什么样的? 你有完全的控制服务器? 你可以托pipe吗? 还是将它放在一个共享系统上,然后你需要扩展呢?
  • 你们团队中的所有开发人员是否都有能力非常快地学习新的语言? 他们能够以多快的速度了解中间层的基于事件的JavaScript语言?
  • 你需要Rails给你的所有架构(完整的testing框架,脚手架,模型,控制器等)吗? 还是那个矫枉过正?

这两者之间有很多技术上的差异。 一个是语言,一个是框架。 真的,你想运行多大的堆栈? 你的开发人员需要做多less学习? 你想要一个完整的堆栈给你很多细节,你可能不会使用,或者你想要一个运行得非常快速和并发的裸骨架,即使你可能不得不编写额外的锅炉代码和学习新的lanugage?

虽然Rails没有一些Web应用程序体系结构那样沉重,但是您仍然需要比在NodeJS中处理相似吞吐量更多的处理器能力。 假定两个系统的质量代码。 写在任何一个堆栈上的错误代码都会阻止堆栈闪烁。 这真的是下降了 – 你真的想要学习一种全新的做法,或利用你现在对Ruby的理解来快速地完成任务吗?

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

值得一提的是生产故事。 与大多数机架的东西一样,EM也有大量的testing和监控工具可供使用,而Node.js在这方面却差很多。

在撰写本文时,从Node得到清晰的度量标准似乎几乎不可能回答“我需要缩放”这样的问题。 从Joyent等人那里可以find一些select,而且总是有自己的争论,但是没有任何地方靠近NewRelic这样的工具。

从性能/可configuration性的观点来看,Node.js是非常好的,但个人而言,我不会在生产环境中托pipe它。

Node.js的

您可以更好地控制对进行中的低级别控制。您可以包括通用库,以便在node.js之上构build,以便根据自己的喜好调整抽象级别。 例如,你可以使用连接或expression,取决于你是否想为你写一个视图引擎。 您可以使用socket.io或现在,取决于您希望您的客户端 – 服务器连接被抽象多less。 您可以select包含任何众多的MVC库或编写自己的。

事件机

一个asynchronousIO库,就像node.js一样

这归结于Ruby与JavaScript的偏好,您想要抽象或缺less抽象的多less灵活性,以及​​是否要将节点用作实际的Web服务器。

已经提出了一个详细的混淆视图……只是个人的看法

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

  • 它的线程机制非常棒(从“erlang”的灵感来源)

  • 你可以build立一个特定目的服务器(很容易),这将是真正的生产力