Berapa banyak permintaan AJAX (XmlHttpRequest) bersamaan yang diizinkan di browser populer?

358

Di Firefox 3, jawabannya adalah 6 per domain: segera setelah XmlHttpRequest ke-7 (pada sembarang tab) untuk domain yang sama dipecat, ia akan diantrekan hingga salah satu dari 6 lainnya selesai.

Berapa angka untuk peramban utama lainnya?

Juga, apakah ada cara untuk mengatasi batasan ini tanpa meminta pengguna saya mengubah pengaturan browser mereka? Misalnya, apakah ada batasan untuk jumlah permintaan jsonp (yang menggunakan injeksi tag skrip daripada objek XmlHttpRequest)?

Latar Belakang: Pengguna saya dapat membuat XmlHttpRequests dari halaman web ke server, meminta server untuk menjalankan perintah ssh pada host jarak jauh. Jika host jarak jauh turun, perintah ssh membutuhkan beberapa menit untuk gagal, akhirnya mencegah pengguna saya melakukan perintah lebih lanjut.

Michael Gundlach
sumber
Memikirkan situasi Anda, apa kelayakan ping selang jarak jauh untuk melihat apakah itu naik atau turun? Ini tidak akan menjawab pertanyaan Anda, tetapi ini mungkin alur kerja yang lebih baik.
Bob
1
Terima kasih Bob, itu salah satu dari dua pendekatan yang telah saya rencanakan untuk memperbaiki masalah ini - saya mempertimbangkan untuk menyebutkannya dalam Pertanyaan tetapi memutuskan bahwa itu di luar topik. (Pendekatan lain adalah untuk memiliki server, yang saya mengontrol, batas waktu permintaan ssh.)
Michael Gundlach
1
Saya pikir Anda cukup banyak memiliki jawaban Anda ... itu lebih dari aman untuk mengasumsikan dukungan Safari dan Chrome setidaknya 2, sehingga Anda selalu dapat berasumsi 2.
Rex M
1
Menggunakan Chrome 2.0.172.28 pada Windows Vista saya mendapat 6 koneksi bersamaan.
Callum
2
Saya baru saja menemukan halaman ini stevesouders.com/blog/2008/03/20/… yang memberikan beberapa angka lagi dan diskusi tentang ini.
David Johnstone

Jawaban:

143

Salah satu trik yang dapat Anda gunakan untuk meningkatkan jumlah koneksi bersamaan adalah meng-host gambar Anda dari sub domain yang berbeda. Ini akan diperlakukan sebagai permintaan terpisah, masing-masing domain adalah apa yang akan dibatasi hingga maksimum bersamaan.

IE6, IE7 - memiliki batas dua. IE8 adalah 6 jika Anda memiliki broadband - 2 (jika dial up).

Bob
sumber
4
Tidak, batasan dikenakan pada domain. Jadi, Anda secara teknis bisa mendapatkan FF hingga 12 koneksi jika Anda memiliki subdomain di samping situs Anda.
Bob
1
Jadi, jika saya mengerti Anda, FF membatasi semua permintaan (untuk satu domain) hingga 6 - bukan hanya XmlHttpRequests ke satu domain. Dan browser lain melakukan hal yang sama dengan batas berbeda. Benar?
Michael Gundlach
1
Ohh ya, Jika Anda memiliki halaman dengan seribu gambar, itu akan mengunduhnya dalam kelompok enam. Saya percaya sebagian besar browser utama lainnya bekerja dengan cara yang sama.
Bob
7
Wow. Ini trik yang bagus. Ini juga menjelaskan mengapa ubin-server untuk mesin peta membuat sejumlah sub-domain palsu (biasanya sesuatu seperti maps1.wh whatever.com, maps2.wh whatever.com, maps3.wh whatever.com) untuk mempercepat berbagai hal.
meawoppl
2
@AMember, peramban tetap paralel dengan jumlah maksimum ajax konkuren yang dibolehkan sepanjang waktu. Coba jawaban saya di bawah ini jika Anda ingin melihat beraksi
Luis Siquot
103

Hasil jaringan di Browserscope akan memberi Anda Connections per Hostname dan Max Connections untuk browser populer. Data dikumpulkan dengan menjalankan tes pada pengguna "di alam liar," sehingga akan tetap terbarui.

Kevin Hakanson
sumber
3
Sayangnya itu tidak terlihat dari jauh
Dave Lawrence
@DaveLawrence Saya baru saja memeriksa dan set data lengkap tampaknya berisi Chrome 60 dan 61 yang cukup baru.
Simon East
24

Dengan IE6 / IE7 seseorang dapat men-tweak jumlah permintaan bersamaan dalam registri. Berikut cara mengaturnya masing-masing menjadi empat.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
brianegge
sumber
15
-1. Kata OP without having my users modify their browser settings. Juga, itu tidak praktis karena kita harus melakukan ini pada setiap klien.
Razort4x
23
Meskipun demikian ini adalah hal yang sangat berguna untuk diketahui, terkait dengan masalah ini. Mungkin akan lebih baik diposting di komentar daripada sebagai jawaban?
JD Smith
7

