Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?

333

В Firefox 3 ответ 6 на домен: как только 7-й XmlHttpRequest (на любой вкладке) в тот же домен уволен, он ставится в очередь до тех пор, пока не закончится один из остальных 6.

Каковы числа для других основных браузеров?

Кроме того, существуют ли способы ограничения этих ограничений, если мои пользователи не изменяют настройки браузера? Например, существуют ли ограничения на количество jsonp-запросов (которые используют <тег > w370 > , а не объект XmlHttpRequest)?

Справочная информация. Мои пользователи могут сделать XmlHttpRequests с веб-страницы на сервере, попросив сервер выполнить команды ssh на удаленных хостах. Если удаленные хосты опущены, команда ssh занимает несколько минут, чтобы не сработать, в конечном итоге не позволяя моим пользователям выполнять какие-либо дополнительные команды.

  • 0
    Размышляя о вашей ситуации, какова возможность пинговать удаленный шланг, чтобы увидеть, вверх или вниз? Это не ответит на ваш вопрос, но это может быть лучшим рабочим процессом.
  • 1
    Спасибо, Боб, это один из двух подходов, которые я планировал исправить, - я подумал упомянуть об этом в Вопросе, но решил, что это не по теме. (Другой подход заключается в том, чтобы сервер, которым я управляю, прервал тайм-аут запросов ssh.)
Показать ещё 5 комментариев
Теги:
browser
xmlhttprequest

8 ответов

136
Лучший ответ

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

IE6, IE7 - имеют предел в два. IE8 - 6, если у вас широкополосная связь - 2 (если она установлена).

  • 0
    Спасибо, Боб. Итак, вы говорите, что FF фактически ограничивает все запросы до 6, а не только запросы AJAX?
  • 4
    Нет, ограничения наложены на домен. Таким образом, технически вы можете получить FF до 12 соединений, если у вас есть поддомен в дополнение к вашему сайту.
Показать ещё 7 комментариев
101

Результаты сети в Browserscope предоставят вам как Подключения на имя хоста, так и Макс. соединения для популярных браузеров. Данные собираются путем запуска тестов на пользователя "в дикой природе", поэтому он будет оставаться в курсе событий.

  • 3
    К сожалению, это не выглядит удаленно в курсе
  • 0
    @DaveLawrence Я только что проверил, и полный набор данных, кажется, содержит Chrome 60 и 61, что довольно актуально.
24

В IE6/IE7 можно настроить количество одновременных запросов в реестре. Здесь, как установить его по четыре каждый.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
  • 15
    -1. ОП сказал, without having my users modify their browser settings . Кроме того, это не практично, так как нужно было бы делать это на каждом клиенте.
  • 22
    Тем не менее, это очень полезная вещь, связанная с этой проблемой. Возможно, это было бы лучше опубликовано в комментарии, чем в качестве ответа?
6

Я только что проверил www.browserscope.org, а с IE9 и Chrome 24 вы можете иметь 6 одновременных подключений к одному домену и до 17 к нескольким.

6

В соответствии с IE 9 - Whats Changed? в блоге HttpWatch, у IE9 все еще есть ограничение на соединение 2 при использовании VPN.

Использование производительности VPN по-прежнему Clobbers IE 9

Ранее мы сообщали об уменьшении максимального значения количество параллельных подключений в IE 8, когда ваш компьютер использует VPN-соединение. Это произошло, даже если браузер трафик не прошел соединение.

К сожалению, на IE 9 влияет VPN соединения таким же образом:

6

Я написал один тестер AJAX. Наслаждайся этим!!! Просто потому, что у меня были проблемы с моим хостинг-провайдером.

<?php /*

Author:   Luis Siquot
Purpose:  Check ajax performance and errors
License:  GPL
site5:    Please don't drop json requests (nor delay)!!!!

*/

$r = (int)$_GET['r'];
$w = (int)$_GET['w'];
if($r) { 
   sleep($w);
   echo json_encode($_GET);
   die ();
}  //else
?><head>
<script type="text/javascript" src="/jquery.min.js"></script>
<script type="text/javascript">

var _settimer;
var _timer;
var _waiting;

$(function(){
  clearTable();
  $('#boton').bind('click', donow);
})

function donow(){
  var w;
  var estim = 0;
  _waiting = $('#total')[0].value * 1;
  clearTable();
  for(var r=1;r<=_waiting;r++){
       w = Math.floor(Math.random()*6)+2;
       estim += w;
       dodebug({r:r, w:w});
       $.ajax({url: '<?php echo $_SERVER['SCRIPT_NAME']; ?>',
               data:    {r:r, w:w},
               dataType: 'json',   // 'html', 
               type: 'GET',
               success: function(CBdata, status) {
                  CBdebug(CBdata);
               }
       });
  }
  doStat(estim);
  timer(estim+10);
}

function doStat(what){
    $('#stat').replaceWith(
       '<table border="0" id="stat"><tr><td>Request Time Sum=<th>'+what+
       '<td>&nbsp;&nbsp;/2=<th>'+Math.ceil(what/2)+
       '<td>&nbsp;&nbsp;/3=<th>'+Math.ceil(what/3)+
       '<td>&nbsp;&nbsp;/4=<th>'+Math.ceil(what/4)+
       '<td>&nbsp;&nbsp;/6=<th>'+Math.ceil(what/6)+
       '<td>&nbsp;&nbsp;/8=<th>'+Math.ceil(what/8)+
       '<td> &nbsp; (seconds)</table>'
    );
}

