如何构建计算密集型的网络服务?
我需要建立一个计算量很大的网络服务,现在想弄清楚该怎么做。
我预计用户会连接到我的服务,在这个过程中会进行一些计算,通常不会超过60秒。用户知道需要等待,所以这其实不是个问题。我的问题是,怎样设计这样的服务才能让我少一些麻烦?我可以用Node.js、web.py、CherryPy等工具吗?如果使用这些工具,我需要在它们前面加一个负载均衡器吗?我不指望会有很多用户,可能几百到几千个。为了支持这么多用户,我当然需要几台机器,但这对我来说还是个陌生的领域。如果有人能给我一些建议或者推荐一些阅读材料,那就太好了。
谢谢。
4 个回答
我建议使用nginx,因为它可以很轻松地处理重定向、负载均衡和SSL等功能,操作起来非常简单。
我觉得你可以按照自己的想法来构建这个服务,只要你能让它变成一个异步服务,这样用户就不用一直等待。
当然,如果在这个情况下用户不介意等待,那就另当别论了。
我可以使用 Node.js、web.py、CherryPy 等吗?
可以。你可以选择其中一个。Django 也不错。
如果使用这些工具,我需要在它们前面放一个负载均衡器吗?
几乎不需要。
我需要很多机器来支持这么多用户,
这不太可能。
记住,每次网页请求都有几个不同的部分,几乎没有关系。
前端(比如 Apache HTTPD 或 NGINX 等)接收最初的网页请求。它可以处理静态文件(如 .CSS、.JS、图片等),这样你的主要网页应用就不会被这些东西搞得乱七八糟。
一个效率还不错的中间件,比如 mod_wsgi,可以管理几十个(甚至几百个)后端进程。
如果你选择一个聪明的后端处理组件,比如 celery,你应该能把“真正的工作”分配给最少的处理器来完成任务。
结果通过 mod_wsgi 反馈到 Apache HTTPD(或 NGINX),再传给用户的浏览器。
现在,后端进程(由 celery 管理)和主要的网页服务器是分开的。通过 Apache HTTPD、mod_wsgi 和 celery,你可以实现很高的并行处理,充分利用每一丝处理器资源。
此外,你可能可以把“计算密集型”的过程拆分成多个并行的过程——Unix 管道非常高效,能够利用所有可用资源。你需要把问题拆解成 step1 | step2 | step3
,然后让 celery 管理这些管道。
你会发现,这种拆解方式可以处理比你最初想象的更大的工作量。
许多 Python 网页框架会把用户的会话信息保存在一个公共数据库中。这意味着你所有的后端可以——几乎不需要任何额外工作——在不同的网页服务器之间移动用户的会话,使得“负载均衡”变得无缝且自动。只需要有很多 HTTPD/NGINX 前端,它们启动 Django(或 web.py 或其他),并共享一个公共数据库。这种方式效果非常好。