经过多年的桌面应用程序开发后,我正在构建我的第一个Web应用程序(我正在使用Django / Python,但这可能是一个完全通用的问题,我不确定)。所以请注意 - 这可能是一个超新手的问题......
我的一个用户进程涉及服务器中的繁重处理(即用户输入内容,服务器需要约10分钟来处理它)。在桌面应用程序上,我会做的是将用户输入放入受互斥锁保护的队列中,并使用该互斥锁在队列中以低优先级阻塞运行专用后台线程。
然而,在Web应用程序中,一切似乎都面向与HTTP请求的同步。
假设我将数据库用作我的队列,运行后台进程的最佳实践架构是什么?
答案 0 :(得分:7)
有两种思想流派(至少)。
将工作放在队列中,并在Web堆栈外面处理其他内容。
将工作放在队列中,并在Web堆栈中处理其他内容。
在任何一种情况下,您都可以在某个队列中创建工作单元(例如数据库表),并让某些进程处理它们。
我通常使用数字1,我有专门的Windows服务来处理这些事情。您也可以使用SQL作业或类似的东西来执行此操作。
第2项的优点是,您可以更轻松地将所有代码保存在一个位置 - 在Web层中。您仍然需要触发执行的东西(例如,加载处理具有足够高超时的工作单元的网页),但这可以通过各种机制轻松完成。
答案 1 :(得分:2)
自:
1)这是一个常见的问题,
2)你是平台的新手
- 我建议您查看为您的平台提供的库,以找到处理任务的解决方案。除了排队和处理作业外,您还需要考虑:
1)工作者和Web堆栈之间的状态通信。这将使网页显示作业的完整百分比,确保人员工作正在进行等。
2)如何确保工人流程不会死亡。
3)如果作业有错误,工作进程是否会自动定期重试? 如果工作失败,您或操作人员会收到通知吗?
4)随着工作岗位数量的增加,可以增加额外的工作人员以获得并行性吗? 或者,更好的是,可以将工作人员添加到其他服务器上吗?
如果你在Django / Python中找不到一个好的解决方案,你也可以考虑将另一个平台的解决方案移植到你的平台上。我将delayed_job用于Ruby on Rails。工作进程由runit管理。
此致
拉里
答案 2 :(得分:1)
一般来说,我会考虑在不同的服务器上运行后台进程,尤其是当您的Web服务器有任何负载时。
答案 3 :(得分:0)
在Django中运行长进程:http://iraniweb.com/blog/?p=56