Скільки паралельних запитів AJAX (XmlHttpRequest) дозволено в популярних браузерах?


358

У Firefox 3 відповідь - 6 на домен: як тільки 7-й XmlHttpRequest (на будь-якій вкладці) до цього ж домену буде запущено в чергу, поки не завершиться одна з інших 6.

Які цифри для інших основних браузерів?

Крім того, чи існують способи подолати ці обмеження без того, щоб мої користувачі змінювали налаштування свого браузера? Наприклад, чи є обмеження кількості запитів jsonp (які використовують введення тегів скриптів, а не об'єкт XmlHttpRequest)?

Передумови: Мої користувачі можуть робити XmlHttpRequests з веб-сторінки на сервер, попросивши сервер виконувати команди ssh на віддалених хостах. Якщо віддалені хости не працюють, команда ssh займає декілька хвилин, щоб уникнути помилки, зрештою заважаючи моїм користувачам виконувати будь-які подальші команди.


Розмірковуючи про свою ситуацію, якою є можливість пробити пінг на віддалений шланг, щоб побачити, чи він вгору чи вниз? Це не відповість на ваше запитання, але це може бути кращим робочим процесом.
Боб

1
Дякую Боб, це один із двох підходів, які я планував виправити цю проблему - я розглядав її про згадку у питанні, але вирішив, що це поза темою. (Інший підхід полягає в тому, щоб сервер, яким я керую, вичерпував запити ssh.)
Michael Gundlach

1
Я думаю, що у вас майже є відповідь ... більш ніж безпечно припустити, що підтримка Safari та Chrome принаймні 2, тому ви завжди можете припустити 2.
Rex M

1
Використовуючи Chrome 2.0.172.28 у Windows Vista, я отримав 6 одночасних підключень.
Callum

2
Щойно я знайшов цю сторінку stevesouders.com/blog/2008/03/20/…, яка дає ще кілька номерів та дискусію з цього приводу.
Девід Джонстоун

Відповіді:


143

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

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


4
Ні, обмеження накладаються на домен. Таким чином, ви можете технічно отримати FF до 12 підключень, якби у вас був піддомен на додаток до вашого сайту.
Боб

1
Тож якщо я вас зрозумів, FF обмежує всі запити (до одного домену) до 6 - не лише XmlHttpRequests до одного домену. І інші браузери роблять те саме, що мають різні обмеження. Правильно?
Майкл Гундлах

1
О так, якщо у вас є сторінка з тисячею зображень, вона завантажить їх у шість груп. Я вважаю, що більшість інших основних браузерів працюють так само.
Боб

7
Ого. Це хороший трюк. Це також пояснює, чому сервери плиток для двигунів карт створюють ряд підроблених піддоменів (як правило, щось на зразок maps1.wever.com, maps2.wever.com, maps3.wever.com) для прискорення роботи.
meawoppl

2
@AMember, браузер паралельно підтримує максимальну кількість одночасно дозволених ajax. Спробуйте мою відповідь нижче, якщо ви хочете побачити в дії
Луїс Сікуот

103

Результати роботи мережі Browserscope дадуть вам як підключення на ім’я хоста, так і максимальне з'єднання для популярних браузерів. Дані збираються за допомогою тестів на користувачах "у дикій природі", тому вони залишаться в курсі.


3
На жаль, це не виглядає віддалено сучасним
Дейв Лоуренс

@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. Крім того, це не практично, оскільки потрібно було б робити це кожному клієнту.
Razort4x

23
Це, однак, є дуже корисною справою, що стосується цього питання. Можливо, це було б краще розміщено в коментарі, ніж як відповідь?
JD Smith

7

Щойно я зареєструвався на веб-сайті www.browserscope.org та в IE9 та Chrome 24, ви можете мати 6 одночасних підключень до одного домену та до 17 до декількох.


6

Відповідно до IE 9 - Що змінилося? на блозі HttpWatch IE9 все ще має обмеження на 2 з'єднання, коли над VPN.

Використання VPN Still Clobbers IE 9 Performance

Раніше ми повідомляли про масштабування максимальної кількості одночасних з'єднань у 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="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/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>

Редагувати:
r означає строки та час очікування.
Коли ви спочатку натискаєте кнопку запуску 80 (або будь-який інший номер) одночасного запиту ajax, запускається javascript, але, як відомо, браузер оскалює їх. Також вони запитуються на сервер паралельно (обмежено певною кількістю, це факт цього питання). Тут запити вирішуються на стороні сервера з випадковою затримкою (встановлюється w). У момент запуску обчислюється весь час, необхідний для вирішення всіх дзвінків Ajax. Коли тест закінчений, ви можете побачити, якщо це зайняло половину, зайняло третє, взяло чверть і т. Д. Загального часу, вирахувавши який був паралелізм у викликах на сервер. Це не суворо і не точно, але приємно бачити в режимі реального часу, як завершуються дзвінки ajaxs (бачачи вхідний хрест). І це дуже простий автономний сценарій, щоб показати основи ajax.
Звичайно, це передбачає, що сторона сервера не вводить жодних додаткових лімітів.
Переважно використовувати разом із панеллю чистої помилки (або еквівалентом веб-переглядача)


тому я підтверджую, що FF3 запускає до шести паралельних запитів
Луїс Сіко

Чи можете ви, будь ласка, пояснити, що ви тут зробили? Що таке r і w? Екран друку аналізу результату був би дуже вдячний
Рой Намір

4

Написав власний тест. перевірив код на stackoverflow, працює чудово, підказує мені, що хром / 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();
});

він працює на більшості веб-сайтів, які можуть викликати подію готових змін у різний час. (він же: промивання)

Я помічаю на своєму сервері 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);

Оновлення

Я зауважую, що тепер у вас може бути до 2х запитів, якщо ви одночасно використовуєте і xhr, і отримання 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();
});


На моїй масі сказано 19, вона зламана?
PauAI

Firefox Developer Edition 57.0b12 повідомляє 2.
AnthonyB

0

Я вважаю, що існує максимальна кількість одночасних запитів http, які браузери роблять для того самого домену, що становить порядку 4-8 запитів залежно від налаштувань користувача та браузера.

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

Чи можу я запитати, чому ви хочете зробити так багато запитів? Існують вагомі причини, щоб браузери обмежували кількість запитів на один і той же домен. Вам буде краще, якщо це можливо, запити на комплектування.


1
Мої XmlHttpRequests не можуть переходити до різних доменів, як ви пропонуєте, через ту саму політику щодо оригіналу. (Можливо, це аргумент для використання jsonp для подолання цієї проблеми.) Ця сторінка є інформаційною панеллю команд та управління для багатьох комп'ютерів; таким чином, запит породжується за виконання, яке запитує користувач.
Майкл Гундлах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.