#node.js #heroku #server #hosting
Вопрос:
Ребята, Heroku завершает запрос, если для возврата ответа требуется более 30 секунд, так могу ли я как-нибудь подождать, пока ответ вернется?
Ну, пользователь загружает свой файл, и мне нужно что-то сделать с файлом на моем сервере, и после завершения обновлений я дам ссылку для загрузки пользователю. Но в основном для обработки файла сервером требуется более 30 секунд, так что пользователю нужно дождаться ответа
Комментарии:
1. Почему запрос занимает более 30 секунд? Может быть, вам все равно следует его реструктурировать, см., например farazdagi.com/posts/2014-10-16-rest-long-running-jobs .
2. Ну, пользователь загружает свой файл, и мне нужно что-то сделать с файлом на моем сервере, и после завершения обновлений я дам ссылку для загрузки пользователю. Но в основном для обработки файла сервером требуется более 30 секунд, так что пользователю нужно дождаться ответа
Ответ №1:
Из официального справочного центра Heroku : https://devcenter.heroku.com/articles/request-timeout
Значение тайм-аута не настраивается. Если вашему серверу требуется более 30 секунд для выполнения данного запроса, мы рекомендуем перенести эту работу в фоновую задачу или на работника, чтобы периодически проверять ваш сервер, чтобы узнать, завершен ли запрос на обработку. Этот шаблон освобождает ваши веб-процессы для выполнения большей работы и сокращает общее время отклика приложения.
Короткий ответ : Нет, вы не можете изменить эту конфигурацию. Я предлагаю вам выяснить, почему вашему приложению требуется более 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. Так что с ними проще работать в процессе автоматизации. Кроме того, случайный идентификатор может одновременно использоваться для идентификатора задачи.
- Это зависит от вас, насколько сильно вы хотите пойти с этим. Для очереди задач существует множество различных библиотек, которые помогут вам в этом. Это может быть очередь в памяти или очередь, поддерживаемая базой данных.
Комментарии:
1. Не могли бы вы, пожалуйста, дать некоторую справку о другой конечной точке, на самом деле я новичок, поэтому я не знаю об этом. Я был бы рад вашей помощи
2. Я постараюсь добраться до этого позже, если меня тоже никто не побьет 🙂
3. Ну, я не думаю, что у кого-то есть решение, ха-ха 🙂
4. @user16606396 Дай мне знать, если это тебе помогло