#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
.
-
Таким образом, для таких сценариев
use WebSockets
, что гарантирует, что после первоначального подтверждения запроса и ответа между клиентом и сервером соединение остается открытым. -
существует множество библиотек для реализации подключения в реальном времени.Например Pubnub,socket.io. Это та же технология, которая используется для прямой трансляции.
-
Node js может обрабатывать множество одновременных подключений, и его легкий вес тоже не будет использовать много ресурсов.