选择一个异步应用程序服务器还是多阻塞服务器?

Jonathan Willis,白天是软件开发者,晚上是超级英雄,有人通过Twitter在StackOverflow上向他提了一个有趣的问题:

许多Rails应用程序或者只一个Vertx Play! 应用程序? 我一直在和我团队的其他成员讨论关于使用一个异步应用服务器,比如Play! Framework(建立在Netty上),相比于一个Rails应用程序服务器多实例旋转的优缺点。我知道Netty是异步/非阻塞的,意味着在一个数据区查询操作中,网络请求或者其他一些类似的东西,一个异步调用就将会允许事件循环线程从阻塞请求转换到另一个已准备好的请求去处理/服务。这将会使CPU繁忙运转而不是阻塞和等待。 我认为要赞同或者使用一些如Play!Framework 或者Vertx.io,以及一些非阻塞的…可伸缩的。在另一方面,我的团队的成员认为你可以通过使用一个Rails应用程序的多个实例来获得同样的好处,它只能有一个线程,并且没有真正的并发应用程序作用在JVM上,只要使用足够的App实例来匹配一个Play!应用的性能(或者即使我们使用多个Play!应用程序),当一个Rails应用程序阻塞了,操作系统将把流程转换至一个不同的Rails应用程序。最后,他们说CPU们将会做相同的工作量并且我们将会得到相同的性能。

你怎么认为?市场似乎改变了,以node.js、Golang、Akka甚至Java形式改变为异步服务器模式。这是否意味着这是唯一一种正确的方法?

我尝试如此回应:

两种方式都可以工作。所以,如果转换会造成高开发成本并且/或者产生进度冲突,那么这将是不值得的。当成本高得无法接受时做出转换,还是想想使用微服务逐步转换策略吧。

如果你在你开发周期的早期使用转换,那么转换会显得很有意义,重写是非常痛苦的。

或者你从来不需要转换,Rails将为你使用用例工作,它极具魅力。并且你一直如此成功地让你的客户高兴那么现金就会滚滚而来。

一个单机阻塞服务器方式的缺点:

  • 增加了内存的使用。来源:多进程、内存泄露、缺乏共享的数据结构(这增加了通信成本以及带来一致性问题);
  • 缺乏并行性。这将带来两个后果:更多的盒子和更多的延迟。你可能需要一个更大的盒子来装载同样的负载。所以如果你需要规模化则需要有更多相关资金,那么这可能是个问题。如果不打算这么做则没什么问题。在服务器中这意味着增加了延迟,延迟排序将不能通过乘法提高,这可能取决于你的应用程序会使参数作废。

以下是一些使用了这些从Rails到Node.js和Golang的转换的例子:

  • LinkedIn Moved From Rails To Node: 27 Servers Cut And Up To 20x Faster
  • Why Timehop Chose Go to Replace Our Rails App
  • How We Moved Our API From Ruby to Go and Saved Our Sanity
  • How We Went from 30 Servers to 2: Go

这些文章代表的观点可能是说明你的团队正在经历着。不幸的是,这个决定并不是显而易见的。

这取决于你所构建的本质、你团队的本质、你资源的本质、你技能的本质、你目标的本质以及你如何评估你的交易。

成本真的会下降吗?不管服务器数量做不相同的计算量?这取决于完成的工作量的类型和规模。典型的Web服务是IO绑定,等待来自其他服务器如数据库、缓存等的响应。

如果你使用单线程服务器进程在IO会有大量阻塞,所以这等于什么也没做。相比之下,非阻塞服务器将能够处理相当多的请求当单进程服务器正阻塞着。你可以不断增加进程,但是只有一台机器可以运转如此多进程。一个非阻塞服务器有相同数量的进程,同时可以保持CPU尽可能忙于处理进程请求。使用非阻塞服务器通常可以在更小更便宜的机子上处理更高负载。

如果你希望请求速率可以保持在可接受范围内盒子的数量,并且不希望巨大峰值,那么你就可以使用单线程服务器。非阻塞服务器在吸收负峰载量值而不需要增加机器表现很好。

如果延迟响应并不真正影响到你的工作,那么你可以使用较少的节点。

如果你的工作量是CPU绑定的,那么你至少将需要更多盒子,因为服务器不会在IO阻塞,对于平行那不会有相同的机会。

原文链接:Ask HighScalability: Choose An Async App Server Or Multiple Blocking Servers?(译者/王苇棋 审核/朱正贵、wendy 责编/仲浩)

译者简介:王苇棋,硕士毕业于香港浸会大学,关注数据挖掘和信息安全。

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2015-09-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DevOps时代的专栏

软件测试金字塔

? “测试金字塔”是一个隐喻,它告诉我们将软件测试分成不同颗粒度的桶,也给出了我们应该在这些组中进行多少次测试的想法。尽管测试金字塔的概念已经存在了一段时间,...

5155

来亲自试一试NoSQL

针对Web开发人员,DBA,程序员,本文介绍了NoSQL数据库的基本概念,不同类型及其特性。

2123
来自专栏张善友的专栏

复合事件处理(Complex Event Processing)介绍

近年来,面向服务架构 SOA一直是热门的议题。面向服务架构SOA 使用了比组件、程序(procedure)层次更高的服务做为处理单元,通过开放格式交换标准例如X...

3047
来自专栏SeanCheney的专栏

《这就是搜索引擎》爬虫部分摘抄总结

首先从互联网页面中精心选择一部分网页,以这些网页的链接地址作为种子URL,将这些种子URL放入待抓取URL队列中,爬虫从待抓取URL队列依次读取,并将URL通过...

1424
来自专栏数据之美

浅谈用户行为分析之用户身份识别:cookie 知多少?

对于数据统计分析或者数据挖掘而言,用户是个非常重要的维度,也是统计分析能落地的基础。一般而言,咱们追踪或者识别一个用户的首选方案是 userID,大多数公司的产...

1.2K6
来自专栏Java架构师学习

多研究些架构,少谈些框架——一名阿里架构师的笔记

微服务架构和SOA区别 微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为...

3848
来自专栏云计算教程系列

什么是不可变的基础设施?

在传统的可变服务器基础架构中,服务器会不断更新和修改。使用此类基础架构的工程师和管理员可以通过SSH连接到他们的服务器,手动升级或降级软件包,逐个服务器地调整配...

1920
来自专栏智能计算时代

「云计算」什么是不可变的基础设施?

在传统的可变服务器基础架构中,服务器会不断更新和修改。使用此类基础架构的工程师和管理员可以通过SSH连接到他们的服务器,手动升级或降级软件包,逐个服务器地调整配...

1573
来自专栏IT技术精选文摘

分布式存储理论与实践初探 (一)

硬件基础 分布式存储系统是运行在通用计算机硬件体系结构上的底层系统,熟悉各种硬件的性能,能帮助我们更好的调整架构,最大限度地发挥硬件的价值。 基础参数 常见硬件...

2685
来自专栏nothing

2018 年,Unity 带来了新的 ECS

Unity3D 带来的 ECS 曾经广受诟病。 在之前的这个版本中,Unity 做出了以编辑器为中心,数据驱动的开发框架。从此策划可以直接在编辑器中开发新的关卡...

8338

扫码关注云+社区

领取腾讯云代金券