Как получить тайм-аут ответа более 30 секунд в heroku

#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 Дай мне знать, если это тебе помогло