Web应用后台流程,新手设计题

Posted

技术标签:

【中文标题】Web应用后台流程,新手设计题【英文标题】:Web application background processes, newbie design question 【发布时间】:2010-10-25 01:55:15 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

一般来说,我会考虑在不同的服务器上运行后台进程,尤其是在您的网络服务器有任何负载的情况下。

【讨论】:

【参考方案2】:

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

    将工作放到队列中,让 Web 堆栈之外的其他东西处理它。

    将工作放入队列中,让您的 Web 堆栈中的其他内容处理它。

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

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

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

【讨论】:

【参考方案3】:

自:

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

2) 您是平台新手

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

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

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

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

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

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

问候,

拉里

【讨论】:

【参考方案4】:

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

【讨论】:

你应该添加关于帖子链接的小注释。

以上是关于Web应用后台流程,新手设计题的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC面试题

web应用后台开发的故事

SpringMVC面试题

SpringMVC面试题

面试题SpringMVC部分面试题

Web前端开发(实习)