许多生产者,使用python / mod_wsgi的单个消费者

时间:2010-03-12 13:21:35

标签: python apache concurrency synchronization producer

我有一个由Apache提供的Pylons Web应用程序(mod_wsgi,prefork)。由于Apache,有多个独立的进程同时运行我的应用程序代码。应用程序执行的一些非关键任务我希望推迟在后台处理以改善“实时”响应时间。所以我在想任务队列,许多Apache进程向这个队列添加任务,一个单独的Python进程逐个处理它们并从队列中删除。

最好将队列保存到磁盘,这样排队的未处理任务不会因断电,重启服务器等而丢失。问题是实现此类队列的合理方法是什么?

至于我尝试过的事情:我开始使用简单的SQLite数据库和单个表来存储队列项。在负载测试中,当增加并发级别时,我开始出现“数据库锁定”错误,正如预期的那样。 quick'n'dirty修复是用MySQL替换SQLite - 它很好地处理并发问题,但对于我需要做的简单事情感觉有点过分。与队列相关的数据库操作也会在我的分析报告中显着显示。

2 个答案:

答案 0 :(得分:1)

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

管道可能如下:

  • 负责处理HTTP请求的应用程序进程会快速生成回复,并将低优先级,繁重的任务发送到AMQ队列。
  • 订阅了一个或多个其他进程以使用AMQ队列并执行与这些繁重任务有关的操作。

队列持久性的要求是开箱即用的,因为ActiveMQ存储了尚未在持久存储中使用的消息。此外,它可以很好地扩展,因为您可以在不同的计算机上自由部署多个HTTP应用程序,多个消费者应用程序和AMQ。

我们在使用STOMP作为底层通信协议的Python编写的项目中使用类似的东西。

答案 1 :(得分:0)

Web服务器(任何Web服务器)都是多生产者,单一消费者流程。

一个简单的解决方案是构建wsgirefWerkzeug后端服务器来处理后端请求。

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

您为此后端设计RESTful事务。您可以使用所有各种WSGI功能进行URI解析,授权,身份验证等。通常 - 您不需要会话管理,因为RESTful服务器通常不提供会话。

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