17

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

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

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

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

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

4

10 回答 10

52

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

  1. 您的应用程序比 MySpace 更受欢迎;或者
  2. 您正试图使用​​它在您控制的两个非常健谈的组件之间进行通信,这是一个糟糕的可怕设计选择。

仅用于在 Web 前端场中分配如此多负载的交换硬件将花费数千美元。

首先编写一个每秒可以处理 50 个请求的 Web 服务(语言选择不是很重要)。如果您的应用程序太忙以至于您经常超过该阈值,您可以聘请专人全职解决扩展问题,而不必在免费问答网站上寻求帮助。

于 2009-02-18T17:46:55.390 回答
30

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

  1. 选择您(可能还有其他团队成员)最喜欢的语言。我更喜欢高级语言,因为硬件既快又便宜,但程序员又慢又贵。
  2. 将您的服务设计为绝对无状态(无会话!)。这使得添加新硬件变得容易,因为您的服务的不同实例不需要相互了解。
  3. 异步处理您的处理,幸运的是您不需要给客户端任何响应(除了 OK)。如果您同步执行此操作,您的进程将阻塞并且您的请求率将下降。这篇维基百科文章很好读,尤其是(经典!)C10K 问题
  4. 将服务放在多台机器上。(取决于您的服务速度)
  5. 将您的数据库服务器放在除 web-services 之外的其他机器上。使用快速磁盘!
  6. 通过使用以下方式平衡负载来处理负载
    • Linux Virtual Server是性能最高的解决方案,因为它在内核中运行。像疯了一样的鳞片。我在 2003 年以 ~500req/sec 的速度在 P3/1GHz 上使用它,CPU 负载为 0.1%。可以配对实现HA。应该在单台机器上很好地处理 10000req/sec。尝试更简单的方法后执行此操作。这可能非常具有挑战性。2018 年更新:如今它已集成到主线内核中,因此所有发行版都应将其作为一个包。
    • Nginx,配置简单,性能非常好。可以做SSL。也可以充当 HTTP-Server,并且可能是您服务的高性能托管解决方案。
    • Varnish,一个可以处理多个后端的 HTTP 缓存。非常可配置,但不能做 SSL,所以如果你想加密你的流量,你需要一个 Nginx 在它前面。
    • ,很容易设置,但开销很大。好的起点。可以做SSL。自 2011 年以来项目已终止。
    • Perlbal,没用过,但听说不错。自 2013 年以来项目已终止。
    • 或其他反向代理
于 2009-03-10T08:45:59.003 回答
15

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

于 2009-02-18T17:51:40.307 回答
11

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

希望这可以帮助

于 2009-02-18T19:29:24.783 回答
5

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

假设您的每台机器都有 4 个 Xeon 六核、32GB RAM、一个快速磁盘阵列和一个高度优化的写入数据库,您就可以做到。虽然,每台服务器的成本可能在 $35K 到 $40K 之间。

无论如何,您的瓶颈不会出现在 C# 或 Java 上。取决于数据库服务器的增长量,它将与数据库服务器一起使用。就我而言,它大约是 300GB,每天删除 10GB 并添加 10GB。

于 2009-02-24T04:57:25.080 回答
5

以这样的速度,由于您无论如何都在破坏 HTTP(没有响应),您不妨开发自己的服务器,或修改开源服务器。

全部用 C 或 C++ 编写,你会尽可能快地燃烧起来。

可扩展性不仅受语言选择的影响。

-亚当

于 2009-02-24T03:45:43.710 回答
3

让我们看看问题:

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

数据:SOAP?XML?您将希望最小化任何不必要的 CPU 周期。简单地使用 JSON 有什么问题?(并且没有神圣的规定说基于 REST 架构的服务器不能在协议中使用二进制数据......)

内容:如果涉及任何数据转换(例如从文本到数字),您还需要考虑哪种语言提供最有效的机制。例如,在 Java 中(顺便说一句,这对你来说是一个非常强大的候选者),String 类是一个严重的 CPU 消耗。

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

于 2009-05-09T14:50:48.087 回答
2

您可以通过 CGI(通用网关接口)真正使用任何语言,因此它归结为性能。在您列出的语言中,我希望 C# 最快。语言之间速度的一个很好的比较是语言枪战

如果您真的需要性能,您可能希望使用更面向性能的语言(如 C 或 D)来处理请求。

这完全取决于每个请求必须真正执行什么样的计算。

于 2009-02-18T17:51:06.143 回答
0

您需要一种类似 C 的语言,并且为了避免编写完整的服务器,我建议使用 CGI(无论如何,这都是 php 等都运行的)Windows 服务器提供 ISAPI 插件,但这些插件在服务器的上下文中运行,因此内存泄漏和GPF 将关闭服务器。再加上每次更改时停止/启动服务器的不便,CGI/FastCGI 看起来更好。

于 2009-02-24T04:22:18.083 回答
0

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

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

当收到请求时,它们会被推送到其他机器上的队列中,然后将它们取出并放入 HBase/Voldemort 存储中。

正如我所说,它的意思是“一劳永逸”的网络服务

于 2009-02-18T18:03:09.797 回答