2009-10-26 91 views
8

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

难道我们担心超时?我们是否应该在服务器的另一个线程中启动请求,并让客户端轮询状态?

回答

4

假设你可以HTTP超时使用你选择的框架,那么你可以通过一个GET请求只是挂5分钟配置。

但是,通过POST启动执行,获取收据(数字/ ID无关)可能更灵活,然后在5分钟后执行GET操作(也可能重试,因为您的过程不会每次只需5分钟)。如果请求仍在进行中,则返回一个适当的HTTP错误代码(可能是404,但是您将返回一个带有不存在收据的GET?),或返回结果(如果可用)。

+0

这不是状态(在服务器上),而不是对REST的理想状态的行为吗? – 2011-03-18 06:55:15

+6

@Merlyn摩根 - 格雷厄姆:它不是有状态这是“对REST的理想,”它是隐藏状态。由于状态在给定的URL中可用作资源,所以这很好。 – 2011-09-07 18:13:06

4

如果你控制两端,那么你可以做任何你想要的。例如。浏览器倾向于使用“连接关闭”标题启动HTTP请求,因此您只剩下更少的选项;-)

请记住,如果您之间有一些NAT /防火墙,如果它们是一段时间不活动。

难道我建议注册一个“回调”过程?客户端向服务器发出带有“回调终点”的请求,获得“票据”。一旦服务器完成,它将“回调”客户端......或客户端可以通过票证标识符检查请求的状态。

12

这是一种方法。

创建一个新的请求执行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> 

使用这种方法,你可以很容易地想象一下以下请求W¯¯应该给

GET /ProcessXYZRequests/Pending 
GET /ProcessXYZRequests/Completed 
GET /ProcessXYZRequests/Failed 
GET /ProcessXYZRequests/Today 
7

正如Brian Agnew指出的那样,5分钟完全可以管理,如果有点浪费资源,如果可以控制超时设置的话。否则,必须至少提出两个请求:第一个获取结果生成过程,第二个(第三个,第四个,第,如果结果花费比预期更长的时间编译)来轮询结果。

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

虽然上面是一个很常见的解决方案,也确实坚持的REST约束的信,它的气味非常RPC的。也就是说,而不是说,“为我提供这个资源的表示”,它说:“运行此工作”(RPC),然后在“我提供的资源的表示是运行作业的结果” (休息)。 编辑:我在这里说得很松散。要明确,这些都没有明确地违反REST约束条件,但它确实非常类似于在REST服装中修饰非REST风格的方法,在这个过程中失去了它的好处(,例如缓存,幂等性)。因此,我宁愿建议当客户端第一次尝试获取资源时,服务器应该以202“Accepted”(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.3)响应,也许在响应实体的某个地方用“5分钟后尝试”响应。此后,客户端可以查询同一端点得到结果,如果有的话(否则返回另一个202,并稍后重试)。

这种方法的一些额外的好处是,一次性使用的资源(如作业)不会不必要地创建,不需要查询两个单独的端点(工厂和结果),并且同样不需要从解析中确定第二个端点来自第一个的响应,因此更简单。此外,结果可以被缓存,“免费”(代码方式)。根据结果​​“有效”的时间长度,在结果头中设置缓存过期时间,在某种意义上说,针对问题域。

我希望我可以称之为“资源导向型”方法的典型例子,但是,也许具有讽刺意味,“REST Web服务”的第8章提出的两个端点,工厂的做法。去搞清楚。