AJAX, длительный опрос и управление двухминутными попытками - PullRequest
3 голосов
/ 25 октября 2011

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

Чтобы обойти это, я реализовал решение для длительного опроса на сервере. Клиент выполняет ajax-вызов функции проверки на сервере, которая просто проверяет, завершен ли процесс, и перепроверяет ли он каждые пять секунд и возвращается к клиенту после его завершения.

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

Как лучше всего это решить?

  • Есть ли способ настроить или отключить двухминутную повторную отправку ajax?
  • Есть ли лучший способ управлять последующими дублирующими запросами к серверу?
  • Нужно ли устанавливать тайм-аут на клиенте, а не на сервере?

Я использую вызовы jQuery AJAX, сервер node.js в браузере Chrome

ОБНОВЛЕНИЕ: из документа node.js «для всех входящих соединений время ожидания по умолчанию составляет 2 минуты». Я по-прежнему заинтересован в предложениях о наилучшей практике кодирования долго выполняющихся запросов к серверу, когда клиенту не нужно ничего знать, пока сервер не завершит работу.

1 Ответ

5 голосов
/ 26 октября 2011

Чтобы было понятно, что происходит:

  1. Клиент отправляет запрос "сделай это за меня ..."
  2. Код узла запускает асинхронную операцию (или несколько связанных друг с другом)
  3. Проход две минуты
  4. Тайм-аут HTTP-запроса
  5. Клиент повторно отправляет запрос
  6. Теперь выполняются два запроса
  7. И так до тех пор, пока не будет запущено множество запросов

Мне кажется, я слышал, что это называется "эффект собачьей кучи". Я не знаю ни одной стандартной библиотеки в node.js или jQuery, чтобы помочь вам, хотя кто-то начал работу над кэширующим прокси-сервером, чтобы помочь с этим в случае, когда ответ будет «кэшируемым»:

https://github.com/simonw/dogproxy

Итак, вам нужно спроектировать собственную систему, чтобы обойти это.

Существуют разные способы обработки пакетных заданий, и часто это зависит от характера задания.

Что я чаще всего видел для задач, которые занимают много времени, так это то, что API возвращает идентификатор задания сразу, а затем клиент использует опрос (или длительный опрос), чтобы дождаться завершения задания. Вам понадобится какая-то база данных для хранения состояния (% выполнено) и результата задания, которое позволит клиенту дождаться изменения этого состояния. Это также может позволить вам «отменить» задание, хотя в этом случае серверный код должен периодически проверять, чтобы увидеть, было ли оно отменено.

Просто имейте в виду, что где бы вы ни хранили состояние работы, оно должно быть общим для всех узлов кластера, если приложение будет или будет масштабировано позже. Для этого вы можете использовать какую-нибудь высокоскоростную облегченную систему хранения, такую ​​как memcached или redis.

...