Popüler tarayıcılarda kaç eşzamanlı AJAX (XmlHttpRequest) isteğine izin verilir?


358

Firefox 3'te, cevap alan adı başına 6'dır: aynı alan adına 7. XmlHttpRequest (herhangi bir sekmede) tetiklendiğinde, diğer 6 bitişten birine kadar sıraya alınır.

Diğer büyük tarayıcıların numaraları nelerdir?

Ayrıca, kullanıcılarımın tarayıcı ayarlarını değiştirmesine gerek kalmadan bu sınırların çevresinde yollar var mı? Örneğin, jsonp isteklerinin (XmlHttpRequest nesnesi yerine komut dosyası etiketi enjeksiyonunu kullanan) sayısıyla ilgili sınırlamalar var mı?

Arka plan: Kullanıcılarım bir web sayfasından sunucuya XmlHttpRequest'ler yapabilir ve sunucudan uzak ana bilgisayarlarda ssh komutlarını çalıştırmasını isteyebilir. Uzak ana bilgisayarlar kapalıysa, ssh komutunun başarısız olması birkaç dakika alır ve sonunda kullanıcılarımın başka komutlar gerçekleştirmesini önler.


Durumunuzu düşünerek, uzak hortumun yukarı veya aşağı olup olmadığını görmek için ping atmanın fizibilitesi nedir? Bu, sorunuza cevap vermeyecektir, ancak bu daha iyi bir iş akışı olabilir.
Bob

1
Teşekkürler Bob, bu sorunu düzeltmeyi planladığım iki yaklaşımdan biri - Soruda bundan bahsetmeyi düşündüm ama konu dışı olduğuna karar verdim. (Başka bir yaklaşım, kontrol ettiğim sunucunun ssh isteklerini zaman aşımına
uğratmaktır

1
Sanırım cevabınızı hemen hemen aldınız ... Safari ve Chrome desteğini en az 2 olarak kabul etmek daha güvenli, bu yüzden her zaman 2'yi kabul edebilirsiniz.
Rex M

1
Windows Vista'da Chrome 2.0.172.28 kullanarak 6 eşzamanlı bağlantı aldım.
Callum

2
Bu sayfayı daha birkaç numara ve bunun hakkında bir tartışma veren stevesouders.com/blog/2008/03/20/… ' i buldum .
David Johnstone

Yanıtlar:


143

Eşzamanlı bağlantı sayısını artırmak için kullanabileceğiniz bir numara, görüntülerinizi farklı bir alt alan adından barındırmaktır. Bunlar ayrı istekler olarak ele alınacaktır, her alan adı eşzamanlı maksimum ile sınırlandırılacaktır.

IE6, IE7 - iki sınırına sahiptir. Geniş bant - 2 ise çevirmeli bağlantı varsa IE8 6'dır.


4
Hayır, sınırlar etki alanına uygulanır. Dolayısıyla, sitenize ek olarak bir alt alan adınız varsa teknik olarak 12 bağlantıya kadar FF alabilirsiniz.
Bob

1
Sizi anlarsam, FF tüm istekleri (tek bir etki alanına) 6 ile sınırlar - sadece XmlHttpRequests'i tek bir etki alanına sınırlamaz . Ve diğer tarayıcılar aynı şeyi farklı sınırlarla yapar. Doğru?
Michael Gundlach

1
Ohh evet, Bin resimli bir sayfanız varsa, bunları altı kişilik gruplar halinde indirir. Diğer ana tarayıcıların çoğunun aynı şekilde çalıştığına inanıyorum.
Bob

7
Vay. Bu iyi bir numara. Bu aynı zamanda, harita motorları için döşeme sunucularının, şeyleri hızlandırmak için neden bir dizi sahte alt alan oluşturduğunu açıklar (genellikle maps1.whatever.com, maps2.whatever.com, maps3.whatever.com).
meawoppl

2
@Aralık, tarayıcı her zaman izin verilen maksimum eşzamanlı ajax sayısını paralel tutar. Eğer eylemde görmek istiyorsanız aşağıdaki cevabımı deneyin
Luis Siquot

103

Şebeke sonuçları Browserscope ikinizi de verecektir Hostadı başına Bağlantıları ve Max Connections popüler tarayıcılar için. Veriler "vahşi" kullanıcılar üzerinde testler yapılarak toplanır, böylece güncel kalır.


3
Ne yazık ki bu uzaktan görünmüyor
Dave Lawrence

@DaveLawrence Az önce kontrol ettim ve tüm veri kümesinin oldukça güncel olan Chrome 60 ve 61 içerdiği görülüyor.
Simon East

24

IE6 / IE7 ile kayıt defterindeki eşzamanlı isteklerin sayısı değişebilir. Her birini dörde nasıl ayarlayacağınız aşağıda açıklanmıştır.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004

15
-1. Dedi OP without having my users modify their browser settings. Ayrıca, her müşteri için bunu yapmak zorunda kalacağından pratik değildir.
Razort4x

23
Bununla birlikte, bu konuyla ilgili bilmek çok yararlı bir şeydir. Belki bir yorumda cevap olarak daha iyi yayınlanmış olabilir?
JD Smith


6

IE 9'a göre - Ne Değişti? HttpWatch blogunda IE9'un VPN üzerinden hala 2 bağlantı sınırı vardır.

Bir VPN Still Clobbers Kullanmak IE 9 Performansı

Bilgisayarınız bir VPN bağlantısı kullandığında daha önce IE 8'deki maksimum eşzamanlı bağlantı sayısının ölçeklendirilmesini bildirmiştik. Bu, tarayıcı trafiği bu bağlantıyı aşmasa bile oldu.

Ne yazık ki IE 9, VPN bağlantılarından aynı şekilde etkilenir:


6

Tek bir dosya AJAX test cihazı yazdım. Tadını çıkar!!! Barındırma sağlayıcımla sorun yaşadığım için

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

Düzenleme:
r satır ve w bekleme süresi anlamına gelir.
Başlangıçta 80 düğmesine (veya başka bir sayıya) bastığınızda eş zamanlı ajax isteği javascript tarafından başlatılır, ancak bilindiği gibi tarayıcı tarafından biriktirilir. Ayrıca sunucuya paralel olarak talep edilirler (belirli sayılarla sınırlıdır, bu sorunun gerçeği budur). Burada talepler sunucu tarafında rastgele bir gecikmeyle çözülür (w tarafından belirlenir). Başlangıç ​​zamanında tüm ajax çağrılarını çözmek için gereken her zaman hesaplanır. Test bittiğinde, sunucuya yapılan çağrılarda paralellik olduğunu yarıda, üçüncü, çeyrek vb. Bu katı veya kesin değildir, ancak ajaxs çağrılarının nasıl tamamlandığını (gelen haçı görmek) gerçek zamanlı olarak görmek güzeldir. Ve ajax temellerini göstermek için çok basit bir müstakil script.
Tabii ki, bu, sunucu tarafının herhangi bir ekstra sınır getirmediğini varsayar.
Tercihen kundakçı ağ paneli (veya tarayıcınızın eşdeğeri) ile birlikte kullanın


onaylıyorum, FF3 altı eşzamanlı istek başlattı
Luis Siquot

Burada ne yaptığını açıklayabilir misin? R ve w nedir? Sonuçları analiz etmek için baskı ekranı çok takdir edilecektir
Royi Namir

4

Kendi testimi yazdım. stackoverflow kodu test, iyi çalışıyor bana krom / FF yapabileceğini söyler 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();
});

