【问题标题】:Correct handling of long-running HTTP processes正确处理长时间运行的 HTTP 进程
【发布时间】:2016-10-13 05:59:39
【问题描述】:

我正在构建一个 REST 样式的后端 Web 服务,该服务将预先生成的数据块提供给前端站点。 Blob 本身并不大,可以在单个 HTTP 响应/请求中轻松满足。后端是用 PHP 编写的。

一切正常。困难在于blob再生,当有很多blob时需要相当长的时间。重新生成可能需要比(单独托管的)服务器上的响应超时更长的时间。

我想进行如下操作: – 发送的初始请求是“重新生成所有 blob” – 处理开始,直到所有都完成(HTTP 200,所有 hunky-dory)或我达到内部时间限制之前没有响应 – 如果达到时间限制,我想发送一个响应,表明处理不完整(哪个 HTTP 状态是合适的,因为处理成功,但不完整? – 206 不适用没有 Range 标头...),所以客户可以请求继续。我可以想象返回指示“请继续”请求应该是什么的数据(这最好在 Link 标头中完成吗?) – 然后客户端请求继续,循环继续,直到发出完全成功的信号。

在 HTTP 客户端-服务器交换中发出此类信号的最佳方式是什么?我准备写一小段 Javascript 来处理客户端循环。

感谢您的任何好主意!

【问题讨论】:

    标签: http long-running-processes


    【解决方案1】:

    我对 Range 标头进行了相当多的研究,得出的结论是,对于使用不是“字节”的范围单位的效果没有足够的共识。尽管 HTTP 状态 200、206 和 416 具有有用的含义。请参阅http://otac0n.com/blog/2012/11/21/range-header-i-choose-you.html 以获得很好的总结。

    所以我最终编写了一个特殊情况解决方案,其结果在每个响应中指示是否使用“恢复”值重新运行查询,该值可以跳过已处理的 blob。

    如果 Range 的东西也允许“items”作为单位,那就太好了——这将使简单的集合能够通过标头参数处理,而无需额外的 URI 重载。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2012-12-14
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多