10

经过多年的桌面应用程序开发,我正在构建我的第一个 Web 应用程序(我正在使用 Django/Python,但也许这是一个完全通用的问题,我不确定)。所以请注意 - 这可能是一个超新手的问题......

我的用户进程之一涉及服务器中的繁重处理(即用户输入某些内容,服务器需要约 10 分钟来处理它)。在桌面应用程序上,我会将用户输入扔到受互斥锁保护的队列中,并使用该互斥锁在队列上以低优先级阻塞运行专用后台线程。

然而,在 Web 应用程序中,一切似乎都面向与 HTTP 请求同步。

假设我将使用数据库作为队列,运行后台进程的最佳实践架构是什么?

4

4 回答 4

7

对此(至少)有两种思想流派。

  1. 将工作放在队列中,让您的网络堆栈之外的其他东西处理它。

  2. 将工作放在队列中,并在您的 Web 堆栈中处理它。

在任何一种情况下,您都在某处(例如数据库表)的队列中创建工作单元,并让某些进程处理它们。

我通常使用 1 号,我有一个专门的 Windows 服务来处理这些事情。您也可以使用 SQL 作业或类似的东西来做到这一点。

第 2 项的优点是您可以更轻松地将所有代码保存在一个位置 - 在 Web 层中。您仍然需要一些触发执行的东西(例如加载处理具有足够高超时的工作单元的网页),但这可以通过各种机制轻松完成。

于 2009-05-10T02:44:43.873 回答
2

自从:

1)这是一个常见的问题,

2) 您是平台新手

-- 我建议您查看为您的平台提供的库,以找到处理任务的解决方案。除了排队和处理作业之外,您还需要考虑:

1)worker和web-stack之间的状态通信。这将启用显示工作完成百分比的网页,向人们保证工作正在进行等。

2)如何保证worker进程不死。

3)如果一个job有错误,worker进程会不会定期自动重试?如果作业失败,您或操作人员会收到通知吗?

4)随着工作数量的增加,是否可以添加额外的工作人员以获得并行性?或者,更好的是,可以在其他服务器上添加工作人员吗?

如果您在 Django/Python 中找不到好的解决方案,您也可以考虑将解决方案从另一个平台移植到您的平台。我为 Ruby on Rails 使用了延迟工作。工作进程由 runit 管理。

问候,

拉里

于 2009-05-10T03:06:48.733 回答
1

一般来说,我会考虑在不同的服务器上运行后台进程,特别是如果您的 Web 服务器有任何类型的负载。

于 2009-05-10T02:42:51.383 回答
0

在 Django 中运行长进程:http: //iraniweb.com/blog/ ?p=56

于 2009-08-14T19:41:02.670 回答