我们正在设置一个Python REST Web应用程序。现在,我们正在使用WSGI,但我们可能会在未来对其进行一些更改(例如,使用Twisted来改进可伸缩性或其他功能)。我真的希望得到一些关于Python中Web应用程序的良好架构的帮助。
一般来说,我们的应用程序提供动态内容,处理来自客户端的中等到高级别的数据,执行相当高需求的数据库,网络和文件系统调用,并且应该“轻松”扩展(引用此处是因为如果解决方案很好但是有点难以配置可扩展性,它肯定会被认为是好的)。我们可能希望在中长期内将其演变为高度并行的应用程序。 Google App Engine 不是一个公认的建议,主要是因为它的成本。
我的问题是:
对此有任何帮助将非常感激。非常感谢!
答案 0 :(得分:5)
WSGI应用程序很好,这主要是后端问题和数据处理问题,在我看来,这是更多架构部分发挥作用的地方。我会考虑使用Celery(http://celeryproject.org/)进行工作分配和后端扩展。 Twisted是一个不错的选择,但看起来你已经编写了这个部分用作WSGI应用程序,所以我只想用Celery扩展它。
我不知道你的项目范围,但我会考虑到Celery的设计。
我希望我的前端端点是WSGI(因为你已经写好了)并编写后端以通过消息分发。然后,您将拥有一个后端节点池,可以从Celery队列中提取消息并完成所需的工作。它看起来有点像:
Apache - > WSGI容器 - >芹菜消息队列 - >芹菜工人。
apache节点将在某种负载均衡器后面。这将是一个相当简单的扩展架构,如果正确完成,则相当可靠。在这样的系统中失败的代码,你会没事的。
答案 1 :(得分:2)
您可以考虑使用gevent和zeromq(或任何其他“mq”,我只有zeromq经验)。它很容易启动多个gevent进程,让他们在zeromq之间进行交谈。你可以把它们放在负载均衡器后面,nginx可以作为负载均衡器使用,你也可以使用nginx来提供静态文件。
使用gevent,您可以使用Werkzeug和webob等“低级”Web框架,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