管理长时间运行的异步作业时的最佳做法


12

我处于项目的设计阶段,最终用户将从网页提交请求,该请求将产生长时间运行的异步处理作业。是否有针对此问题的“最佳实践”?Web服务和服务代理是一个不错的选择吗?Microsoft消息传递队列在这里适用吗?


如果通过Web进行此操作,并且花费的时间很长,则完成后可以向用户发送文本消息或电子邮件。
Job

Answers:


6

我不知道“最佳实践”。我确实知道最常见的错误。

第一个错误:自己动手做

您可以使用网络处理程序来处理长时间运行的作业。这可能是坏的,也可能是非常坏的,这取决于您成为长期工作的命中百分比,它们运行了多长时间以及获得的持续流量。

您想要确保在完成长时间运行的工作的时间内不会收到超过1个长时间运行的工作。如果您自己执行DOS。如果百分比和时间保持一致,那么您获得的流量越多,情况也会越糟。这是自我限制流量增长的问题之一。

第二个错误:从Webhandler产生

从Web处理程序生成一个进程以处理一个长时间运行的进程可能很棘手,因此也容易出错。

  • 您必须与父母正确分离,否则Web处理程序将等待孩子完成。
  • 当您在Unix中派生一个子代时,它将继承父代的打开句柄。除非将其覆盖,否则它们将自动关闭。这包括数据库连接,文件句柄,其他开放式网络连接之类的内容。当子进程完成时,所有这些都将关闭

选件

我通常使用at(1)干净的方式与Web处理程序分离,而不会分叉。

您还可以通过使用轮询实现cron

您可以与另一个处理该进程的服务器进程进行通信。可以使用socketspipes或更高级别的抽象(例如REST http调用或路由队列消息)进行通信。


2

我想您正在谈论的时间超过几分钟。

如果几分钟,您可以在后台启动工作线程并在UI上显示一些进度。许多Web应用程序都使用该方法。

如果超过5分钟,则可能需要将任务委派给专用服务。一个示例是Google Analytics(分析)生成的报告。

Microsoft消息队列可用于将信息从系统传输到另一个系统,或将组件传输到另一个系统。


像PHP这样的语言是如何做到这一点的?我知道一些网络应用程序可以执行此操作,但都是用PHP编写的
TheLQ 2011年

我不是PHP专家,但是我想不是同一页面启动的线程,而是另一个。这就是AJAX实际发生的情况。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.