2011-11-29 262 views
3

我们有一个REST服务调用可能需要2分钟以上处理的系统进程。由于在客户端上,我不想等待服务器回复30秒到2分钟的响应,我是否可以将202返回给客户端,以通知它正在处理中,但不一定需要等待进程完?为REST服务异步返回http状态码202?

有没有一种安全的方法来处理这个问题? (我确信这里存在线程安全问题,特别是如果该服务可能会同时触发大量请求,那么创建大量线程可能不是解决方案。)

我们正在探索的是使用批处理每5分钟检查一次,以检查数据库是否需要生成报告(这是系统过程的用途),但我对这种可能性感到好奇。

在此先感谢

编辑 最终产品实际上是被生成的,然后通过电子邮件发送给用户的PDF报告。我主要试图避免等待服务响应返回消费客户的〜2分钟。

+0

所以你真正要问的是,REST服务是否可以返回202 *然后继续处理*? –

+0

正确的,正如http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html状态代码202.我只是试图解决等待部分没有数据库变化atm。批处理是我们尚未实现的未来任务,但如果这种方式是可能的,我们很好奇。 – DavidAndroidDev

+0

@JimMischel所以,是的,你是对的。但是,我认为直到服务完成执行它的方法之前,才会对客户端进行响应。我很好奇,如果我们可以在方法执行期间返回状态码。因此问题的异步性。 – DavidAndroidDev

回答

1

我认为从服务立即返回202是好的,因为它承认成功收到创建pdf的请求。

您计划在数据库中记录未决请求并分批处理它们对我来说是有意义的。如果每次发送PDF文件都没有错误(比如消息队列/工作者角色系统),每个pdf文件都被勾选为“完成”,我认为它可以正常工作。

如果你不想去分贝路线服务端点可以产卵另一异步工作,然后返回一个202这样的PDF作业立即启动客户得到即时响应 - 但这看起来似乎有点凌乱国际海事组织。

编辑:重新读你的问题 - 我不认为你可以返回202,并继续在相同的功能处理。一旦你回来了,就是这样了(除非你产生了另一个异步作业,如上)。

1

只要你使用一些排队机制,你应该没问题。数据库的工作原理或者您可以使用更为奇特的解决方案,例如全面排队系统。我会返回202与Location头指向某种状态页面,最终包含您的处理结果的链接。

+0

那么,最终产品(这是一个PDF报告)实际上是通过电子邮件发送给用户的。用户确实不需要从服务中检查报告是否准备好。我会将其添加为编辑。 – DavidAndroidDev

相关问题