AJAX:如何在网络应用程序中获取进度反馈,并避免长请求超时?

2024-01-13

这是一个一般性设计问题,涉及如何创建一个 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(使用前将#替换为@)

AJAX:如何在网络应用程序中获取进度反馈,并避免长请求超时? 的相关文章

  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • jQuery 对象相等

    如何确定两个 jQuery 对象是否相等 我希望能够在数组中搜索特定的 jQuery 对象 inArray jqobj my array 1 alert deviceTypeRoot deviceTypeRoot False alert d
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型
  • jQuery - 如何检查元素是否存在?

    我知道你可以测试width or height 但是如果元素的 display 属性设置为 none 该怎么办 还有什么其他值可以检查以确保该元素存在 您可以使用length http api jquery com length 查看您的选
  • 如何更改 ModelForm 中所有 Django 日期字段的默认小部件?

    给定一组典型模型 Application A from django db import models class TypicalModelA models Model the date models DateField Applicati
  • 单击时更改 CSS 属性

    我试图在单击另一个元素时更改一个元素的 CSS 我进行了很多搜索 但没有任何效果是完美的 目前我正在使用下面的代码 但它不起作用 谁能告诉我我错过了什么 div hello world div img src zoom png functi
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • 滑块下的 jQuery UI 滑块标签

    我仅限于使用 jQuery 1 4 2 和 jQuery ui 1 8 5 这不是我的选择 请不要要求我升级到最新版本 我创建了一个滑块 显示滑动条上方的当前值 但我现在需要的是一种在滑动条下方填充图例的方法 其距离与滑块相同 即 如果滑块
  • 用于动态字符计数的 Jasmine 单元测试用例

    任何人都可以给我编写测试用例的例子来检查是否 jquery 和 jasmine 中调用 keyup 事件中的函数 我对 jquery 和 jasmine 相当陌生 所以对这些错误感到抱歉 当用户在输入字段中输入字符时 该程序显示剩余的字符数
  • 当悬停时不透明度发生变化时,Google Chrome 中的背景会发生变化

    我使用 Jquery 设置了悬停效果 可以更改悬停元素的不透明度 它在所有最新的浏览器中都能正常工作 除了 Chrome 它会改变 body 元素的背景 这是链接 http wrong ro tataia http wrong ro tat
  • 在 ExtUtils::MakeMaker 下调用 gcc -pthread

    指定编译和链接的正确方法是什么 pthread not lpthread 在 Makefile PL 中 据我了解 应该调用 gcc pthread针对 pthread 进行构建时 因为此标志会扩展为正确的特定于平台的标志以进行编译和链接
  • Highstock highcharts 不规则数据的 x 尺度错误

    我有不规则的数据 我使用时图表绘制得很好高图表 function var chart new Highcharts Chart chart renderTo chart xAxis type datetime series name Vol
  • jQuery $(ui.draggable).remove() 不适用于 IE

    我可以让 IE 删除对象 只要它不是当前的可拖动对象 这适用于 Chrome 和 Firefox 我做错了什么吗 ul li class dropme One li li class dropme Two li ul div div
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • Jquery:如何隐藏或关闭所有打开的引导工具提示

    这样我就可以从我的验证函数中显示引导工具提示 var options html true placement bottom title div class tooltip alert alert danger message div inp
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 使用 jQuery 修改 HTML 表格的结构

    我有一个元素列表 X在以下示例中 显示在 HTML 表格的行或列中 从 HTML 代码的角度来看 我有 水平显示 table tr td A td td B td td C td tr table 或 垂直显示 table tr td A
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • FullCalendar 检查选择日是否有活动?

    我正在使用 Full Calendar js 插件 到目前为止一切顺利 但我想检查开始和结束之间的选择是否有事件 我只需要返回 true 或 false 基本上 如果日期选择中已经存在事件 我想阻止用户创建事件 var calendar c

随机推荐