¿Cuántas solicitudes concurrentes de AJAX (XmlHttpRequest) están permitidas en los navegadores populares?

358

En Firefox 3, la respuesta es 6 por dominio: tan pronto como se dispara una séptima XmlHttpRequest (en cualquier pestaña) al mismo dominio, se pone en cola hasta que uno de los otros 6 termine.

¿Cuáles son los números para los otros navegadores principales?

Además, ¿hay formas de evitar estos límites sin que mis usuarios modifiquen la configuración de su navegador? Por ejemplo, ¿hay límites para la cantidad de solicitudes jsonp (que usan la inyección de etiquetas de script en lugar de un objeto XmlHttpRequest)?

Antecedentes: mis usuarios pueden hacer XmlHttpRequests desde una página web al servidor, pidiéndole al servidor que ejecute comandos ssh en hosts remotos. Si los hosts remotos están inactivos, el comando ssh tarda unos minutos en fallar, lo que eventualmente impide que mis usuarios realicen más comandos.

Michael Gundlach
fuente
Pensando en su situación, ¿cuál es la viabilidad de hacer ping a la manguera remota para ver si está arriba o abajo? Esto no responderá su pregunta, pero este puede ser un mejor flujo de trabajo.
Bob
1
Gracias Bob, ese es uno de los dos enfoques que había planeado para solucionar este problema; consideré mencionarlo en la pregunta pero decidí que estaba fuera de tema. (Otro enfoque es hacer que el servidor, que yo controlo, tiempo de espera de las solicitudes de ssh.)
Michael Gundlach
1
Creo que ya tienes tu respuesta ... es más que seguro asumir que Safari y Chrome son compatibles con al menos 2, por lo que siempre puedes asumir 2.
Rex M
1
Usando Chrome 2.0.172.28 en Windows Vista, obtuve 6 conexiones simultáneas.
Callum
2
Acabo de encontrar esta página stevesouders.com/blog/2008/03/20/… que ofrece algunos números más y una discusión sobre esto.
David Johnstone

Respuestas:

143

Un truco que puede usar para aumentar la cantidad de conexiones concurrentes es alojar sus imágenes desde un subdominio diferente. Estos serán tratados como solicitudes separadas, cada dominio es lo que se limitará al máximo concurrente.

IE6, IE7: tienen un límite de dos. IE8 es 6 si tiene una banda ancha - 2 (si es un acceso telefónico).

Beto
fuente
44
No, los límites se imponen en el dominio. Por lo tanto, técnicamente podría obtener FF hasta 12 conexiones si tuviera un subdominio además de su sitio.
Bob
1
Entonces, si te entiendo, FF limita todas las solicitudes (a un solo dominio) a 6, no solo XmlHttpRequests a un solo dominio. Y otros navegadores hacen lo mismo con límites diferentes. ¿Correcto?
Michael Gundlach
1
Ohh sí, si tienes una página con mil imágenes, las descargará en grupos de seis. Creo que la mayoría de los otros navegadores convencionales funcionan de la misma manera.
Bob
77
Guau. Este es un buen truco. Esto también explica por qué los servidores de mosaico para los motores de mapas crean una serie de subdominios falsos (generalmente algo así como maps1.whatever.com, maps2.whatever.com, maps3.whatever.com) para acelerar las cosas.
meawoppl
2
@AMember, el navegador mantiene en paralelo su número máximo de ajax concurrente permitido todo el tiempo. Prueba mi respuesta a continuación si quieres ver en acción
Luis Siquot
103

Los resultados de la red en Browserscope le dará dos conexiones por cada nombre de host y el máximo de conexiones para los navegadores populares. Los datos se recopilan ejecutando pruebas en los usuarios "en la naturaleza", por lo que se mantendrán actualizados.

Kevin Hakanson
fuente
3
Desafortunadamente eso no se ve remotamente actualizado
Dave Lawrence
@DaveLawrence Acabo de comprobar y el conjunto de datos completo parece contener Chrome 60 y 61, que está bastante actualizado.
Simon East
24

Con IE6 / IE7 se puede modificar el número de solicitudes concurrentes en el registro. Aquí se explica cómo configurarlo en cuatro cada uno.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
brianegge
fuente
15
-1. OP dijo without having my users modify their browser settings. Además, no es práctico ya que uno tendría que hacer esto en cada cliente.
Razort4x
23
Sin embargo, esto es algo muy útil para saber, relacionado con este problema. ¿Quizás hubiera sido mejor publicado en un comentario que como respuesta?
JD Smith
7

