Web服务有很多连接

时间:2009-02-08 12:26:58

标签: mysql web-services

我正计划开发一个必须具有高度可扩展性的Web服务,以便处理许多并发连接,可能是数千个。该服务将充当API。它必须高度响应,请求和回复之间的延迟3秒被认为太多了。

也许服务可以在许多内部服务器之间分配,负载平衡网关充当流量管理,因此服务的实际处理不会占用网关服务器。我正在考虑使用Amazon EC2,但我也可以使用一系列内部服务器,只要我能找到它们的好用途。数据库可能是MySQL(除非你有更好的想法)。

我意识到最好的解决方案是开发自己的网络服务器,但是我需要花费太多时间,而且我怀疑自己能比其他一些我不了解的网络服务器做得更好。

另外,我目前正在尝试在持久连接之间做出决定,但我可能会坚持使用后者。

那么,是否有关于良好,可扩展的解决方案的任何建议?

3 个答案:

答案 0 :(得分:3)

我不同意开发自己的网络服务器是“最佳解决方案”。使用存在的。您不应该只是为了部署Web服务而编写服务器。

.NET和Java EE都提供了创建和部署Web服务的方法。您没有说您选择哪种语言,但您当然可以在Java EE中编写Web服务并将其部署在Tomcat上,而无需编写自定义Web服务器。

就负载均衡而言,F5是一个很好的硬件解决方案,如果你负担得起的话。

答案 1 :(得分:3)

您没有提到协议。如果您使用RESTful方法,这是一个非常容易编写的代码。如果使用SOAP方法,则更复杂。

Apache + FastCGI会这样做,但你的服务将是一个CGI程序。你将不得不用C或C ++写,这可能是令人不愉快的。你可以使用Apache + mod_wsgi加上一个Python框架;它不是那么快,但它会非常快,你不必写很多代码。

Glassfish会这样做,你可以用Java编写。

商业产品(如Sun的JCAPS)将会这样做。

有许多Web服务框架 - 发明自己的框架不是一个好主意。

修改“MaxClients”问题。

Web服务请求应该很快 - 它是一个资源 - 您从缓存或数据库中获取它并进行响应。限制因素不是MaxClients - 它可以成功共存的线程和它的套接字协商。

如果您的GET请求是幂等的,则可以将它们缓存在squid(或其他一些反向代理服务器)中。你可以拥有大量的这些。请注意,使用反向代理服务器与您的Web服务本身无关;然而,它与整体吞吐量有关。

答案 2 :(得分:1)

Amazon EC2运行良好,但不以0.10美元的实例定价 - 它们的功能非常不足。我建议至少从c1.mediums开始。我喜欢在m1.small的c1.medium web服务器实例的前面使用nginx实例作为负载平衡(我最近构建的所有应用程序都是CPU绑定的而不是内存限制的。)

3秒很长一段时间。我通常使用200ms-400ms来达到性能目标。当然,这取决于您的应用程序的时间敏感程度以及需要完成的工作量。

如果要完成3秒钟的工作,您可能会有一个后端网格预处理数据。然后,您可能需要更少的Web服务器,因为它们主要返回预制数据。

如果我在你的鞋子里,我会用我最熟悉的语言/平台构建原型。然后你就可以知道你需要把它带到哪里。

不要忘记构建高性能Web应用程序需要时间。您需要编码,基准测试,重复调整以及缩短响应时间。

您需要编写自己的网络服务器的实例数量非常少。这不是其中的一个。有很多可供选择。假设基于nix的平台,您可以使用Apache,nginx或lighttpd。还有很多其他的,但它们通常用作app服务器(tomcat,zope,mongrel等),并在它们前面有apache / nginx / lighttpd / squid代理。

我还没有真正使用现成的平台(解决方案)来构建Web应用程序(我假设您的意思是某种Java堆栈或.Net堆栈)。我真的无法帮助你。我使用的大多数工具(LAMP类型的东西)都是组件化的,并允许在每个堆栈中放弃替换。增长一个组件并且必须用另一个组件替换它并不罕见。

例如,没有负载均衡器 - >软件负载均衡器 - >能够缓冲的软件负载平衡器 - >硬件负载均衡器。所有这些都具有不同规模的成本效益。