如何在heroku中有超过30秒的响应超时

Posted

技术标签:

【中文标题】如何在heroku中有超过30秒的响应超时【英文标题】:How to have more then 30sec response timeout in heroku 【发布时间】:2021-11-28 11:51:16 【问题描述】:

如果响应需要超过 30 秒才能返回,Guys Heroku 将终止请求,那么只要响应返回,我有什么办法可以等待吗?

好吧,用户正在上传他的文件,我需要对服务器中的文件做一些事情,更新完成后,我会给用户一个下载链接。但大多数情况下,服务器处理文件需要超过 30 秒,因此用户需要等待响应

【问题讨论】:

为什么一个请求需要超过 30 秒?也许你无论如何都应该重组它,参见例如farazdagi.com/posts/2014-10-16-rest-long-running-jobs. 好吧,用户正在上传他的文件,我需要对服务器中的文件做一些事情,更新完成后,我会给用户一个下载链接。但大多数情况下,服务器处理文件需要超过 30 秒,因此用户需要等待响应 【参考方案1】:

来自官方 Heroku 帮助中心:https://devcenter.heroku.com/articles/request-timeout

超时值不可配置。如果您的服务器需要超过 30 秒才能完成给定请求,我们建议将该工作转移到后台任务或工作人员以定期 ping 您的服务器以查看处理请求是否已完成。这种模式可以让您的 Web 进程腾出时间来完成更多工作,并减少整体应用程序响应时间。

简短的回答是:不,您不能更改此配置。我建议您调查一下为什么您的应用程序需要超过 30 秒来处理该请求。如果花费的时间超过 10 秒,您真的应该考虑 Heroku 帮助中心中建议的步骤?

您的问题

你提到你需要这个来处理文件。我知道文件处理很容易花费超过 30 秒的时间。通常我会做的是创建某种任务引用并将其与状态(“处理”,“完成”,“失败”)一起保存在数据库中 - 也存储原始文件,然后结束请求用户。这应该不会花很长时间。然后处理任务......使用另一个端点或 websocket 连接,用户可以检查任务是否已完成。

使用任务队列

以下只是对解决方案的基本解释 - 它并不适用于复制和粘贴,因为它取决于很多事情。

路线(端点)

基本上,您的后端需要有 3 条路线。一种用于上传文件,一种用于下载处理后的文件,一种用于检查任务状态。

1。上传

app.post('/files', /* some middleware e.g. multer */, async (req, res) => 
  
  // This is your upload controller
  // I assume at this point the file has been uploaded and
  // req.file contains a reference to the uploaded file. 

  // create new process task and add to queue
  const task = await createNewTask(req.file); 
  queue.push(task);

  // now a task has been created, but the user
  // doesn't need to wait for it to finish
  // so let's end the request here. 
  return req.status(200).json(task); 

);

2。检查状态

app.get('/task/:id', async (req, res) => 
 
  // From uploading a file in the first step, you'll
  // get back a task id. Use the task id to check on 
  // the status. 

  const task = await getTask(req.params.id);
  if (!task) 
    return res.status(404).end();
   else 
    return res.status(200).json(task);
  

);

该任务可以包括状态、进度百分比、原始文件名、新文件名等信息,甚至在完成后提供已处理文件的下载链接。状态可能类似于pendingprocessingfinishedfailed

3。下载

app.get('/file/:filename', (req, res) => 
  return req.status(200)
            .sendFile('./path/to/file/' + req.params.filename);
);

注意事项

使用像 uuid 这样的随机 id 重命名传入文件可能是个好主意。因此,在自动化过程中使用它们会更容易。随机id也可以同时用于task id。

这取决于你想要多大。对于任务队列,有许多不同的库可以帮助您。它可以是内存中的队列或由数据库支持的队列。

【讨论】:

您能否提供一些关于另一个端点的参考,实际上我是新手,所以我对此很感兴趣。我会很高兴你的帮助 如果没有人能打败我,我稍后会尝试解决它:) 嗯,我认为没有人有解决方案哈哈 :) @user16606396 如果这对您有帮助,请告诉我

以上是关于如何在heroku中有超过30秒的响应超时的主要内容,如果未能解决你的问题,请参考以下文章

约 30 秒后 AWS API 网关超时

超过 30 秒的请求超时错误

XCUI 测试因异步等待失败而失败:超过 30 秒的超时,未达到预期

从 Heroku 流式传输大文件在 30 秒超时后失败

如何像闹钟专业应用程序一样播放超过 30 秒的闹钟声音?

这是啥意思“超过30秒的最大执行时间”在php中[重复]