j w*_*ill 4 asynchronous ruby-on-rails netty playframework-2.0 vert.x
tl; dr许多Rails应用程序或一个Vertx/Play!应用程序吗?
我一直在与我的团队的其他成员讨论使用异步应用服务器(例如Play)的优缺点!框架(基于Netty)与旋转Rails应用服务器的多个实例.
我知道Netty是异步/非阻塞的,这意味着在数据库查询,网络请求或类似的异步调用期间,事件循环线程将允许事件循环线程从被阻止的请求切换到另一个准备好处理/服务的请求.这将使CPU保持忙碌而不是阻塞和等待.
我赞成或使用像Play这样的东西!框架或Vertx.io,非阻塞的东西......可扩展.另一方面,我的团队成员说你可以通过使用Rails应用程序的多个实例获得相同的好处,这些应用程序开箱即用只带有一个线程并且没有真正的并发性,就像JVM上的应用程序一样.他们说只是使用足够的应用实例来匹配一个Play的性能!应用程序(或者我们使用的Play!应用程序),当Rails应用程序阻止操作系统将切换到不同的Rails应用程序.最后,他们说CPU将执行相同数量的工作,我们将获得相同的性能.
所以这是我的问题:
这两种方法都可以而且有效.因此,如果转换会产生很高的开发成本和/或时间表,那么它可能不值得努力...... 当成本变得无法接受时,请进行切换.考虑使用微服务作为渐进式切换策略.
如果您处于开发周期的早期阶段,那么尽早进行切换可能有意义.重写是一种痛苦.
或者也许你永远不必切换和rails将适用于你的用例,如魅力.而且你已经非常成功地让你的客户感到高兴,现金正在滚滚而来.
阻塞单服务器方法的一些缺点:
增加内存使用量.来源:多个进程,内存泄漏,缺少共享数据结构(这会增加通信成本并带来一致性问题).
缺乏并行性.这有两个结果:更多的盒子和更多的延迟.您可能需要更大的盒子数来处理相同的负载.因此,如果您需要扩展并有资金问题,那么这可能是一个问题.如果它不是一个问题,那么无关紧要.在服务器中,这意味着增加了延迟,这种延迟无法通过增加流程来提高,这可能是一个杀手级的参数,具体取决于您的应用程序.
从rails到node.js和golang进行这种切换的人的一些例子:
LinkedIn移离轨节点:27台服务器切和高达20倍的速度更快:http://highscalability.com/blog/2012/10/4/linkedin-moved-from-rails-to-node-27-servers-cut-和先进的2.HTML
为什么Timehop选择取代我们的Rails应用程序:https://medium.com/building-timehop/why-timehop-chose-go-to-replace-our-rails-app-2855ea1912d
我们如何将我们的API从Ruby转移到Go并保存我们的理智:http://blog.parse.com/learn/how-we-moved-our-api-from-ruby-to-go-and-saved-our-神智/
我们如何从30台服务器转到2台:去:http://www.iron.io/blog/2013/03/how-we-went-from-30-servers-to-2-go.html
这些帖子代表了可能说明您的小组正在经历的内容的论据.遗憾的是,这一决定并不明显.
这取决于你正在建设的性质,你的团队的性质,资源的性质,你的技能的性质,你的目标的性质以及你如何重视所有不同的权衡.
成本真的会下降吗?无论服务器数量多少,计算量都不一样吗?
取决于正在进行的工作的类型和规模.通常,Web服务是IO绑定的,等待来自其他服务(如数据库,缓存等)的响应.
如果您使用的是单线程服务器,那么IO上的进程会被阻塞很多,所以它不会做很多事情.相比之下,非阻塞服务器将能够在单线程服务器被阻止时处理许多请求.您可以继续添加进程,但只有一台计算机可以运行这么多进程.非阻塞服务器可以具有相同数量的进程,同时保持CPU尽可能处理请求.在使用非阻塞服务器时,通常可以在更便宜的小型机器上处理更高的负载.
如果您的预期请求率可以通过可接受数量的方框来处理,并且您不希望出现巨大的峰值,那么单线程服务器就可以了.非阻塞服务器非常适合吸收负载峰值而无需添加计算机.
如果您的工作是响应延迟并不重要,那么您可以使用更少的节点.
如果你的工作负载是CPU绑定的,那么你无论如何都需要更多的盒子,因为没有相同的并行机会,因为服务器不会阻塞IO.
归档时间: |
|
查看次数: |
734 次 |
最近记录: |