这是一个一般性设计问题,涉及如何创建一个 Web 应用程序,该应用程序将接收大量上传的数据、处理数据并返回结果,而所有这些都不会出现 5 分钟可怕的旋转沙滩球或可能的 HTTP 超时。
这是要求:
- 制作一个网络表单,您可以在其中上传包含 URL 列表的 CSV 文件
- 当用户单击“提交”时,服务器会获取文件,并检查每个 URL 以查看其是否有效以及页面的标题标签是什么。
- 结果是一个可下载的 CSV 文件,其中包含 URL 和结果 HTTP 代码
- 输入 CSV 可能非常大(> 100000 行),因此获取过程可能需要 5-30 分钟。
到目前为止,我的解决方案是在客户端站点上有一个旋转的 JavaScript 循环,它每秒查询服务器以确定作业的总体进度。这对我来说似乎很笨拙,我犹豫是否接受这是最好的解决方案。
我正在使用 Perl、模板工具包和 jquery,但使用任何 Web 技术的任何解决方案都是可以接受的。
edit:可能的解决方案的一个例子是这个问题:如何实现基本的“长轮询”? https://stackoverflow.com/questions/333664/simple-long-polling-example-code
您可以使用 AJAX 来完成此操作,但使用类似 COMET 的实现可能会获得更好的实时结果。我相信 COMET 实现是专门为解决一些超时限制而设计的,但我没有使用过任何超时限制,所以我无法提供直接指南。
无论哪种方式,我的建议都是在工作到达服务器后将工作移交给另一个进程。
对于这种性质的批处理任务,我已经采用了多种不同的解决方案,而我最喜欢的解决方案是将批处理工作移交给另一个进程。在这样的系统中,上传页面将工作交给单独的处理器,并立即返回,并提供用户监控流程的指令。
批处理器可以通过多种方式实现:
- fork 并将子进程与 IO 分离以完成批处理。父级完成网络请求。
- 将上传内容保存到处理队列(例如:文件系统上的文件、数据库中的记录)并让 Web 服务器通知外部处理器 - 可以是自定义守护进程,也可以是现成的调度程序,例如 *nix 的“at”系统。
然后,您可以为用户提供多种监控流程的方法:
- 上传确认页面包含批处理过程的同步实时监控(通过 COMET 或 Flash)。完成后,确认页面可以引导用户进行下载。
- 与上面类似,但监视器不是实时的,而是通过 AJAX 或页面元刷新使用定期轮询
- 队列监视器页面向他们显示正在运行的任何批处理进程的状态。
批处理器可以通过多种方法传达其状态:
- 更新数据库中的一条记录
- 生成处理日志
- 使用命名管道
将代码交给另一个进程有很多好处:
- 当用户意外停止浏览器时,该过程将继续。
- 使用外部进程迫使您以允许您随时分离和重新连接监视器的方式传达批次状态。例如:当用户在流程完成之前意外离开页面时。
- 如果您决定需要将批处理分散到网络流量较低的时段进行,那么实施批处理限制和推迟会更容易。
- 您不必担心网络超时(无论是客户端还是服务器端)。
- 您可以重新启动 Web 服务器,而不必担心是否会中断批处理过程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)