如何构建计算密集型Web服务?

时间:2010-08-09 22:56:33

标签: python

我需要构建一个计算密集型的Web服务,并且我正在努力研究如何最好地继续进行。

我希望用户能够连接到我的服务,此时一些计算会在一段时间内完成,通常少于60秒。用户知道他们需要等待,所以这不是一个真正的问题。我的问题是,构建这样的服务的最佳方法是什么,让我头疼最少?我可以使用Node.js,web.py,CherryPy等吗?如果使用,我是否需要坐在这些部件前面的负载平衡器?我不期望大量的用户,可能数百或成千上万。当然,我需要一些机器来容纳这么多用户,但这对我来说是一个未知的领域,如果有人可以给我一些指示或要阅读的内容,那就太棒了。

感谢。

4 个答案:

答案 0 :(得分:6)

  

我可以使用Node.js,web.py,CherryPy等吗?

是。选一个。 Django也很好。

  

如果使用,我是否需要坐在这些部件前面的负载平衡器?

几乎没有。

  

我需要多台机器来托管这么多用户,

疑。

请记住,每个Web事务都有几个不同的(几乎不相关的)部分。

  1. 前端(Apache HTTPD或NGINX或类似)接受初始Web请求。它可以处理提供的静态文件(.CSS,.JS,图像等),因此您的主Web应用程序可以通过它实现整洁。

  2. mod_wsgi这样效率相当高的中间件可以管理数十(或数百)个后端进程。

  3. 如果您选择一个聪明的后端处理组件,如celery,您应该能够将“实际工作”分配到最少数量的处理器以完成工作。

  4. 结果通过mod_wsgi反馈到Apache HTTPD(或NGINX)到用户的浏览器。

  5. 现在后端进程(由celery管理)与基本Web服务器分离。您通过Apache HTTPD和mod_wsgi以及celery实现了大量的并行性,允许您使用每一块处理器资源。

    此外,您可以将“计算密集型”流程分解为并行流程 - Unix流水线非常高效并且可以利用所有可用资源。您必须将问题分解为step1 | step2 | step3并使芹菜管理这些管道。

    您可能会发现这种分解导致服务的工作量远远超出您的想象。

    许多Python Web框架将用户的会话信息保存在单个公共数据库中。这意味着您的所有后端都可以 - 无需任何实际工作 - 将用户的会话从Web服务器移动到Web服务器,从而无缝且自动地实现“负载平衡”。只是有很多HTTPD / NGINX前端产生Django(或web.py或其他)共享一个共同的数据库。它运作得非常好。

答案 1 :(得分:1)

我认为你可以随心所欲地构建它,只要你能使它成为异步服务,这样用户就不必等待。

当然,除非用户不介意在这种情况下等待。

答案 2 :(得分:1)

我建议使用nginx,因为它可以处理重写/ balancing / ssl等,而且操作最少

答案 3 :(得分:0)

如果您想让您的网络服务异步,您可以尝试Twisted。它是面向异步任务的框架,并实现了如此多的网络协议。通过xml-rpc提供这些服务非常容易(只需将xmlrpc_作为方法的前缀)。另一方面,它可以与成千上万的用户进行非常好的扩展。

Celery也是使大多数计算密集型任务异步的好选择。它与Django很好地集成。