异步应用服务器与多个阻止服务器

时间:2015-08-20 03:12:09

标签: ruby-on-rails asynchronous playframework-2.0 netty vert.x

tl; dr许多Rails应用程序或一个Vertx / Play!应用?

我一直在和我的团队的其他成员讨论使用异步应用服务器(如Play)的优缺点!框架(基于Netty)与旋转Rails应用服务器的多个实例。

我知道Netty是异步/非阻塞的,这意味着在数据库查询,网络请求或类似异步调用期间将允许事件循环线程从被阻止的请求切换到另一个准备好处理/提供的请求。这将使CPU保持忙碌而不是阻塞和等待。

我赞成或使用像Play这样的东西!框架或Vertx.io,非阻塞的东西......可扩展。另一方面,我的团队成员说你可以通过使用Rails应用程序的多个实例获得相同的好处,这些应用程序开箱即用,只有一个线程并且没有真正的并发性,就像JVM上的应用程序一样。他们说只是使用足够的应用实例来匹配一个Play的性能!应用程序(或者我们使用的Play!应用程序),当Rails应用程序阻止操作系统将切换到不同的Rails应用程序。最后,他们说CPU将完成相同的工作量,我们将获得相同的性能。

所以这是我的问题:

  • 上述论点中是否存在任何逻辑谬误?操作系统是否会管理Rails应用程序实例以及Netty(它还在JVM上运行,它可以很好地将线程映射到内核)在其事件循环中管理请求?
  • 操作系统是否会像Netty或Vertx那样开启阻塞调用,甚至是基于Ruby自己的EventMachine构建的东西?
  • 有足够的Rails应用实例来匹配性能Play!应用程序,运行服务器会有成本明显的成本差异吗?如果没有成本差异,在我看来,使用什么方法并不重要。拍摄,如果它在财务上更便宜地运行一百万个Rails应用程序而不是一个Play! app我宁愿这样做。
  • 使用这些方法有哪些其他好处我可能没有提出来?

1 个答案:

答案 0 :(得分:8)

这两种方法都可以而且有效。因此,如果转换会产生很高的开发成本和/或时间表,那么它可能不值得努力......当成本变得无法接受时,请进行切换。考虑使用微服务作为渐进式切换策略。

如果您处于开发周期的早期阶段,那么提早切换可能是有意义的。重写是一种痛苦。

或许或许你永远不必切换和rails会像你的魅力一样适用于你的用例。而且,您已经非常成功地让客户感到高兴,因为现金正在流入。

阻止单服务器方法的一些缺点:

  • 内存使用量增加。来源:多个进程,内存泄漏,缺少共享数据结构(这会增加通信成本并带来一致性问题)。

  • 缺乏并行性。这有两个结果:更多框和更多延迟。您可能需要更大的盒子数来处理相同的负载。因此,如果您需要扩展并有资金问题,那么这可能是一个问题。如果它不是一个问题,那么它并不重要。在服务器中,这意味着延迟增加,延迟类型可以通过增加流程来改善,这可能是一个杀手级的参数,具体取决于您的应用程序。

那些从rails切换到node.js和golang的人的一些例子:

这些帖子代表的参数可能说明了您的小组正在经历的事情。遗憾的是,这个决定并不明显。

这取决于你所建立的性质,团队的性质,资源的性质,技能的本质,目标的性质以及你如何重视所有不同的权衡。

成本真的会下降吗?无论服务器数量多少,都不会完成相同的计算量吗?

取决于正在进行的工作的类型和规模。通常,Web服务是IO绑定的,等待来自其他服务(如数据库,缓存等)的响应。

如果您使用的是单线程服务器,那么IO上的进程会被阻止很多,所以它什么也没做。相比之下,非阻塞服务器将能够在单线程服务器被阻止时处理许多请求。您可以继续添加进程,但只有一台计算机可以运行这么多进程。非阻塞服务器可以具有相同数量的进程,同时保持CPU尽可能处理请求。在使用非阻塞服务器时,通常可以在更便宜的小型机器上处理更高的负载。

如果您的预期请求率可以通过可接受数量的方框来处理,并且您不会期望巨大的峰值,那么单线程服务器就可以了。非阻塞服务器非常适合吸收负载峰值而无需添加计算机。

如果你的工作是这样的,响应延迟并不重要,那么你可以用更少的节点来完成。

如果您的工作负载受CPU限制,那么您无论如何都需要更多的盒子,因为并行机会不会是相同的,因为服务器不会阻止IO。