Отправка ответа после завершения обработки заданий в Express

#node.js #express

#node.js #экспресс

Вопрос:

Итак, у меня есть экспресс-сервер, который принимает запрос. Запрос представляет собой веб-очистку, которая занимает 3-4 минуты. Я использую Bull для постановки заданий в очередь и обработки их по мере готовности. Задача состоит в том, чтобы отправить эти результаты из обработанных заданий обратно в качестве ответа. Есть ли какой-либо способ, которым я могу этого добиться? Я запускаю приложение на heroku, но у heroku время ожидания запроса составляет 30 секунд.

Ответ №1:

Вам не нужно ждать, пока серверная часть завершит выполнение запроса, определив, кто запрашивает. Аутентифицировать пользователя. Сделайте res.status(202).send({message:”text}); Даже если ответ был отправлен клиенту, вы можете продолжить обработку и прочее

ПРИМЕЧАНИЕ: Не ставьте ключевое слово return перед res.status…

Код состояния принятого ответа по протоколу передачи гипертекста (HTTP) 202 указывает, что запрос принят для обработки, но обработка не завершена; фактически, обработка, возможно, еще не началась. В конечном итоге запрос может быть обработан, а может и не быть выполнен, поскольку он может быть запрещен при фактической обработке.

202 не является обязательным, что означает, что у HTTP нет возможности позже отправить асинхронный ответ, указывающий результат обработки запроса. Он предназначен для случаев, когда другой процесс или сервер обрабатывает запрос, или для пакетной обработки.

Ответ №2:

Вам всегда нужно отправлять ответ немедленно из-за тайм-аута. Поскольку ваш процесс занимает около 3-4 минут, лучше сразу отправить ответ, указав, что запрос был успешно получен и будет обработан.

Теперь, когда задача завершена, вы можете использовать socket.ввод-вывод или веб-сокеты для уведомления клиента со стороны сервера. Вы также можете передать ответ.

Клиентская сторона также может непрерывно проверять, было ли задание завершено на стороне сервера, это называется опросом и требуется в старых браузерах, которые не поддерживают веб-сокеты. сокет.Ввод-вывод возвращается к опросу, когда браузеры не поддерживают веб-сокеты.

Посетите сокет.ввод-вывод для получения дополнительной информации и документации.

Комментарии:

1. Большое вам спасибо. Мне удалось сделать это с помощью socket.io . Мне было интересно, насколько масштабируемым является socket io, когда подключены сотни пользователей.

2. Нет проблем. сокет. Ввод-вывод используется в производстве многими компаниями. Для 100 пользователей, безусловно, отлично. Но обязательно поищите другие блоги и статьи и изучите больше.

Ответ №3:

Лучший подход к этой проблеме — socket.библиотека ввода-вывода. Он может отправлять данные клиенту send в любое удобное для вас время. Это запускает функцию на стороне клиента, которая получает данные. Сокет.io поддерживает разные языки, и это действительно просто в использовании.

ссылка на веб-сайт

Ссылка на документацию

Ответ №4:

  • создайте таблицу заданий в базе данных или постоянном хранилище, таком как redis
  • сохраняйте каждое задание в таблице по запросу с уникальным идентификатором
  • обновите статус до running при запуске задания
  • отправлено HTTP 202 — Принято
  • На клиенте реализуйте сценарий опроса, На сервере реализуйте маршрут / API состояния задания. API принимает идентификатор задания, запрашивает таблицу заданий и отвечает статусом
  • По завершении задания обновите таблицу заданий со статусом completed , при ошибке jon обновите таблицу заданий со статусом failed и, возможно, столбец описания, чтобы сохранить причину ошибки

Это решение делает вашу систему горизонтально масштабируемой и распределенной. Это также предотвращает последствия неожиданных разрывов соединения. Интервал опроса зависит от средней продолжительности выполнения задания. Я бы рекомендовал средний интервал в 5 секунд Это может быть даже улучшено для сохранения хода выполнения задания в таблице заданий, чтобы клиент мог даже отображать индикатор выполнения

Ответ №5:

-> Время ожидания запроса истекает, когда ваше соединение простаивает, разные серверы реализуют по-разному, поэтому timeout time differs

1) Решением этой проблемы с таймаутом было бы сделать ваше connections open(constant) , то есть соединение между клиентом и серверами должно remain constant .

  1. Таким образом, для таких сценариев use WebSockets , что гарантирует, что после первоначального подтверждения запроса и ответа между клиентом и сервером соединение остается открытым.

  2. существует множество библиотек для реализации подключения в реальном времени.Например Pubnub,socket.io. Это та же технология, которая используется для прямой трансляции.

  3. Node js может обрабатывать множество одновременных подключений, и его легкий вес тоже не будет использовать много ресурсов.