Saya baru saja memeriksa dengan www.browserscope.org dan dengan IE9 dan Chrome 24 Anda dapat memiliki 6 koneksi bersamaan ke satu domain, dan hingga 17 ke beberapa domain.

xmorera
sumber
6

Menurut IE 9 - Apa yang Berubah? di blog HttpWatch, IE9 masih memiliki batas koneksi 2 saat melalui VPN.

Menggunakan VPN Masih Mengalami Kinerja IE 9

Kami sebelumnya melaporkan tentang penskalaan jumlah maksimum koneksi konkuren di IE 8 ketika PC Anda menggunakan koneksi VPN. Ini terjadi bahkan jika lalu lintas browser tidak melewati koneksi itu.

Sayangnya, IE 9 dipengaruhi oleh koneksi VPN dengan cara yang sama:

Kevin Hakanson
sumber
6

Saya telah menulis satu file tester AJAX. Bersenang senang lah!!! Hanya karena saya punya masalah dengan penyedia hosting saya

<?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 berarti baris dan waktu tunggu w.
Ketika Anda awalnya menekan tombol start 80 (atau nomor lain) dari permintaan ajax bersamaan diluncurkan oleh javascript, tetapi seperti diketahui mereka spooled oleh browser. Juga mereka diminta ke server secara paralel (terbatas pada nomor tertentu, ini adalah fakta dari pertanyaan ini). Di sini permintaan diselesaikan sisi server dengan penundaan acak (ditetapkan oleh w). Pada waktu mulai semua waktu yang dibutuhkan untuk menyelesaikan semua panggilan ajax dihitung. Ketika tes selesai, Anda dapat melihat apakah butuh setengah, butuh ketiga, butuh seperempat, dll dari total waktu, dikurangi yang merupakan paralelisme pada panggilan ke server. Ini tidak ketat, tidak tepat, tetapi menyenangkan untuk melihat secara real time bagaimana panggilan ajax selesai (melihat salib yang masuk). Dan adalah script mandiri sangat sederhana untuk menunjukkan dasar-dasar ajax.
Tentu saja, ini mengasumsikan, bahwa sisi server tidak memperkenalkan batas tambahan apa pun.
Lebih disukai digunakan bersamaan dengan panel jaring pembakar (atau yang setara dengan browser Anda)

Luis Siquot
sumber
jadi saya konfirmasikan, FF3 meluncurkan hingga enam permintaan secara bersamaan
Luis Siquot
Bisakah Anda jelaskan apa yang Anda lakukan di sini? Apa itu r dan w? Layar cetak hasil analisis akan sangat dihargai
Royi Namir
4

Tulis tes saya sendiri. menguji kode pada stackoverflow, berfungsi dengan baik memberitahu saya bahwa chrome / FF dapat melakukan 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();
});

ini berfungsi untuk sebagian besar situs web yang dapat memicu perubahan acara readystate pada waktu yang berbeda. (alias: flushing)

Saya perhatikan pada server node.js saya bahwa saya harus menampilkan setidaknya 1025 byte untuk memicu event / flush. jika tidak, peristiwa hanya akan memicu ketiganya sekaligus ketika permintaan selesai jadi inilah backend saya:

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

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

app.listen(80);

Memperbarui

Saya perhatikan bahwa Anda sekarang dapat memiliki permintaan hingga 2x jika Anda menggunakan xhr dan mengambil api secara bersamaan

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

Tak berujung
sumber
Dikatakan 19 pada milikku, apakah itu rusak?
PauAI
Firefox Developer Edition 57.0b12 mengatakan 2.
AnthonyB
0

Saya percaya ada jumlah maksimum permintaan http bersamaan yang akan dilakukan browser ke domain yang sama, yaitu dalam urutan 4-8 permintaan tergantung pada pengaturan dan browser pengguna.

Anda dapat mengatur permintaan Anda untuk pergi ke domain yang berbeda, yang mungkin atau mungkin tidak layak. Orang-orang Yahoo melakukan banyak penelitian di bidang ini, yang dapat Anda baca (di sini ). Ingat bahwa setiap domain baru yang Anda tambahkan juga memerlukan pencarian DNS. Orang-orang YSlow merekomendasikan antara 2 dan 4 domain untuk mencapai kompromi yang baik antara permintaan paralel dan pencarian DNS, meskipun ini berfokus pada waktu pemuatan halaman, bukan permintaan AJAX berikutnya.

Bisakah saya bertanya mengapa Anda ingin membuat begitu banyak permintaan? Ada alasan bagus untuk browser membatasi jumlah permintaan ke domain yang sama. Anda akan lebih baik jika menggabungkan permintaan jika memungkinkan.

cbp
sumber
1
XmlHttpRequests saya tidak dapat pergi ke domain yang berbeda seperti yang Anda sarankan, karena Kebijakan Asal yang Sama. (Mungkin ini adalah argumen untuk menggunakan jsonp untuk mengatasi masalah ini.) Halaman ini adalah dasbor perintah-dan-kontrol untuk banyak komputer; dengan demikian permintaan muncul per eksekusi yang diminta oleh pengguna.
Michael Gundlach