【发布时间】:2015-11-13 13:07:07
【问题描述】:
tl;dr 许多 Rails 应用程序或一个 Vertx/Play!应用?
我一直在与团队的其他成员讨论使用 Play 等异步应用服务器的利弊!框架(基于 Netty 构建)与启动 Rails 应用服务器的多个实例。
我知道 Netty 是异步/非阻塞的,这意味着在数据库查询、网络请求或类似的异步调用期间,事件循环线程将允许事件循环线程从阻塞请求切换到准备好处理/服务的另一个请求.这将使 CPU 保持忙碌而不是阻塞和等待。
我赞成或使用诸如 Play 之类的东西!框架或 Vertx.io,非阻塞的东西......可扩展。另一方面,我的团队成员说,您可以通过使用 Rails 应用程序的多个实例来获得相同的好处,开箱即用的 Rails 应用程序只有一个线程,并且不像 JVM 上的应用程序那样具有真正的并发性.他们说只要使用足够的应用程序实例来匹配一个 Play 的性能!应用程序(或我们使用的许多 Play! 应用程序),并且当 Rails 应用程序阻塞时,操作系统会将进程切换到不同的 Rails 应用程序。最后,他们说 CPU 将执行相同数量的工作,而我们将获得相同的性能。
所以这是我的问题:
- 上述论点是否存在逻辑谬误?操作系统是否会管理 Rails 应用实例,以及 Netty(也运行在 JVM 上,可以很好地将线程映射到内核)在其事件循环中管理请求?
- 操作系统是否会像 Netty 或 Vertx 之类的系统,甚至是基于 Ruby 自己的 EventMachine 构建的系统一样,在开启阻塞调用方面表现出色?
- 有足够的 Rails 应用实例来匹配性能 Play!应用程序,运行服务器是否会有明显的成本差异?在我看来,如果没有成本差异,那么使用哪种方法并不重要。如果运行一百万个 Rails 应用程序比运行一个 Play 更便宜,那就试试吧!应用程序我宁愿这样做。
- 使用这两种方法中的任何一种我可能没有问到的其他好处是什么?
【问题讨论】:
标签: ruby-on-rails asynchronous playframework-2.0 netty vert.x