我应该为我的高性能Web服务选择哪种编程语言?

时间:2009-02-18 17:36:22

标签: performance web-services architecture scalability programming-languages

我正在为我的应用程序构建Web服务API。 另外,我计划通过REST和SOAP公开服务。

我有兴趣从社区获得一些关于我应该选择哪种编程语言来实现服务的反馈? (我知道C#,Java和Ruby - RoR足以创建服务)。

该服务主要是HTTP POST服务。 它需要处理大约2000个并发连接,并且每秒能够处理大约10,000个HTTP POST。 (对于SOAP,我们将有一个提交方法供客户端调用)。

对于POST请求,服务不会向客户端返回任何响应。

关于应该使用哪种编程语言/架构的任何想法?

10 个答案:

答案 0 :(得分:51)

每秒10,000个请求是每月250亿次点击。这意味着两件事之一:

  1. 您的应用程序比MySpace更受欢迎;或
  2. 您正在尝试使用此功能在您控制的两个非常聊天组件之间进行通信,这是可怕的设计选择。
  3. 单独切换硬件以在网络前端群中分配大量负载将花费数千美元。

    首先编写一个每秒可处理50个请求的Web服务(语言选择不是很重要)。如果您的应用程序非常繁忙以至于您定期超过该阈值,您可以雇佣某人全职处理扩展问题,而无需在免费的Q& A网站上寻求帮助。

答案 1 :(得分:27)

根据我以前的经验,我可以给你以下建议。

  1. 选择您(以及可能的其他团队成员)最喜欢的语言。我更喜欢更高级别的语言,因为硬件快速且便宜,但程序员速度慢而且价格昂贵。
  2. 将您的服务设计为绝对无状态(无会话!)。这样可以轻松添加新硬件,因为您的服务的不同实例不需要彼此了解。
  3. 异步处理,因为幸运的是,无需向客户端提供任何响应(OK除外)。如果您同步执行此操作,您的流程将会阻止,您的请求率将会下降。好的阅读是this Wikipedia article,特别是(经典!) The C10K problem
  4. 将服务放在多台计算机上。(取决于服务的速度)
  5. 将您的数据库服务器放在除Web服务之外的其他计算机上。使用快速磁盘!
  6. 通过以下方式平衡来处理负载:
    • Linux Virtual Server,性能最佳的解决方案,因为它在内核中运行。像疯了一样的秤。我使用它2003年,在P3 / 1GHz上具有~500req / sec,CPU负载为0.1%。可以配对以实现HA。应该在一台机器上很好地处理10000req / sec。在尝试更简单的事情之后这样做。这可能非常具有挑战性。更新2018:现在这已集成到主线内核中,因此所有发行版都应该将其作为一个包。
    • Nginx,配置简单,性能非常高。可以做SSL。也可以充当HTTP服务器,可能是您服务的高性能托管解决方案。
    • Varnish,一个可以处理多个后端的HTTP缓存。非常可配置但无法执行SSL,因此如果您想加密流量,则需要在其前面使用Nginx。
    • Pound,非常容易设置,但开销很高。好起点。可以做SSL。自2011年以来项目已经死亡。
    • Perlbal,没有使用它,但听到了好消息。自2013年以来项目已经死亡。
    • 或其他reverse proxys

答案 2 :(得分:13)

每秒10,000个帖子,语言是您最不担心的。更大的问题是您的服务器场和网络的设计。我假设你不打算在一个盒子上运行它?

答案 3 :(得分:11)

高度可扩展的应用程序,可靠,分布式以及使用多核/多处理器系统?在这里,我立即将Erlang / OTP与Yaws一起视为Web应用程序服务器。雅司在极高负荷下运行极其稳定和快速。 Erlang / OTP作为平台,旨在实现并发和分发,以及一些有助于开发稳定软件的机制。成本:使用函数式编程语言的并发性方向不是使用Java或C#的OOP,语法看起来很奇怪(但是一旦你采用它就非常直接和强大),并且第三方库的数量不是很大至于主流语言。但这是值得的。

希望这有帮助

mue

答案 4 :(得分:5)

按照这个速度,既然你无论如何都要打破HTTP(没有响应),你也可以开发自己的服务器,或修改开源服务器。

用C或C ++全部写下来,你会尽可能快地开始。

可伸缩性受到的不仅仅是语言选择的影响。

- 亚当

答案 5 :(得分:4)

我可以看到每台机器每月获得10亿个帖子。我有一个用c#编写的Web服务,目前每天处理大约350万个帖子。 Web服务器以3%的CPU利用率运行。这意味着我可以将其推至少20倍......

假设您的每台计算机都有4个Xeon Six核心,32GB RAM,一个快速磁盘阵列和一个高度优化的写入数据库,您可以这样做。虽然,每台服务器的成本可能在35,000美元到40,000美元之间。

无论如何,你的瓶颈不会是C#或Java。数据库服务器取决于它的增长程度。在我的情况下,大约300GB,删除10GB,每天增加10GB。

答案 6 :(得分:3)

让我们看看问题:

IO:这很容易成为系统中最大的瓶颈。选择一种与主机操作系统提供最佳集成的语言,并为非阻塞提供高级语义,并可选择支持并发。

数据:SOAP? XML?您需要最小化任何不必要的cpu​​周期。简单地使用JSon有什么问题? (而且没有神圣的命令说基于REST架构的服务器不能在协议中使用二进制数据......)

内容:如果涉及任何数据转换(例如从文本转换为数字),您还需要考虑哪种语言提供最有效的机制。作为一个例子,在Java(这是一个非常强大的候选人,顺便说一下),String类是一个严重的CPU占用。

Java和Erlang是非常好的候选人。 C始终是一个选项,但并发编程要困难得多。

答案 7 :(得分:2)

您可以通过CGI(通用网关接口)真正使用任何语言,因此它取决于性能。在您列出的语言中,我希望C#最快。语言速度的良好比较是The Language Shootout

如果您确实需要性能,您可能需要朝着更加性能导向的语言(如C或D)的方向来处理请求。

这完全取决于每个请求必须执行的计算类型。

答案 8 :(得分:0)

更新:它意味着一场火灾,忘记了网络服务。我想我会发回一个简单的HTTP 200 / OK响应

不,这不是打算在一个盒子上运行。它打算在几个盒子上运行(比如3-4)。

当收到请求时,它们被推送到其他机器上的队列,然后被带到HBase / Voldemort商店。

正如我所说,它意味着成为一个“即发即忘”的网络服务

答案 9 :(得分:0)

你需要一个C llike语言,并避免编写一个完整的服务器,我会建议CGI(这是什么PHP等都贯穿始终) Windows服务器提供ISAPI插件,但这些插件在服务器的上下文中运行,因此内存泄漏,GPF将关闭服务器。再加上每次更改内容时停止/启动服务器的不便,CGI / FastCGI看起来更好。