故事是,我们有一个由Tomcat + Apache Httpd托管的webapp作为前端。 webapp需要很长时间来处理某些REST请求(长时间查询数据库,然后在获得数据库响应后生成摘要)。
在当前实现下,即使REST客户端停止请求,查询仍在处理中,直到数据库查询完成并尝试回发响应并发现输出流已关闭。另一方面,webapp不会在很长时间内发回任何内容,导致Apache Httpd会话超时(我们将超时配置为5分钟)。
那么实现以下目标的最佳做法是什么:
如果客户端终止请求,我希望处理请求停止,并且对数据库的查询也会终止。
如果请求尚未被客户端终止但是查询已经花费很长时间,则Tomcat可以发回过早响应。
更新:我认为服务器可能会继续发回100,但我错了。看起来像100继续不打算用于那个目的。
我正在考虑这样的模型:
这是可行的还是其他更好的方法?
答案 0 :(得分:2)
长时间运行请求的另一种方法是让服务器将301重定向返回到URL,在该URL处,服务器处理完成后将发布请求输出。然后,客户端可以获取此URL以检查请求的状态。
This 2011 post by Thijssen描述了一种异步Web请求的RESTful方法(使用202和303 HTTP状态代码),这种方法更优雅,但在一天结束时,您需要Web客户端和服务器注意细节;我不知道任何一个普遍支持的标准来处理长时间运行的REST API调用。