7

我们正在设置一个 Python REST Web 应用程序。目前,我们正在使用 WSGI,但我们可能会在未来对其进行一些更改(例如,使用 Twisted 来改进可伸缩性或其他一些特性)。我真的想要一些关于什么被认为是 Python 中的 Web 应用程序的良好架构的帮助。

一般来说,我们的应用程序提供动态内容,处理来自客户端的中等到高级别的数据,执行相当高需求的数据库、网络和文件系统调用,并且应该“容易”扩展(这里引用是因为如果一个解决方案很好但有点难以实现为可扩展性配置,它肯定会被认为是好的)。我们可能希望在中长期内将其发展为高度并行的应用程序。Google App Engine不是一个被接受的建议,主要是因为它的成本。

我的问题是这样的:

  1. 使用 WSGI 是个好主意吗?我们应该研究像 Twisted 这样的东西吗?
  2. 我们应该使用 Apache 作为静态文件的反向代理吗?
  3. 是否有一些我没有提到的不同的模式或架构是我们应该考虑的?(即使完全明显)。

对此的任何帮助将不胜感激。非常感谢!

4

2 回答 2

5

A WSGI application will be fine this is mostly a backend question and data processing question, in my opinion as that is where more architectural parts come into play. I would look into using Celery ( http://celeryproject.org/ ) for your work distribution and backend scaling. Twisted would be a good choice, but it appears you already have that portion written for use as a WSGI application so I would just extend it with Celery.

I do not know the scope of your project but I would design it with Celery in mind.

I would have my frontend endpoints be the WSGI (because you already have that written) and write the backend to be distributed via messages. Then you would have a pool of backend nodes that would pull messages off of the Celery queue and complete the required work. It would look sort of like:

Apache -> WSGI Containers -> Celery Message Queue -> Celery Workers.

The apache nodes would be behind a load balancer of some kind. This would be a fairly simple architecture to scale and is, if done correctly, fairly reliable. Code for failure in a system like this and you will be fine.

于 2012-11-05T19:47:02.617 回答
2

您可以考虑使用 gevent 和 zeromq(或任何其他“mq”,我只有 zeromq 的经验)。启动多个 gevent 进程并让它们与 zeromq 对话很容易。你可以把它们放在负载均衡器后面,nginx 可以作为负载均衡器工作,你也可以使用 nginx 来提供静态文件。

此外,通过 gevent,您可以使用 Werkzeug 和 webob 等“低级”网络框架,Werkzeug 是我个人的选择。

Gevent 内置了 WSGI 服务器,它非常快速和稳定,werkzeug 将 WSGI 环境和请求数据转换为漂亮且易于使用的对象。

http://www.gevent.org/
http://werkzeug.pocoo.org/
https://github.com/traviscline/gevent-zeromq

在这里你可以找到一些关于 gevent、zeromq 和其他一些东西的不错的初学者文章。
http://blog.pythonisito.com

读起来也很有趣
https://raw.github.com/strangeloop/2011-slides/master/Lindsay-DistributedGeventZmq.pdf

于 2012-11-05T21:06:31.737 回答