我们有一个REST服务,可以调用可能需要2分钟才能处理的系统进程。因为在客户端上我不想等待30秒到2分钟从服务器返回响应,我可以将202返回给客户端以通知它正在处理但是不一定需要等待进程到完成?
有没有一种安全的方法可以解决这个问题? (我确信这里存在线程安全问题,特别是如果服务可能同时遇到大量请求,那么创建大量线程可能不是解决方案。)
我们正在探索的是使用批处理,每隔5分钟检查一次,以检查数据库是否需要生成报告(这是系统流程的用途),但我很好奇这种可能性。
提前致谢
修改 最终产品实际上是生成的PDF报告,然后通过电子邮件发送给用户。我主要是试图等待消费客户端等待服务响应约2分钟。
答案 0 :(得分:1)
只要您使用一些排队机制,您应该没问题。数据库工作或您可以使用更奇特的解决方案,如完整的排队系统。我会返回带有Location
标题的202,该标题指向某种状态页面,该页面最终包含指向处理结果的链接。
答案 1 :(得分:1)
我认为202从服务中立即返回是正常的,因为它承认已成功收到创建pdf的请求。
您计划在数据库中记录待处理的请求并批量处理它们对我来说很有意义。如果在没有错误的情况下发送pdf(如消息队列/工作者角色系统),每个pdf文件都被勾选为“完成”,我认为它可以正常工作。
如果您不想使用数据库路由,您的服务端点可能会生成另一个异步作业,然后返回202.这样,pdf作业立即启动和客户得到立即响应 - 但这似乎有点凌乱IMO。
编辑:重新阅读您的问题 - 我认为您不能返回202并继续在同一功能中处理。一旦你返回,就是这样(除非你产生了另一个异步作业,如上所述)。