farklı zamanlarda readystate değişiklik olayını tetikleyebilen çoğu web sitesi için çalışır. (aka: kızarma)

Node.js sunucumda, olayı / yıkamayı tetiklemek için en az 1025 bayt çıktısını almak zorunda olduğumu fark ettim. Aksi takdirde, istek tamamlandığında olaylar üç durumu da aynı anda tetikler;

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

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

app.listen(80);

Güncelleme

Hem xhr hem de api'yi aynı anda kullanıyorsanız, artık 2x'e kadar isteğiniz olabileceğini fark ediyorum

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


Benimkinde 19 diyor, bozuk mu?
PauAI

Firefox Developer Edition 57.0b12 diyor 2.
AnthonyB

0

Tarayıcıların aynı etki alanına, kullanıcının ayarlarına ve tarayıcıya bağlı olarak 4-8 ​​istek sırasına göre yapacağı maksimum sayıda eşzamanlı http isteği olduğuna inanıyorum.

Farklı alanlara gitmek için isteklerinizi ayarlayabilirsiniz; bu, mümkün olabilir veya olmayabilir. Yahoo beyler bu alanda ( burada ) okuyabileceğiniz birçok araştırma yaptılar . Eklediğiniz her yeni alan adının da bir DNS araması gerektirdiğini unutmayın. YSlow adamları, paralel istekler ve DNS aramaları arasında iyi bir uzlaşma sağlamak için 2 ila 4 etki alanı önerir, ancak bu, sonraki AJAX isteklerine değil, sayfanın yükleme süresine odaklanır.

Neden bu kadar çok istekte bulunmak istediğinizi sorabilir miyim? Tarayıcıların aynı etki alanına yönelik istek sayısını sınırlandırmasının iyi nedenleri vardır. Mümkünse istekleri bir araya getirmeniz daha iyi olacaktır.


1
Aynı Köken Politikası nedeniyle XmlHttpRequest'lerim önerdiğiniz gibi farklı alan adlarına gidemez. (Belki de bu sorunu çözmek için jsonp kullanma argümanıdır.) Bu sayfa birçok bilgisayar için bir komut ve kontrol panosudur; dolayısıyla, kullanıcı tarafından talep edilen yürütme başına bir talep doğar.
Michael Gundlach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.