Quantas solicitações simultâneas de AJAX (XmlHttpRequest) são permitidas em navegadores populares?

358

No Firefox 3, a resposta é 6 por domínio: assim que um 7º XmlHttpRequest (em qualquer guia) for disparado no mesmo domínio, ele ficará na fila até que um dos outros 6 termine.

Quais são os números para os outros principais navegadores?

Além disso, existem maneiras de contornar esses limites sem que meus usuários modifiquem as configurações do navegador? Por exemplo, existem limites para o número de solicitações jsonp (que usam injeção de tag de script em vez de um objeto XmlHttpRequest)?

Segundo plano: meus usuários podem fazer XmlHttpRequests de uma página da web para o servidor, solicitando que o servidor execute comandos ssh em hosts remotos. Se os hosts remotos estiverem inoperantes, o comando ssh levará alguns minutos para falhar, impedindo eventualmente que meus usuários executem mais comandos.

Michael Gundlach
fonte
Pensando em sua situação, qual é a viabilidade de fazer ping na mangueira remota para ver se está em cima ou em baixo? Isso não responderá à sua pergunta, mas pode ser um fluxo de trabalho melhor.
Bob
11
Obrigado, Bob, essa é uma das duas abordagens que planejei solucionar esse problema - considerei mencioná-lo na pergunta, mas decidi que era fora de tópico. (Outra abordagem é ter o servidor, que eu controlo, tempo limite os pedidos SSH.)
Michael Gundlach
11
Eu acho que você praticamente tem a sua resposta ... é mais do que seguro assumir Safari e Chrome suporte pelo menos 2, de modo que você pode sempre assumir 2.
Rex M
11
Usando o Chrome 2.0.172.28 no Windows Vista, obtive 6 conexões simultâneas.
Callum
2
Acabei de encontrar esta página stevesouders.com/blog/2008/03/20/…, que fornece mais alguns números e uma discussão sobre isso.
David Johnstone

Respostas:

143

Um truque que você pode usar para aumentar o número de conexões simultâneas é hospedar suas imagens de um subdomínio diferente. Estes serão tratados como solicitações separadas, cada domínio será o que será limitado ao máximo simultâneo.

IE6, IE7 - tem um limite de dois. O IE8 é 6 se você tiver uma banda larga - 2 (se for uma conexão discada).

Prumo
fonte
4
Não, os limites são impostos ao domínio. Assim, tecnicamente, você pode obter FF até 12 conexões se tiver um subdomínio além do seu site.
Bob
11
Então, se eu entendi, o FF limita todas as solicitações (para um único domínio) a 6 - e não apenas XmlHttpRequests para um único domínio. E outros navegadores fazem a mesma coisa com limites diferentes. Corrigir?
18711 Michael Gundlach
11
Ah, sim, se você tiver uma página com mil imagens, ela será baixada em grupos de seis. Acredito que a maioria dos outros navegadores convencionais funciona da mesma maneira.
Bob
7
Uau. Este é um bom truque. Isso também explica por que os servidores de lado a lado para os mecanismos de mapas criam vários subdomínios falsos (geralmente algo como maps1.whatever.com, maps2.whatever.com, maps3.whatever.com) para acelerar as coisas.
meawoppl
2
@AMember, o navegador mantém em paralelo seu número máximo de ajax simultâneo permitido o tempo todo. Tente minha resposta abaixo se você quiser ver em acção
Luis Siquot
103

Os resultados da rede no Browserscope fornecerão a você conexões por nome de host e conexões máximas para navegadores populares. Os dados são coletados executando testes em usuários "in the wild", para que se mantenham atualizados.

Kevin Hakanson
fonte
3
Infelizmente, isso não parece remotamente atualizado
Dave Lawrence
@DaveLawrence Acabei de verificar e o conjunto de dados completo parece conter o Chrome 60 e 61, o que é bastante atualizado.
Simon East
24

Com o IE6 / IE7, é possível ajustar o número de solicitações simultâneas no registro. Veja como configurá-lo para quatro cada.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
brianegge
fonte
15
-1. OP disse without having my users modify their browser settings. Além disso, não é prático, pois é necessário fazer isso em cada cliente.
precisa saber é o seguinte
23
No entanto, isso é muito útil, relacionado a esse problema. Talvez tivesse sido melhor postado em um comentário do que como resposta?
JD Smith #
7

