【问题标题】:Handling Long Running Duplicate HTTP Requests处理长时间运行的重复 HTTP 请求
【发布时间】:2012-08-20 10:54:53
【问题描述】:

处理在服务器上接收重复 HTTP 请求的好方法是什么?

我有一个关于 LAMP 网络应用程序的报告,该应用程序需要大约 30 秒才能在服务器上构建并返回到客户端。客户不耐烦并在第一次完成之前再次运行报告。这会使服务器陷入困境。有没有办法处理/防止这个服务器端?

【问题讨论】:

  • 您能否在一夜之间预先生成报告,然后直接链接到该报告?如果客户获得他们自己的定制报告,这将不起作用,但如果每次都相同,它应该会很好地工作。

标签: php mysql apache httpwebrequest


【解决方案1】:

存储作业已经在某处运行的事实。

在生成报告的代码中,检查是否已经在运行。如果是这样,请不要运行另一个。

当报告完成生成或超时以处理异常情况时,取消存储该事实。

您可以使用数据库、memcached 服务器、redis、文本文件、写入共享内存...

【讨论】:

    【解决方案2】:

    您可以尝试返回 202 响应,直到您在服务器上构建的任何内容都完成,然后提供它的缓存副本。

    【讨论】:

      【解决方案3】:

      如今,告诉用户正在处理某事往往是使用 AJAX 来完成的。

      通常,您会将请求发送到您的服务器,然后服务器会返回一个 202 响应和一个地址(可能带有 UUID)供浏览器查找结果(您不一定会直接显示,但保留在脚本的背景中:您也可以直接为不支持 JavaScript 的客户端显示它)。

      然后,您将在后台向该地址发出后续请求,并在它准备好时显示结果。

      这种方法不仅具有对用户更友好的优势,而且对断开连接也更加稳健。

      【讨论】:

        【解决方案4】:

        30 秒对于让用户在当今网络应用世界中等待的时间太长了。谷歌用 1/100 的时间搜索整个网络。是什么让您的 Web 应用程序更先进或更消耗数据。如果您的一个实例即使在优化后也无法处理,您最好将其扩展到云(或更多服务器)。如果确实要求很高,请将其划分为可以从多个实例并行运行的子任务。

        针对您的直接问题,而不是对您未提出的问题的回答;上面的答案有一些技巧。您可以在频繁请求的查询出现之前生成它们 - 或者您可以只对渲染发出第一个请求并等待该请求完成,然后再发送结果。

        【讨论】:

        • 无论计算机变得多么强大,仍有许多任务可能需要超过 30 秒才能完成,特别是因为并非所有内容都是完全可并行的。 “将其扩展到云端”听起来您已经阅读了太多营销材料......
        • 或者您可以通过使用云服务以更少的投资达到更高的峰值处理能力...
        • 关键是,如果你想留住你的访问者,你不能让用户等待那么久。如果某些任务需要这么长的处理时间,则需要将其转换为后台服务,并被站点上的访问者视为后台作业。其他一切都会把访问者赶走,当然大多数请求都会被取消。
        • 再次重申,即使在功能强大的现代机器上,也不是每项任务都可以拆分为子任务,使得剩余的串行任务可以在 30 秒内完成。在这些情况下(仍然存在)将其扔到“云”上将无济于事。这个问题没有具体说明正在运行什么样的报告,也没有说明期望什么样的用户:推测访问者是否会离开是没有意义的。
        • 等待网页请求 30 秒将使用户取消它 - 无论他们在按下按钮之前是否收到多个警告,或者他们是否在内部被训练。将其从有限的环境转移到具有更多处理能力的环境几乎可以帮助所有可能的情况。
        猜你喜欢
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 2017-10-05
        • 1970-01-01
        • 2021-02-07
        • 2013-10-19
        相关资源
        最近更新 更多