Acabo de consultar con www.browserscope.org y con IE9 y Chrome 24 puede tener 6 conexiones simultáneas a un solo dominio, y hasta 17 a múltiples.

xmorera
fuente
6

De acuerdo con IE 9 - ¿Qué ha cambiado? en el blog HttpWatch, IE9 todavía tiene un límite de conexión 2 cuando está sobre VPN.

Uso de una VPN aún Clobbers IE 9 Performance

Anteriormente informamos acerca de la reducción del número máximo de conexiones simultáneas en IE 8 cuando su PC usa una conexión VPN. Esto sucedió incluso si el tráfico del navegador no superó esa conexión.

Desafortunadamente, IE 9 se ve afectado por las conexiones VPN de la misma manera:

Kevin Hakanson
fuente
6

He escrito un solo archivo de prueba AJAX. ¡¡¡Disfrútala!!! Solo porque he tenido problemas con mi proveedor de alojamiento

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

Editar:
r significa fila yw tiempo de espera.
Cuando presiona inicialmente el botón de inicio 80 (o cualquier otro número) de la solicitud simultánea de ajax se inicia mediante javascript, pero como se sabe, el navegador los pone en cola. También se solicitan al servidor en paralelo (limitado a cierto número, este es el hecho de esta pregunta). Aquí las solicitudes se resuelven del lado del servidor con un retraso aleatorio (establecido por w). Al inicio se calcula todo el tiempo necesario para resolver todas las llamadas ajax. Cuando finaliza la prueba, puede ver si tomó la mitad, la tercera, la cuarta parte, etc. del tiempo total, deduciendo cuál fue el paralelismo en las llamadas al servidor. Esto no es estricto ni preciso, pero es agradable ver en tiempo real cómo se completan las llamadas ajaxs (ver el cruce entrante). Y es un script autónomo muy simple para mostrar los conceptos básicos de ajax.
Por supuesto, esto supone que el lado del servidor no está introduciendo ningún límite adicional.
Preferiblemente use en conjunto con el panel de red firebug (o el equivalente de su navegador)

Luis Siquot
fuente
así que confirmo, FF3 lanza hasta seis solicitudes simultáneas
Luis Siquot
¿Puedes explicar lo que hiciste aquí? ¿Qué es r y w? La pantalla de impresión del resultado del análisis sería muy apreciada
Royi Namir
4

Escribió mi propia prueba. probó el código en stackoverflow, funciona bien, me dice que Chrome / FF puede hacer 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 la mayoría de los sitios web que pueden desencadenar un evento de cambio readystate en diferentes momentos. (también conocido como: rubor)

Noté en mi servidor node.js que tenía que generar al menos 1025 bytes para activar el evento / vaciado. de lo contrario, los eventos solo desencadenarían los tres estados a la vez cuando se complete la solicitud, así que aquí está mi backend:

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

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

app.listen(80);

Actualizar

Me doy cuenta de que ahora puede tener hasta 2 veces la solicitud si está utilizando xhr y fetch api al mismo tiempo

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

Sin fin
fuente
Dice 19 en el mío, ¿está roto?
PauAI
Firefox Developer Edition 57.0b12 dice 2.
AnthonyB
0

Creo que hay un número máximo de solicitudes HTTP simultáneas que los navegadores harán al mismo dominio, que está en el orden de 4-8 solicitudes dependiendo de la configuración y el navegador del usuario.

Puede configurar sus solicitudes para ir a diferentes dominios, lo que puede o no ser factible. Los muchachos de Yahoo investigaron mucho en esta área, sobre lo que pueden leer ( aquí ). Recuerde que cada nuevo dominio que agregue también requiere una búsqueda de DNS. Los chicos de YSlow recomiendan entre 2 y 4 dominios para lograr un buen compromiso entre las solicitudes paralelas y las búsquedas de DNS, aunque esto se centra en el tiempo de carga de la página, no en las solicitudes posteriores de AJAX.

¿Puedo preguntar por qué quieres hacer tantas solicitudes? Hay buenas razones para que los navegadores limiten el número de solicitudes al mismo dominio. Será mejor que agrupe las solicitudes si es posible.

cbp
fuente
1
My XmlHttpRequests no puede ir a dominios diferentes como usted sugiere, debido a la Política del mismo origen. (Quizás este sea un argumento para usar jsonp para solucionar este problema). Esta página es un panel de control y comando para muchas computadoras; por lo tanto, se genera una solicitud por ejecución solicitada por el usuario.
Michael Gundlach