จำนวนคำขอ AJAX (XmlHttpRequest) ที่เกิดขึ้นพร้อมกันได้รับอนุญาตในเบราว์เซอร์ยอดนิยมหรือไม่


358

ใน Firefox 3 คำตอบคือ 6 ต่อโดเมน: ทันทีที่ XmlHttpRequest ที่ 7 (บนแท็บใดก็ได้) ไปยังโดเมนเดียวกันถูกใช้งานมันจะถูกจัดคิวจนกว่าจะเสร็จสิ้นอีก 6 รายการ

เบราว์เซอร์หลักอื่น ๆ มีตัวเลขเท่าใด

นอกจากนี้ยังมีวิธีแก้ไขข้อ จำกัด เหล่านี้โดยไม่ให้ผู้ใช้ของฉันแก้ไขการตั้งค่าเบราว์เซอร์หรือไม่ ตัวอย่างเช่นมีการ จำกัด จำนวนคำขอ jsonp (ซึ่งใช้การฉีดแท็กสคริปต์แทนที่จะเป็นวัตถุ XmlHttpRequest) หรือไม่

พื้นหลัง: ผู้ใช้ของฉันสามารถสร้าง XmlHttpRequests จากหน้าเว็บไปยังเซิร์ฟเวอร์ขอให้เซิร์ฟเวอร์เรียกใช้คำสั่ง ssh บนโฮสต์ระยะไกล หากรีโมตโฮสต์ไม่ทำงานคำสั่ง ssh ใช้เวลาสองสามนาทีในการล้มเหลวในที่สุดทำให้ผู้ใช้ของฉันดำเนินการคำสั่งเพิ่มเติมไม่ได้


เมื่อคิดถึงสถานการณ์ของคุณความเป็นไปได้ของการส่ง Ping ระยะไกลคืออะไรเพื่อดูว่ามันขึ้นหรือลง สิ่งนี้จะไม่ตอบคำถามของคุณ แต่นี่อาจเป็นขั้นตอนการทำงานที่ดีกว่า
บ๊อบ

1
ขอบคุณ Bob นั่นเป็นหนึ่งในสองแนวทางที่ฉันวางแผนไว้เพื่อแก้ไขปัญหานี้ - ฉันถือว่าพูดถึงมันในคำถาม แต่ตัดสินใจว่ามันไม่ใช่หัวข้อ (อีกวิธีหนึ่งคือการมีเซิร์ฟเวอร์ที่ฉันจะควบคุมหมดเวลาการร้องขอจุ๊.)
ไมเคิล 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/…ซึ่งให้หมายเลขเพิ่มเติมและการอภิปรายเกี่ยวกับเรื่องนี้
David Johnstone

คำตอบ:


143

เคล็ดลับหนึ่งที่คุณสามารถใช้เพื่อเพิ่มจำนวนการเชื่อมต่อพร้อมกันคือการโฮสต์รูปของคุณจากโดเมนย่อยที่แตกต่างกัน สิ่งเหล่านี้จะถือว่าเป็นคำขอแยกต่างหากแต่ละโดเมนคือสิ่งที่จะถูก จำกัด ให้มากที่สุดพร้อมกัน

IE6, IE7 - มีขีด จำกัด ที่สอง IE8 คือ 6 ถ้าคุณมีบรอดแบนด์ - 2 (ถ้าเป็น dial up)


4
ไม่ จำกัด อยู่ในโดเมน ในทางเทคนิคคุณสามารถรับ FF ได้สูงสุด 12 คนหากคุณมีโดเมนย่อยนอกเหนือจากไซต์ของคุณ
บ๊อบ

1
ดังนั้นถ้าฉันเข้าใจคุณ FF จำกัดการร้องขอทั้งหมด (ไปยังโดเมนเดียว) เป็น 6 - ไม่ใช่แค่ XmlHttpRequests ไปยังโดเมนเดียว และเบราว์เซอร์อื่น ๆ ก็ทำสิ่งเดียวกันโดยมีข้อ จำกัด ต่างกัน แก้ไข?
Michael Gundlach

1
โอ้ใช่ถ้าคุณมีหน้าหนึ่งพันภาพก็จะดาวน์โหลดพวกเขาในกลุ่มหก ฉันเชื่อว่าเบราว์เซอร์หลักอื่น ๆ ส่วนใหญ่ทำงานในลักษณะเดียวกัน
บ๊อบ

