AJAX, длительный опрос и управление двумя минутными попытками
Один из запросов AJAX на мой сервер node.js может иногда занимать более двух минут. Я обнаружил, что когда сервер занимает больше двух минут, клиент отправляет запрос AJAX. Это привело к тому, что сервер стал еще более загруженным, так как запустил второй дорогой процесс.
Чтобы обойти это, я реализовал решение для длительного опроса на сервере. Клиент выполняет ajax-вызов функции проверки на сервере, которая просто проверяет, завершен ли процесс, и перепроверяет ли он каждые пять секунд и возвращается к клиенту после его завершения.
Тем не менее, у меня все еще есть вариация двухминутной проблемы. Вторая проверка AJAX все еще приходит через две минуты. Затем выполняются обе проверки, и кажется, что только новая будет сообщаться клиенту.
Каков наилучший способ решить эту проблему?
- Есть ли способ настроить или отключить двухминутную повторную отправку ajax?
- Есть ли лучший способ управлять последующими дублирующими запросами к серверу?
- Нужно ли устанавливать тайм-аут на клиенте, а не на сервере?
Я использую вызовы JQuery AJAX, сервер node.js в браузере Chrome
ОБНОВЛЕНИЕ: из документов node.js"для всех входящих соединений время ожидания по умолчанию составляет 2 минуты". Я по-прежнему заинтересован в предложениях о наилучшей практике кодирования долго выполняющихся запросов к серверу, когда клиенту не нужно ничего знать, пока сервер не завершит работу.
1 ответ
Чтобы было понятно, что происходит:
- Клиент отправляет запрос "сделай это за меня..."
- Код узла запускает асинхронную операцию (или несколько связанных друг с другом)
- Две минуты проходят
- Тайм-аут HTTP-запроса
- Клиент повторно отправляет запрос
- Сейчас выполняются два запроса
- И так до тех пор, пока не будет запущено множество запросов
Мне кажется, я слышал, что это называется "эффект собачьей кучи". Я не знаю ни одной стандартной библиотеки в node.js или jQuery, чтобы помочь вам, хотя кто-то начал работу над кэширующим прокси-сервером, чтобы помочь с этим в случае, когда ответ будет "кэшируемым":
https://github.com/simonw/dogproxy
Таким образом, вам придется разработать собственную систему, чтобы обойти это.
Существуют разные способы обработки пакетных заданий, и часто это зависит от характера задания.
Что я чаще всего видел для задач, которые занимают много времени, так это то, что API сразу же возвращает идентификатор задания, а затем клиент использует опрос (или длительный опрос), чтобы дождаться завершения задания. Вам понадобится какая-то база данных для хранения состояния (% выполнения) и результата задания, которое позволит клиенту ждать изменения этого статуса. Это также может позволить вам "отменить" задание, хотя в этом случае серверный код должен периодически проверять, чтобы увидеть, было ли оно отменено.
Просто имейте в виду, что где бы вы ни хранили состояние работы, оно должно быть общим для всех узлов в кластере, если приложение будет или будет масштабировано позже. Для этого вы можете использовать какую-нибудь высокоскоростную облегченную систему хранения, такую как memcached или redis.