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

use*_*614 9 python

我需要构建一个计算密集型的Web服务,并且我试图了解如何最好地继续进行.

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

谢谢.

S.L*_*ott 6

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

是.选一个.Django也很好.

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

几乎从不.

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

疑.

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

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

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

  3. 如果您选择聪明的后端处理组件(如芹菜),您应该能够将"实际工作"分配给最少数量的处理器以完成工作.

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

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

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

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

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


Rob*_*vey 1

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

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