Acabei de verificar no site www.browserscope.org e no IE9 e Chrome 24 que você pode ter 6 conexões simultâneas em um único domínio e até 17 em vários.

xmorera
fonte
6

De acordo com o IE 9 - O que mudou? no blog HttpWatch, o IE9 ainda tem um limite de 2 conexões quando estiver sobre VPN.

Usando uma VPN ainda atrapalha o desempenho do IE 9

Anteriormente, informamos sobre a redução do número máximo de conexões simultâneas no IE 8 quando o seu PC usa uma conexão VPN. Isso aconteceu mesmo que o tráfego do navegador não passasse por essa conexão.

Infelizmente, o IE 9 é afetado pelas conexões VPN da mesma maneira:

Kevin Hakanson
fonte
6

Eu escrevi um testador AJAX de arquivo único. Aproveite!!! Só porque tive problemas com meu provedor de hospedagem

<?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>

Edit:
r significa linha e w tempo de espera.
Quando você pressiona inicialmente o botão Iniciar 80 (ou qualquer outro número) da solicitação ajax simultânea, é iniciado por javascript, mas como é sabido, eles são colocados em spool pelo navegador. Também são solicitados ao servidor em paralelo (limitado a determinado número, esse é o fato desta pergunta). Aqui, os pedidos são resolvidos no lado do servidor com um atraso aleatório (estabelecido por w). Na hora de início, todo o tempo necessário para resolver todas as chamadas ajax é calculado. Quando o teste termina, você pode ver se demorou metade, ficou em terceiro, levou um quarto, etc. do tempo total, deduzindo qual era o paralelismo nas chamadas para o servidor. Isso não é rigoroso, nem preciso, mas é bom ver em tempo real como as chamadas ajaxs são concluídas (ver o cruzamento de entrada). E é um script autônomo muito simples para mostrar o básico do ajax.
Obviamente, isso pressupõe que o lado do servidor não está introduzindo nenhum limite extra.
De preferência, use em conjunto com o painel de rede do firebug (ou o equivalente do seu navegador)

Luis Siquot
fonte
assim que eu confirmar, FF3 lançamentos até seis solicitações simultâneas
Luis Siquot
Você pode explicar o que você fez aqui? O que é rew? Tela de impressão de analisar resultado seria muito apreciado
Royi Namir
4

Escrevi meu próprio teste. testou o código no stackoverflow, funciona bem me diz que chrome / FF pode fazer 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();
});

funciona para a maioria dos sites que podem disparar eventos de alteração de readystate em momentos diferentes. (aka: descarga)

Percebo no meu servidor node.js. que tive que gerar pelo menos 1025 bytes para disparar o evento / liberação. caso contrário, os eventos acionariam todos os três estados de uma só vez quando a solicitação for concluída, então aqui está meu back-end:

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

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

app.listen(80);

Atualizar

Percebo que agora você pode solicitar até 2x se estiver usando a API xhr e a busca ao mesmo tempo

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();
});

Sem fim
fonte
Diz 19 no meu, está quebrado?
PauAI
O Firefox Developer Edition 57.0b12 diz 2. #
AnthonyB
0

Acredito que exista um número máximo de solicitações http simultâneas que os navegadores farão no mesmo domínio, da ordem de 4 a 8 solicitações, dependendo das configurações e do navegador do usuário.

Você pode configurar suas solicitações para acessar domínios diferentes, o que pode ou não ser possível. O pessoal do Yahoo fez muitas pesquisas nessa área, sobre as quais você pode ler ( aqui ). Lembre-se de que todo novo domínio adicionado também requer uma pesquisa de DNS. Os funcionários do YSlow recomendam entre 2 e 4 domínios para alcançar um bom compromisso entre solicitações paralelas e pesquisas de DNS, embora isso esteja focado no tempo de carregamento da página, não nas solicitações subsequentes de AJAX.

Posso perguntar por que você deseja fazer tantos pedidos? Existem boas razões para os navegadores limitarem o número de solicitações ao mesmo domínio. Será melhor agrupar solicitações, se possível.

cbp
fonte
11
Meus XmlHttpRequests não podem ir para domínios diferentes como você sugere, devido à mesma política de origem. (Talvez este seja um argumento para usar o jsonp para solucionar esse problema.) Esta página é um painel de comando e controle para muitos computadores; assim, uma solicitação é gerada por execução solicitada pelo usuário.
18711 Michael Gundlach