如何在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);
);
该任务可以包括状态、进度百分比、原始文件名、新文件名等信息,甚至在完成后提供已处理文件的下载链接。状态可能类似于pending
、processing
、finished
或failed
。
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秒的响应超时的主要内容,如果未能解决你的问题,请参考以下文章