【问题标题】:Architecture solution for Python Web applicationPython Web 应用的架构解决方案
【发布时间】:2012-11-05 19:25:22
【问题描述】:

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

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

我的问题是这样的:

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

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

【问题讨论】:

  • 如果您投票结束问题,请评论原因。写这个问题的人显然下了很大功夫。
  • 您绝对应该将 WSGI 用于 Python 中与 Web 相关的任何内容——它只是一组用于应用程序与服务器通信的协议。 Twisted 和所有其他框架都可以运行 WSGI 应用程序。
  • 我希望我可以发表反对关闭投票。

标签: python rest web-applications


【解决方案1】:

WSGI 应用程序会很好,这主要是后端问题和数据处理问题,在我看来,这是更多架构部分发挥作用的地方。我会考虑使用 Celery (http://celeryproject.org/) 进行工作分配和后端扩展。 Twisted 将是一个不错的选择,但您似乎已经编写了该部分以用作 WSGI 应用程序,因此我将使用 Celery 对其进行扩展。

我不知道你的项目的范围,但我会在设计时考虑到 Celery。

我会让我的前端端点是 WSGI(因为你已经写好了)并编写后端以通过消息分发。然后,您将拥有一个后端节点池,这些节点将从 Celery 队列中提取消息并完成所需的工作。它看起来有点像:

Apache -> WSGI 容器 -> Celery 消息队列 -> Celery Workers。

Apache 节点将位于某种负载均衡器的后面。这将是一个相当简单的扩展架构,如果做得正确,相当可靠。像这样的系统中的失败代码,你会没事的。

【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2015-07-27
      相关资源
      最近更新 更多