1

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

队列最好保存在磁盘上,这样排队的未处理任务就不会因为断电、服务器重启等而丢失。问题是什么是实现这种队列的合理方法

至于我尝试过的事情:我从简单的 SQLite 数据库和用于存储队列项目的单个表开始。在负载测试中,当提高并发级别时,正如预期的那样,我开始收到“数据库锁定”错误。快速的解决方法是用 MySQL 替换 SQLite——它可以很好地处理并发问题,但对于我需要做的简单事情来说感觉有点矫枉过正。与队列相关的数据库操作也在我的分析报告中突出显示。

4

2 回答 2

1

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

管道可能如下:

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

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

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

于 2010-03-12T14:39:19.823 回答
0

Web 服务器(任何 Web 服务器)是多生产者、单消费者进程。

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

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

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

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

于 2010-03-12T14:39:43.333 回答