我应该为我的高性能 Web 服务选择哪种编程语言? [关闭]
Posted
技术标签:
【中文标题】我应该为我的高性能 Web 服务选择哪种编程语言? [关闭]【英文标题】:Which programming language should I choose for my high performance webservice? [closed] 【发布时间】:2010-10-08 09:44:52 【问题描述】:我正在为我的应用程序构建 Web 服务 API。 另外,我计划通过 REST 和 SOAP 公开服务。
我有兴趣从社区获得一些关于我应该选择哪种编程语言来实现服务的反馈? (我知道 C#、Java 和 Ruby - RoR 足以创建服务)。
该服务主要是一个 HTTP POST 服务。 它需要处理大约 2000 个并发连接,并且每秒能够处理大约 10,000 个 HTTP POST。 (对于 SOAP,我们将有一个提交方法供客户端调用)。
对于 POST 请求,服务不会向客户端返回任何响应。
关于应该使用哪种编程语言/架构有什么想法吗?
【问题讨论】:
它根本不发送任何响应?甚至没有 HTTP 200? 你至少应该回复:HTTP/1.0 204 No Response 如果您问自己这是否真的是合理数量的连接和请求,请考虑用于移动应用程序的传感器网络或 API。 【参考方案1】:每秒 10,000 个请求是每月 250 亿次点击。这意味着两件事之一:
-
您的应用程序比 MySpace 更受欢迎;或
您正试图使用它在您控制的两个非常健谈的组件之间进行通信,这是一个
仅使用切换硬件来将这么多负载分配到一个 Web 前端场就将花费数千美元。
首先编写一个每秒可以处理 50 个请求的 Web 服务(语言选择不是很重要)。如果您的应用程序非常繁忙,以至于您经常超过这个门槛,那么您可以聘请专人全职解决扩展问题,而不必在免费问答网站上寻求帮助。
【讨论】:
Jon Skeet 可以。 Chuck norris 不接受请求;他下达命令。 Chuck Norris 不接受请求;他把它们从你身上撕下来。 我认为他的问题的重点只是确定哪种语言可能更适合如此大容量的服务(答案可能是没关系,硬件将是一个更大的问题)。无论哪种方式,您都无需在回答 Rex 时刻薄。 在某些情况下,您每秒可能会收到 10K 个请求,但时间很短,例如实时投票系统。 99% 几乎没有流量。【参考方案2】:根据我以前的经验,我可以给你以下建议。
-
选择您(可能还有其他团队成员)最喜欢的语言。我更喜欢高级语言,因为硬件既快又便宜,但程序员又慢又贵。
将您的服务设计为绝对无状态(无会话!)。这使得添加新硬件变得容易,因为您的服务的不同实例不需要相互了解。
异步处理您的处理,幸运的是您不需要给客户端任何响应(除了 OK)。如果您同步执行此操作,您的进程将阻塞并且您的请求率将下降。值得一读的是this Wikipedia article,尤其是(经典!)The C10K problem。
将服务放在多台机器上。(取决于您的服务的速度)
将您的数据库服务器放在网络服务以外的其他机器上。使用快速磁盘!
通过平衡来处理负载:
Linux Virtual Server,性能最高的解决方案,因为它在内核中运行。像疯了一样的鳞片。我在 2003 年以 ~500req/sec 的速度在 P3/1GHz 上使用它,CPU 负载为 0.1%。可以配对实现HA。应该在单台机器上很好地处理 10000req/sec。尝试更简单的方法后执行此操作。这可能非常具有挑战性。 2018 年更新:如今,它已集成到主线内核中,因此所有发行版都应将其作为一个包。
nginx,配置简单,性能非常好。可以做SSL。也可以充当 HTTP-Server,并且可能是您的服务的高性能托管解决方案。
Varnish,一个可以处理多个后端的 HTTP 缓存。非常可配置,但无法使用 SSL,因此如果您想加密流量,则需要在其前面安装 Nginx。
【讨论】:
【参考方案3】:每秒有 10,000 个帖子,语言是您最不必担心的问题。更大的问题是服务器场和网络的设计。我假设您不打算在单个机器上运行它?
【讨论】:
【参考方案4】:高度可扩展、可靠、分布式且使用多核/多处理器系统的应用程序?在这里,我立即将 Erlang/OTP 与 Yaws 一起视为 Web 应用程序服务器。 Yaws 在极高负载下运行极其稳定和快速。而 Erlang/OTP 作为平台是为并发和分发而设计的,以及一些有助于开发稳定软件的机制。代价:函数式编程语言的并发导向与 Java 或 C# 没有 OOP,语法看起来很奇怪(但一旦你采用它就非常直接和强大),第三方库的数量没有那么大至于主流语言。但这是值得的。
希望对你有帮助
mue
【讨论】:
【参考方案5】:按照这个速度,既然你无论如何都在破坏 HTTP(没有响应),你不妨开发自己的服务器,或者修改一个开源服务器。
全部用 C 或 C++ 编写,您会以最快的速度学习。
不过,可扩展性不仅仅受语言选择的影响。
-亚当
【讨论】:
【参考方案6】:我可以看到每个月从一台机器上获得 10 亿个帖子。我有一个用 c# 编写的 Web 服务,目前每天处理大约 350 万个帖子。 Web 服务器以 3% 的 CPU 利用率运行。这意味着我可以将它推至少 20 倍...
假设您的每台机器都有 4 个 Xeon 六核、32GB 内存、一个快速磁盘阵列和一个高度优化的写入数据库,您可以做到这一点。虽然,每台服务器的成本可能在 $35K 到 $40K 之间。
无论如何,您的瓶颈不会出现在 C# 或 Java 上。取决于数据库服务器的增长量,它将与数据库服务器一起使用。就我而言,它大约是 300GB,每天删除 10GB 并添加 10GB。
【讨论】:
【参考方案7】:让我们看看问题:
IO:这很容易成为您系统中最大的瓶颈。选择一种语言,它可以提供与主机操作系统的最佳集成,并为非阻塞提供高级语义,并可选择支持并发。
数据:SOAP? XML?您将希望最小化任何不必要的 CPU 周期。简单地使用 JSON 有什么问题? (并且没有神圣的规定说基于 REST 架构的服务器不能在协议中使用二进制数据......)
内容:如果涉及任何数据转换(例如从文本到数字),您还需要考虑哪种语言提供最有效的机制。例如,在 Java 中(顺便说一句,这对你来说是一个非常强大的候选者),String 类是一个严重的 CPU 消耗。
Java 和 Erlang 是非常好的候选者。 C 始终是一种选择,但并发编程要困难得多。
【讨论】:
【参考方案8】:您可以通过 CGI(通用网关接口)真正使用任何语言,因此它归结为性能。在您列出的语言中,我希望 C# 最快。语言之间速度的一个很好的比较是The Language Shootout
如果您真的需要性能,您可能希望转向更注重性能的语言(例如 C 或 D)来处理请求。
这完全取决于每个请求真正执行的计算类型。
【讨论】:
CGI 是一个非常糟糕的选择,因为它在实际处理中增加了生成进程的成本(可能非常高)。我最近努力将 CGI 架构移植到永远在内存中的架构。早期原型表明性能提高了 10-100 倍! 好吧,你在浪费时间,看看 FastCGI(当我简单地说“CGI”时,这是我所要强调的)。 FastCGI 的设计意图是您的 CGI 应用程序永远不会重新生成,而是无限期地留在内存中。所以不,产生一个进程不会有任何开销。 ;-)【参考方案9】:更新:它的本意是让 Web 服务火上浇油。我想我会发回一个简单的 HTTP 200/OK 响应
不,这不打算在单个盒子上运行。它打算在几个盒子上运行(比如 3-4 个)。
当收到请求时,它们会被推送到其他机器上的队列中,然后将它们取出并放入 HBase/Voldemort 存储中。
正如我所说,它的意思是“一劳永逸”的网络服务
【讨论】:
您应该编辑您的问题以将其包括在内作为澄清,或直接对答案发表评论。这不是留言板。 没有办法用 3-4 台机器每秒处理那么多请求。祝你好运! “3-4 个盒子”在单台机器上仍然是每秒 2500-3300 个请求。那是不现实的。 @Rex M:在 1999 年,单台机器每秒可以处理 10000 个请求。看看:kegel.com/c10k.html【参考方案10】:您需要一种类似 C 的语言,并且为了避免编写完整的服务器,我建议使用 CGI(无论如何,这都是 php 之类的东西) Windows 服务器提供 ISAPI 插件,但这些插件在服务器的上下文中运行,因此内存泄漏和 GPF 将关闭服务器。再加上每次更改时停止/启动服务器的不便,CGI/FastCGI 看起来更好。
【讨论】:
以上是关于我应该为我的高性能 Web 服务选择哪种编程语言? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章