为什么rails不能完全支持将编写好的代码写出框外

时间:2013-05-22 16:31:00

标签: ruby-on-rails-3 node.js eventmachine

在Node.js问世之后,普及编程就是一件事。 但是,Ruby确实有EventMachine支持编写事件代码。

支持铁轨事件的要求是:
1.运行电抗器的平稳服务器(薄,彩虹) 2. Fibers(Ruby 1.9.3)为了使编写事件代码更容易,否则我们可以使用线程 3.所有宝石都会事件化(例如mysql2)。

Nodejs展示了即兴编程的明显优势。那么为什么rails社区不采用eventmachine?我认为rails不能完全移植到eventmachine的原因之一是因为依赖于可能没有被触发的底层gem。但有人知道是否有计划朝这个方向迈进?

Rails可以做Nodej所做的事情,但是Nodejs最初是通过在所有库制造商上提倡优化编程来开始的,所以按照惯例,你在节点中添加到package.json的大多数依赖项,你知道它会被解决并且可以使用nodejs开箱即用。

1 个答案:

答案 0 :(得分:15)

最大的原因是Rails生态系统不是为事件IO构建的,并且在您的应用程序中引入单个非事件IO可以消除这些优势。在Ruby(和Rails)中编写事件代码是非常可能的,但它不一定是直截了当的,因为当宝石执行或不执行事件IO时并不总是很清楚,并且开发人员需要花费大量时间追逐应用程序可能阻塞的位置。相比之下,Node的创建具有IO永远不应该是同步的隐含理想,并且它的整个生态系统已经从理想中流出,这意味着开发人员不必担心他们的IO操作是否会同步或不;默认情况下,它们是异步的。

此外,只有在受IO限制时,优化的Web应用程序才真正有用。如果您的应用程序受CPU限制,或正在进行繁重的同步CPU工作,那么无论如何,一个事件模型可能不是正确的方法。 Ruby可能需要大量的CPU,这主要是由于语言的元编程构造和垃圾收集器(它应该在Ruby 2.1中大幅改进!),这可能使它不如Node更适合于编程。

Rails有许多可用的并发模型 - 分叉,抢占式线程和事件 - 并且开发人员可以选择最适合其应用程序域的并发模型。分叉是默认的,因为它很容易,不需要任何特殊考虑(只要你在POSIX系统上部署!),并且在创建Rails时Ruby没有系统线程。现在,使用Ruby 1.9+(系统线程,GIL)和JRuby(没有GIL!),线程代码非常易于部署。 Ruby 2.0带来了一个COW友好的垃圾收集器,这意味着分叉也比以前更有效。

在一天结束时,事件代码不是默认代码,因为它需要开发人员的更多工作,对于许多人来说,默认分叉模型已经足够了。如果不是,开发人员可以选择线程或事件代码,最适合他们的基础架构和应用程序域。