7
ว้าว. นี่เป็นเคล็ดลับที่ดี สิ่งนี้ยังอธิบายว่าทำไมไทล์เซิร์ฟเวอร์สำหรับเอ็นจิ้นแผนที่สร้างจำนวนโดเมนย่อยปลอม (โดยทั่วไปจะมีบางอย่างเช่น
meawoppl

2
@ เป็นที่ทราบกันว่าเบราว์เซอร์ยังคงขนานกับจำนวนสูงสุดของ ajax ที่เกิดขึ้นพร้อมกันตลอดเวลา ลองคำตอบของฉันด้านล่างหากคุณต้องการดูการทำงาน
Luis Siquot

103

ผลลัพธ์เครือข่ายที่Browserscopeจะให้ทั้งการเชื่อมต่อต่อชื่อโฮสต์และการเชื่อมต่อสูงสุดสำหรับเบราว์เซอร์ยอดนิยม ข้อมูลจะถูกรวบรวมโดยเรียกใช้การทดสอบกับผู้ใช้ "ในป่า" ดังนั้นมันจะอยู่ถึงวันที่


3
น่าเสียดายที่ไม่ได้ดูจากระยะไกลถึงวันที่
Dave Lawrence

@DaveLawrence ฉันเพิ่งตรวจสอบและดูเหมือนว่าชุดข้อมูลแบบเต็มจะมี Chrome 60 และ 61 ซึ่งค่อนข้างทันสมัย
Simon East

24

ด้วย IE6 / IE7 หนึ่งสามารถปรับแต่งจำนวนการร้องขอพร้อมกันในรีจิสทรี ต่อไปนี้เป็นวิธีตั้งค่าเป็นสี่รายการ

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

15
-1 OP 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

ก่อนหน้านี้เราได้รายงานเกี่ยวกับการปรับขนาดการเชื่อมต่อพร้อมกันสูงสุดใน 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 ทั้งหมดจะถูกคำนวณ เมื่อการทดสอบเสร็จสิ้นคุณสามารถดูว่ามันใช้เวลาครึ่งเอาที่สามใช้เวลาหนึ่งในสี่หรืออื่น ๆ ของเวลาทั้งหมดการหักซึ่งเป็นความขนานในการโทรไปยังเซิร์ฟเวอร์ นี่ไม่ใช่การเข้มงวดหรือแม่นยำ แต่ดีที่จะเห็นในเวลาจริงว่าการโทร ajax เสร็จสมบูรณ์อย่างไร และเป็นสคริปต์ที่เรียบง่ายในตัวเพื่อแสดงข้อมูลเบื้องต้นของอาแจ็กซ์
แน่นอนนี่ถือว่าฝั่งเซิร์ฟเวอร์นั้นไม่ได้แนะนำขีด จำกัด เพิ่มเติมใด ๆ
ควรใช้ร่วมกับ firebug net panel (หรือเบราว์เซอร์ที่เทียบเท่า)


ดังนั้นฉันยืนยัน FF3 เปิดตัวคำขอที่เกิดขึ้นพร้อมกันสูงสุดหกคำขอ
Luis Siquot

คุณช่วยอธิบายสิ่งที่คุณทำที่นี่ได้ไหม? r และ w คืออะไร หน้าจอการพิมพ์ของการวิเคราะห์จะได้รับการชื่นชมมาก
Royi Namir

4

เขียนแบบทดสอบของฉันเอง ทดสอบโค้ดบน stackoverflow ใช้งานได้ดีบอกฉันว่า chrome / 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();
});

ใช้งานได้กับเว็บไซต์ส่วนใหญ่ที่สามารถทริกเกอร์เหตุการณ์การเปลี่ยนแปลงผู้อ่านในเวลาที่ต่างกัน (aka: flushing)

ฉันสังเกตเห็นบนเซิร์ฟเวอร์ node.js ของฉันที่ฉันต้องส่งออกอย่างน้อย 1,025 ไบต์เพื่อทริกเกอร์เหตุการณ์ / ล้าง มิฉะนั้นเหตุการณ์ก็จะทำให้ทั้งสามสถานะพร้อมกันเมื่อคำขอเสร็จสมบูรณ์ดังนั้นนี่คือแบ็กเอนด์ของฉัน:

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

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

app.listen(80);

ปรับปรุง

ฉันสังเกตเห็นว่าตอนนี้คุณสามารถขอได้มากถึง 2x หากคุณใช้ทั้ง xhr และ fetch 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 เพื่อแก้ไขปัญหานี้) หน้านี้เป็นแผงควบคุมคำสั่งและการควบคุมสำหรับคอมพิวเตอร์หลายเครื่อง ดังนั้นการร้องขอจะเกิดขึ้นต่อการดำเนินการที่ร้องขอโดยผู้ใช้
Michael Gundlach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.