代码之家  ›  专栏  ›  技术社区  ›  Rahul Vats

Ajax:如何在Web应用程序中获得进度反馈,并避免长时间请求超时?

  •  3
  • Rahul Vats  · 技术社区  · 15 年前

    这是一个关于如何使一个Web应用程序接收大量上传的数据、处理它并返回结果的一般设计问题,所有这些都没有可怕的旋转沙滩球5分钟或可能的HTTP超时。

    要求如下:

    • 创建一个Web表单,您可以在其中上载包含URL列表的csv文件
    • 当用户单击“提交”时,服务器将提取文件,并检查每个URL,以查看其是否活动,以及页面的标题标记是什么。
    • 结果是一个包含URL和结果http代码的可下载csv文件
    • 输入csv可能非常大(>100000行),因此提取过程可能需要5-30分钟。

    到目前为止,我的解决方案是在客户机站点上建立一个旋转的javascript循环,该循环每秒查询服务器以确定作业的总体进度。在我看来,这似乎有些笨拙,我不愿意接受这是最好的解决方案。

    我使用的是Perl、模板工具包和jQuery,但是任何使用任何Web技术的解决方案都是可以接受的。

    编辑: 在这个问题中有一个可能的解决方案示例: How do I implement basic "Long Polling"?

    3 回复  |  直到 8 年前
        1
  •  3
  •   benrifkah    15 年前

    使用Ajax可以做到这一点,但使用类似Comet的实现可以获得更好的实时结果。我相信Comet实现是专门为解决一些超时限制而设计的,但是我没有使用任何方法,所以我不能提供直接的指导。

    不管是哪种方式,我的建议是在工作到达服务器后将它移交给另一个进程。

    我已经为这种性质的批处理任务工作了许多不同的解决方案,我最喜欢的解决方案是将批处理工作移交给另一个流程。在这样一个系统中,上传页面将工作移交给一个单独的处理器,并立即返回给用户,让用户监控进程。

    批处理处理器可以通过以下几种方式实现:

    • 从IO中派生并分离子项以完成批处理。父级完成Web请求。
    • 将上载内容保存到处理队列(例如:文件系统上的文件、数据库中的记录),并让Web服务器通知外部处理器-自定义守护程序或现成的调度程序(如用于*nix系统的“at”)。

    然后,您可以为用户提供多种方法来监视流程:

    • 上载确认页面包含批处理过程的同步实时监视器(通过Comet或Flash)。完成后,确认页面可以引导用户下载。
    • 和上面一样,但是监视器不是活动的,而是通过Ajax或页面元刷新使用定期轮询
    • 一个队列监视器页面,向他们显示他们正在运行的任何批处理进程的状态。

    批处理程序可以通过多种方法通信其状态:

    • 更新数据库中的记录
    • 生成处理日志
    • 使用命名管道

    将代码移交给另一个进程有很多好处:

    • 当用户意外停止浏览器时,进程将继续。
    • 使用外部进程将强制您以允许您分离监视器并随时重新连接的方式来通信批处理状态。例如:当用户在流程完成之前意外地离开页面时。
    • 如果您决定在Web流量较低的时间内分散批处理,则更容易实现批处理限制和延迟。
    • 您不必担心Web超时(客户端或服务器端)。
    • 您可以重新启动Web服务器,而不必担心是否中断了批处理过程。
        2
  •  1
  •   Gutzofter    15 年前

    最简单的方法是批处理,甚至是流化作业。如果您将其视为页面上的数据表。如果表中有10万条记录,您是否可以一次请求所有记录。我会这样做:

    1. 发送下载文件的请求。

    2. 发送请求以处理100( 任意数字 记录。

      a.过程记录。

      b.保存到临时csv文件。

      c.回复状态为 完成 / 不完全 过程。

      如果状态是 不完全 重复第二步。

        3
  •  0
  •   slfan Narendra    8 年前

    您提到客户机不能被信任,所以我建议(在客户机端)按照x条记录对文件进行预分析,在每个记录子集上附加一个校验和,然后允许客户机通过代理服务器上载固定数量的连接,这样您就可以更准确地监控进度。