Ограничивают ли браузеры скорость опроса AJAX? Что такое предел?


Я только что прочитал, что некоторые браузеры будут препятствовать http-опросу (я думаю, ограничивая скорость запросов)...

Из https://github.com/sstrigler/JSJaC :

Примечание: поскольку ограничения безопасности большинства современных браузеров препятствуют HTTP Опрос от использования больше этот модуль отключен по умолчанию сейчас. Если вы хотите скомпилировать его в Использовать сделать опрос'.

Это может объяснить некоторое неправильное поведение некоторых из моих JavaScripts (иногда запросы просто не отправлено и не повторено, даже если они действительно были успешными). Но я не смог найти более подробной информации..

Вопросы

  • если это " Макс. количество запросов n за x секунд", каковы обычные / стандартные настройки для x и n?
  • Есть ли какой-нибудь хороший ресурс для этого?
  • Как определить, был ли запрос "задержан" или "отклонен" из-за ограничения скорости?

Спасибо за помощь...

Стефан

6 9

6 ответов:

Стефан, быстрые ответы ниже:

- если это " Макс. количество запросов n за x секунд", каковы обычные / стандартные настройки для x и n? Это больше похоже на ограничение сервера. Браузерные обычно звучат так: - "максимальное число запросов для одного и того же имени хоста равно x" - "максимальное число соединений для любого имени хоста равно y"

- Есть ли какой-нибудь хороший ресурс для этого? http://www.browserscope.org/?category=network (также наведите указатель мыши на заголовки таблиц, чтобы увидеть, что измеренный) http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections

- Есть ли способ определить, был ли запрос "задержан" или "отклонен" из-за ограничения скорости? Вы можете посмотреть на заголовки http для "Connection: close", чтобы обнаружить ограничения сервера, но я не знаю о возможности в JavaScript читать настройки из такого количества браузеров согласованным, независимым от браузера способом. (Для Firefox, вы можете прочитать это http://support.mozilla.org/en-US/questions/746848 )

Надеюсь, этот быстрый ответ поможет?

Да, насколько мне известно, существует ограничение пула по умолчанию 10 и тайм-аут запроса по умолчанию 30 секунд на запрос, однако тайм-аут и лимиты опроса можно контролировать, и разные браузеры реализуют разные ограничения!

Проверьте этуреализацию Google .

И этопотрясающая реализация поимки ошибки таймаута!

Вы можете найти специфику Firefox здесь !

Особенности Internet Explorer: управляется изнутри реестра Windows.

Также взгляните на этот вопрос.

В основном, способ управления заключается не в изменении ограничений браузера, а в их соблюдении. Поэтому вы применяете технику, называемую дросселированием.

Думайте об этом как о создании очереди функций FIFO/priority. Структура очереди, которая принимает запросы xhr в качестве членов и обеспечивает задержку между ними, является опросом Xhr. Например, я использую Jsonp для получения данных с узла.JS сервер расположен на другом домене, и я опрашиваю, конечно, из-за ограничений браузера. В противном случае я получаю нулевой ответ от сервера, и это только из-за ограничений браузера.

На самом деле я делаю журнал консоли для каждого запроса, который должен быть отправлен, но не все из них регистрируются. Поэтому браузер ограничивает их.

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

Текущее значение ползунка соответствует currrent 'page'. Поскольку я показываю только 5 статей на странице и не могу точно загрузить тысячи статей "onload" без серьезных последствий для производительности, я загружаю статьи для текущей страницы. Я получаю их из MongoDB, отправляя междоменный запрос на скрипт Python.

Предполагается, что скрипт вернет массив из пяти объектов со всеми деталями, необходимыми для построения DOM-элементов на странице. Однако есть несколько проблем.

Во-первых, слайдер работает очень быстро, так как это более или менее изменение значения. Даже если есть функция перетаскивания, события нажатия клавиши и т. д., фактическое изменение занимает миллисекунды. Однако код слайдера выглядит примерно так:

goog.events.listen(slider, goog.events.EventType.CHANGE, function() {
    myProject.Articles.page(slider.getValue());
}

Ползунок.метод getValue () возвращает int с текущим номером страницы, поэтому в основном я должен загрузить из:

currentPage * articlesPerPage to (currentPage * articlesPerPage + 1) - 1

Но для того, чтобы загрузить, я делаю что-то вроде этот: У меня есть механизм хранения данных (думайте о нем как о массиве):

  • я проверяю, нет ли там уже содержимого
  • Если это так, то нет смысла делать еще один запрос, поэтому продолжайте получать элементы DOM из массива с уже созданными элементами DOM на месте.
  • Если это не так, то мне нужно получить его, поэтому мне нужно отправить тот запрос, который я упоминал, который будет выглядеть примерно так(без учета браузера ограничения):

    JSONP.отправить({'действие':'getMeSomeArticles','начало':пуск, длина: параметра itemsperpage должно, функцию(функцию обратного вызова){

    / / Теперь я просто быстро разбираю обратный вызов, чтобы убедиться, что он непротиворечив // создание элементов DOM и заполнение хранилища на стороне клиента // и обновить представление для пользователя. }}

Проблема заключается в скорости, с которой вы можете изменить этот слайдер. Поскольку каждое изменение, предположительно, вызывает запрос(то же самое произойдет для обычных запросов Xhr), тогда вы в основном пересекаете ограничения всех браузеров, поэтому без дросселирования не было бы "обратного вызова" для большинства запросов. "обратный вызов" - это код JS, возвращаемый запросом JSONP (который является скорее удаленным включением скрипта, чем чем-либо еще).

Поэтому я отправляю запрос в приоритетную очередь, а не опрашиваю, так как теперь мне не нужно отправлять несколько одновременных запросов. Если очередь пуста, то недавно добавленный член выполняется, и все довольны. Если это не так, затем все незавершенные запросы отменяются и выполняется только последний из них.

Теперь в моем конкретном случае я выполняю двоичный поиск (0 (log n)), чтобы увидеть, если механизм хранения еще не имеет данных для предыдущих запросов, который говорит мне, был ли предыдущий запрос завершен или нет. Если он есть, то он удаляется из очереди и обрабатывается текущий, в противном случае срабатывает новый. Ну и так далее.

Опять же, для скорости рассмотрения и дерьма браузера хочу-бес такой как Internet Explorer, я делаю описанную выше процедуру примерно на 3-4 шага вперед. Поэтому я предварительно загружаю 20 страниц вперед, пока все не станет хранилищем на стороне клиента. Таким образом, все ограничения успешно устраняются.

Время восстановления покрывается минимальным временем, которое потребовалось бы, чтобы проскользнуть через 20 страниц, и дросселирование гарантирует, что в любой момент времени не будет больше 1 активных запросов(с обратной совместимостью, идущей до Internet Explorer 5).

Причина, по которой я написал все это, заключается в том, чтобы дать вам пример, пытаясь сказать, что вы не всегда можете принудительно применять задержку непосредственно из структуры FIFO, поскольку ваши вызовы могут превратиться в то, что видит пользователь, и вы точно не хотите, чтобы пользователь ждал 10-15 секунд для отображения одной страницы.

Кроме того, всегда минимизируйте опрос и необходимость опроса(одновременно запускаются события Ajax, так как не все браузеры на самом деле делают хорошие вещи с ними). Например, вместо того, чтобы выполняя что-то вроде отправки одного запроса на получение контента и отправки другого для отслеживания этого контента в метриках вашего приложения, выполняйте как можно больше задач на уровне сервера!

Конечно, вы, вероятно, хотите отслеживать свои ошибки должным образом, поэтому ваш объект Xhr из вашей библиотеки выбора реализует обработку ошибок для ajax, и поскольку вы являетесь потрясающим разработчиком, вы хотите использовать их.

Итак, скажем, у вас есть блок try - catch на месте Сценарий таков: Один Вызов Ajax завершен, и он должен вернуть JSON, но вызов почему-то не удался. Тем не менее, вы пытаетесь разобрать JSON и сделать все, что вам нужно сделать с ним. Итак

function onAjaxSuccess (ajaxResponse) {
    try {
        var yourObj = JSON.parse(ajaxRespose);
    } catch (err) {
    // Now I've actually seen this on a number of occasions, to log that an error occur
    // a lot of developers will attempt to send yet another ajax request to log the
    // failure of the previous one.
    // for these reasons, workers exist.
    myProject.worker.message('preferrably a pre-determined error code should go here');
    // Then only the worker should again throttle and poll the ajax requests that log the
    //specific error. 
};

};

Хотя я видел различные реализации, которые пытаются запустить как можно больше запросов Xhr одновременно, пока они не столкнутся с ограничениями браузера, а затем делают довольно хорошую работу по остановке тех, которые не запустились в ожидании "перезарядки" браузера, что я могу вам посоветовать, так это подумать о том, как это сделать. следующее:

  • насколько важна скорость для вашего приложения?
  • насколько масштабируемым и интенсивным будет ввод-вывод?

Если ответ на первый - "очень", а на второй - "OMFG modern technology", то постарайтесь максимально оптимизировать свой код и архитектуру, чтобы вам никогда не нужно было отправлять 10 одновременных запросов Xhr. Кроме того, для крупномасштабных приложений, многопоточные процессы. Самый простой способ добиться этого-использовать workers. Или вы могли бы позвонить совет ECMA, скажите им, чтобы они сделали это по умолчанию, а затем разместили его здесь, чтобы остальные из нас, разработчиков JS, могли наслаждаться родной многопоточностью в JS:) (как dafuq они не думали об этом?!?!)

Нет, браузер никоим образом не влияет на опрос. Я думаю, что на этой странице подразумевалась та же политика происхождения-вы можете получить доступ только к тому же хосту и Порту, что и исходная страница.

Единственное известное ограничение для самих соединений состоит в том, что вы обычно можете иметь только от двух до четырех одновременных соединений с одним и тем же хостом.

Я написал несколько приложений с длинным опросом, некоторые с C++ backend с моим собственным веб-сервером, а один с PHP backend с Apache2.

Мой длинный тайм-аут опроса равен 4..10 С. Когда что-то происходит, или 4..Проходит 10 секунд, мой сервер возвращает пустой ответ. Затем клиент немедленно запускает другой запрос AJAX. Я обнаружил, что некоторые браузеры зависают, когда я запускаю вызов AJAX из предыдущего обработчика AJAX, поэтому я использую setTimeout () с небольшим значением для запуска следующего запроса AJAX.

Когда что-то происходит на стороне клиента, который должен быть отправлен на сервер, я использую для этого другой запрос AJAX, но это односторонняя вещь: сервер не отправляет никакого ответа, а клиент ничего не обрабатывает. Результат операции (если таковой имеется) будет получен при длительном опросе. Для этого требуется Макс. 2 подключение к серверу, которое поддерживают все браузеры.

Имейте в виду, что если есть 500 клиентских, это означает 500 серверных потоков веб-сервера, которые будут двигаться вместе, происходя загрузка пики, потому что когда что-то происходит, сервер должен сообщить об этом в то же время для каждого клиента, клиенты будут обрабатывать его почти в то же время долго, они начнут следующий длинный запрос в то же время, и с тех пор тайм-аут истечет также в то же время, и последующие тоже. Вы можете обмануть с таймаутом rnd, скажем, 4 rnd(0..4), но это ничего не стоит, если что-то случится, они снова "синхронизируются", все запросы должны быть поданы одновременно, когда что-то отчетное происходит.

Я проверил его через маршрутизатор, и он работает. Я предполагаю, что роутеры уважают 4..10 лаг, это примерно скорость медленного webapge (далеко-далеко), который ни один маршрутизатор не думает, что его нужно отменить.

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

Никаких ограничений для запросов ajax. Однако это будет на том же хосте и Порту.

Сервер может ограничить нет запроса от машины на основе его настройки.

Например. Сервер может настроить так, что если в течение указанного времени от одной и той же машины поступит несколько запросов, то он отклонит их.

После небольшой ошибки в коде javascript был сделан бесконечный цикл, на каждом шаге вызывающий 2 ajax запроса. В firebug я видел все больше и больше запросов, пока firefox не начал замедляться, не ответил И, наконец, не рухнул.

Так что, да, есть "предел";)