代码之家  ›  专栏  ›  技术社区  ›  Marcus Leon

执行时间长的REST请求方法?

  •  8
  • Marcus Leon  · 技术社区  · 15 年前

    我们正在构建一个大约需要5分钟才能执行的REST服务。它一天只会被内部应用程序调用几次。使用需要5分钟才能完成的REST(即HTTP)请求时是否存在问题?

    我们要担心超时吗?我们应该在服务器上的一个单独的线程中启动请求,并让客户机对状态进行轮询吗?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Brian Agnew    15 年前

    假设您可以使用您选择的任何框架配置HTTP超时,那么您可以通过GET请求,并只挂起5分钟。

    但是,通过POST启动执行、获取收据(数字/ID,无论什么),然后在5分钟后使用GET(如果您的过程不会每次精确花费5分钟,则可能重试)。如果请求仍在进行中,那么返回一个适当的HTTP错误代码(可能是404,但是对于带有非现有收据的GET,您会返回什么?),或者返回结果(如果可用)。

        2
  •  14
  •   Darrel Miller    15 年前

    这是一种方法。

    创建执行processxyz的新请求

    POST /ProcessXYZRequests
    
    201-Created
    Location: /ProcessXYZRequest/987
    

    如果要查看请求的当前状态:

    GET /ProcessXYZRequest/987
    
    <ProcessXYZRequest Id="987">
      <Status>In progress</Status>
      <Cancel method="DELETE" href="/ProcessXYZRequest/987"/>
    </ProcessXYZRequest>
    

    当请求完成时,您将看到

    GET /ProcessXYZRequest/987
    
    <ProcessXYZRequest>
      <Status>Completed</Status>
      <Results href="/ProcessXYZRequest/Results"/>
    </ProcessXYZRequest>
    

    使用这种方法,您可以很容易地想象以下请求会给出什么。

    GET  /ProcessXYZRequests/Pending
    GET  /ProcessXYZRequests/Completed
    GET  /ProcessXYZRequests/Failed
    GET  /ProcessXYZRequests/Today
    
        3
  •  7
  •   user359996    14 年前

    正如BrianAgnew指出的,如果可以控制超时设置,那么5分钟是完全可以管理的,如果有点浪费资源的话。否则,必须至少提出两个请求:第一个请求得到结果生产过程滚动,第二个请求(第三个请求,第四个请求, 等。 ,如果结果编译时间比预期长),则对结果进行轮询。

    Brian Agnew和Darrel Miller都为两个步骤的方法提出了类似的方法:将请求发布到工厂端点,在服务器上启动作业,然后从返回的结果端点获取结果。

    虽然上面是一个非常常见的解决方案,而且确实遵循了其余约束的字母,但它闻起来非常像RPC。那就是,而不是说,“给我一个这个的代表 资源 ,上面写着“运行这个 工作 “(rpc)然后”为运行作业的结果提供资源的表示形式“(rest)。 编辑: 我在这里说得很随便。说清楚, 所有这些都不能明确地定义REST约束 但它确实非常像在休息的衣服上穿上不休息的衣服,失去了它的好处。( 例如 缓存,等幂)。

    因此,我建议当客户机第一次尝试获取资源时,服务器应该以202“已接受”响应。( http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.3 ,可能在响应实体的某个位置使用“5分钟后重试”。此后,客户可以投票 相同的端点 要获得结果,如果可用(否则返回另一个202,稍后再试)。

    这种方法的一些额外好处是,不需要不必要地创建一次性资源(如作业),不需要查询两个独立的端点(工厂和结果),同样,也不需要通过解析第一个端点的响应来确定第二个端点,从而更简单。此外,可以“免费”(代码方面)缓存结果。根据结果对于问题域“有效”的时间长度,在结果头中设置缓存过期时间。

    我希望我可以将其称为“面向资源”方法的教科书示例,但也许具有讽刺意味的是,“RESTfulWebServices”的第8章提出了两个端点,即工厂方法。算了吧。

        4
  •  4
  •   jldupont    15 年前

    如果 你控制两端 ,然后你可以做你想做的任何事。例如,浏览器倾向于使用“连接关闭”头文件启动HTTP请求,因此留给您的选项更少;-)

    请记住,如果您之间有一些NAT/防火墙,如果它们处于非活动状态一段时间,您可能会有一些断开连接。

    我可以建议注册一个“回调”过程吗?客户机向服务器发出带有“回调端点”的请求,得到一个“票据”。一旦服务器完成,它就会“回调”客户机…或者客户机可以通过票据标识符检查请求的状态。