代码之家  ›  专栏  ›  技术社区  ›  Pēteris Caune

许多生产商,使用python/mod wsgi的单一消费者

  •  1
  • Pēteris Caune  · 技术社区  · 15 年前

    我有一个由Apache(mod wsgi,prefork)提供服务的pylons web应用程序。由于Apache,有多个单独的进程同时运行我的应用程序代码。一些非关键任务,我希望应用程序在后台延迟处理,以提高“实时”响应时间。所以我在考虑任务队列,许多Apache进程将任务添加到此队列,一个单独的Python进程逐个处理它们并从队列中删除。

    最好将队列持久化到磁盘,这样队列中未处理的任务不会因为断电、服务器重新启动等而丢失。问题是 实现这种队列的合理方法是什么? ?

    至于我尝试过的事情:我从简单的sqlite数据库开始,在其中存储队列项的单个表。在负载测试中,当并发性级别增加时,我开始像预期的那样得到“数据库锁定”错误。快速修复方法是用mysql替换sqlite——它处理并发问题很好,但对于我需要做的简单的事情来说,感觉像是一个过度杀戮。与队列相关的数据库操作也会在我的分析报告中突出显示。

    2 回复  |  直到 15 年前
        1
  •  1
  •   nkrkv    15 年前

    像Apache这样的消息代理 ActiveMQ 是一个理想的解决方案。

    管道可能如下:

    • 负责处理HTTP请求的应用程序进程快速生成响应,并将低优先级、繁重的任务发送到AMQ队列。
    • 另一个或多个进程订阅以使用AMQ队列,并对这些繁重的任务执行预期的操作。

    队列持久性的要求是开箱即用的,因为ActiveMQ存储尚未在持久性存储中使用的消息。此外,由于您可以自由地在不同的机器上部署多个HTTP应用程序、多个消费者应用程序和AMQ本身,所以它的规模相当大。

    我们在用python编写的项目中使用类似的方法 STOMP 作为底层通信协议。

        2
  •  0
  •   S.Lott    15 年前

    Web服务器(任何Web服务器)都是多生产者、单使用者进程。

    一个简单的解决方案是 wsgiref Werkzeug 用于处理后端请求的后端服务器。

    因为这个“后端”服务器是使用wsgi技术构建的,所以它非常非常类似于前端Web服务器。除了。它不会产生HTML响应(JSON通常更简单)。除此之外,这很简单。

    为此后端设计了RESTful事务。您使用所有不同的WSGi特性进行URI解析、授权、身份验证等。通常,您不需要会话管理,因为RESTful服务器通常不提供会话。

    如果遇到严重的可伸缩性问题,只需将后端服务器包装在lighttpd或其他一些Web引擎中,即可创建多线程后端。