function timer(what){
  if(what)         {_timer = 0; _settimer = what;}
  if(_waiting==0)  {
    $('#showTimer')[0].innerHTML = 'completed in <b>' + _timer + ' seconds</b> (aprox)';
    return ;
  }
  if(_timer<_settimer){
     $('#showTimer')[0].innerHTML = _timer;
     setTimeout("timer()",1000);
     _timer++;
     return;
  }
  $('#showTimer')[0].innerHTML = '<b>don\'t wait any more!!!</b>';
}


function CBdebug(what){
    _waiting--;
    $('#req'+what.r)[0].innerHTML = 'x';
}


function dodebug(what){
    var tt = '<tr><td>' + what.r + '<td>' + what.w + '<td id=req' + what.r + '>&nbsp;'
    $('#debug').append(tt);
}


function clearTable(){
    $('#debug').replaceWith('<table border="1" id="debug"><tr><td>Request #<td>Wait Time<td>Done</table>');
}


</script>
</head>
<body>
<center>
<input type="button" value="start" id="boton">
<input type="text" value="80" id="total" size="2"> concurrent json requests
<table id="stat"><tr><td>&nbsp;</table>
Elapsed Time: <span id="showTimer"></span>
<table id="debug"></table>
</center>
</body>

Edit:
r означает время ожидания строки и w.
Когда вы сначала нажимаете кнопку запуска 80 (или любой другой номер) параллельного запроса ajax, запускаются javascript, но, как известно, они буферизуются браузером. Также они запрашиваются на сервере параллельно (ограниченным определенным числом, это факт этого вопроса). Здесь запросы решаются на стороне сервера со случайной задержкой (устанавливается w). В момент запуска вычисляется все время, необходимое для решения всех вызовов ajax. Когда тест закончен, вы можете увидеть, заняло ли оно половину, заняло третье место, заняло четверть и т.д. Всего времени, вычитая, что было parallelism при звонках на сервер. Это не является строгим или точным, но приятно видеть в реальном времени, как завершаются вызовы ajaxs (видя входящий крест). И очень простой автономный script, чтобы показать основы ajax.
Конечно, это предполагает, что серверная сторона не вводит никаких дополнительных ограничений.
Предпочтительно использовать в сочетании с сетевой панелью Firebug (или эквивалентом браузера)

  • 0
    поэтому я подтверждаю, FF3 запускает до шести одновременных запросов
  • 0
    Можете ли вы объяснить, что вы сделали здесь? Что такое г и ш? Печать экрана анализа результатов будет высоко ценится
Показать ещё 1 комментарий
3

Написал мой собственный тест. проверял код на stackoverflow, прекрасно работает, говорит, что chrome/FF может делать 6

var change = 0;
var simultanius = 0;
var que = 20; // number of tests

Array(que).join(0).split(0).forEach(function(a,i){
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "/?"+i); // cacheBust
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 2){
            change++;
            simultanius = Math.max(simultanius, change);
        }
        if(xhr.readyState == 4){
            change--;
            que--;
            if(!que){
                console.log(simultanius);
            }
        }
    };
    xhr.send();
});

он работает для большинства веб-сайтов, которые могут запускать событие изменения readystate в разное время. (ака: промывка)

Я заметил на моем сервере node.js, что мне нужно было выпустить не менее 1025 байт, чтобы вызвать событие/флеш. иначе события просто вызовут все три состояния сразу, когда запрос будет завершен, вот мой бэкэнд:

var app = require('express')();

app.get("/", function(req,res) {
    res.write(Array(1025).join("a"));
    setTimeout(function() {
        res.end("a");
    },500);
});

app.listen(80);

Обновление

Я замечаю, что теперь у вас может быть запрос до 2x, если вы одновременно используете xhr и fetch api

var change = 0;
var simultanius = 0;
var que = 30; // number of tests

Array(que).join(0).split(0).forEach(function(a,i){
    fetch("/?b"+i).then(r => {
        change++;
        simultanius = Math.max(simultanius, change);
        return r.text()
    }).then(r => {
        change--;
        que--;
        if(!que){
            console.log(simultanius);
        }
    });
});

Array(que).join(0).split(0).forEach(function(a,i){
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "/?a"+i); // cacheBust
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 2){
            change++;
            simultanius = Math.max(simultanius, change);
        }
        if(xhr.readyState == 4){
            change--;
            que--;
            if(!que){
                document.body.innerHTML = simultanius;
            }
        }
    };
    xhr.send();
});
  • 0
    Это говорит 19 на моем, это сломано?
  • 0
    Firefox Developer Edition 57.0b12 сообщает 2.
0

Я считаю, что существует максимальное количество одновременных HTTP-запросов, которые браузеры будут делать в том же домене, который находится в порядке 4-8 запросов в зависимости от пользовательских настроек и браузера.

Вы можете настроить свои запросы для перехода в разные домены, что может быть или не быть выполнимо. Ребята из Yahoo сделали много исследований в этой области, о которых вы можете прочитать (здесь). Помните, что каждый добавленный новый домен также требует поиска DNS. Ребята из YSlow рекомендуют от 2 до 4 доменов для достижения хорошего компромисса между параллельными запросами и поисками DNS, хотя это касается времени загрузки страницы, а не последующих запросов AJAX.

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

  • 1
    Мои XmlHttpRequests не могут отправляться в другие домены, как вы предлагаете, из-за одной и той же политики происхождения. (Возможно, это аргумент в пользу использования jsonp для решения этой проблемы.) Эта страница представляет собой панель управления для многих компьютеров; таким образом, запрос создается при выполнении запроса пользователем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню