Có bao nhiêu yêu cầu AJAX (XmlHttpRequest) đồng thời được cho phép trong các trình duyệt phổ biến?


358

Trong Firefox 3, câu trả lời là 6 cho mỗi tên miền: ngay sau khi một XmlHttpRequest thứ 7 (trên bất kỳ tab nào) cho cùng một tên miền được kích hoạt, nó sẽ được xếp hàng cho đến khi một trong 6 tên còn lại kết thúc.

Các số cho các trình duyệt chính khác là gì?

Ngoài ra, có những cách xung quanh các giới hạn này mà không cần người dùng của tôi sửa đổi cài đặt trình duyệt của họ? Ví dụ: có giới hạn số lượng yêu cầu jsonp (sử dụng tính năng tiêm thẻ script chứ không phải là đối tượng XmlHttpRequest) không?

Bối cảnh: Người dùng của tôi có thể tạo XmlHttpRequests từ một trang web đến máy chủ, yêu cầu máy chủ chạy các lệnh ssh trên các máy chủ từ xa. Nếu các máy chủ từ xa không hoạt động, lệnh ssh sẽ mất vài phút để thất bại, cuối cùng ngăn người dùng của tôi thực hiện bất kỳ lệnh nào khác.


Suy nghĩ về tình huống của bạn, tính khả thi của việc vặn vòi từ xa để xem nó lên hay xuống là gì? Điều này sẽ không trả lời câu hỏi của bạn, nhưng đây có thể là một quy trình làm việc tốt hơn.
Bob

1
Cảm ơn Bob, đó là một trong hai cách tiếp cận tôi đã lên kế hoạch khắc phục vấn đề này - tôi đã xem xét đề cập đến nó trong Câu hỏi nhưng quyết định nó không có chủ đề. (Một cách tiếp cận khác là có máy chủ mà tôi kiểm soát, hết thời gian yêu cầu ssh.)
Michael Gundlach

1
Tôi nghĩ rằng bạn có khá nhiều câu trả lời của mình ... sẽ an toàn hơn khi giả sử Safari và Chrome hỗ trợ ít nhất 2, vì vậy bạn luôn có thể giả sử 2.
Rex M

1
Sử dụng Chrome 2.0.172.28 trên Windows Vista, tôi có 6 kết nối đồng thời.
Callum

2
Tôi vừa tìm thấy trang này stevesouders.com/blog/2008/03/20/ , nơi cung cấp thêm một vài con số và thảo luận về điều này.
David Johnstone

Câu trả lời:


143

Một mẹo bạn có thể sử dụng để tăng số lượng kết nối đồng thời là lưu trữ hình ảnh của bạn từ một tên miền phụ khác. Chúng sẽ được coi là các yêu cầu riêng biệt, mỗi miền là những gì sẽ được giới hạn ở mức tối đa đồng thời.

IE6, IE7 - có giới hạn là hai. IE8 là 6 nếu bạn có băng thông rộng - 2 (nếu đó là quay số).


4
Không, các giới hạn được áp đặt trên miền. Vì vậy, về mặt kỹ thuật bạn có thể nhận FF tối đa 12 kết nối nếu bạn có một tên miền phụ ngoài trang web của mình.
Bob

1
Vì vậy, nếu tôi hiểu bạn, FF giới hạn tất cả các yêu cầu (đối với một tên miền) là 6 - không chỉ XmlHttpRequests cho một tên miền. Và các trình duyệt khác làm điều tương tự với các giới hạn khác nhau. Chính xác?
Michael Gundlach

1
Ồ vâng, nếu bạn có một trang với một nghìn hình ảnh, nó sẽ tải chúng theo nhóm sáu. Tôi tin rằng hầu hết các trình duyệt chính khác hoạt động theo cùng một cách.
Bob

7
Ồ Đây là một mẹo hay. Điều này cũng giải thích tại sao các máy chủ ô vuông cho các công cụ bản đồ tạo ra một số tên miền phụ giả mạo (thường là một cái gì đó như maps1.whthing.com, maps2.whthing.com, maps3.whthing.com) để tăng tốc mọi thứ.
meawoppl

2
@AMember, trình duyệt giữ song song số lượng ajax đồng thời tối đa được phép mọi lúc. Hãy thử câu trả lời của tôi dưới đây nếu bạn muốn xem thực tế
Luis Siquot

103

Kết quả mạng tại Browseerscope sẽ cung cấp cho bạn cả Kết nối cho mỗi Tên máy chủKết nối tối đa cho các trình duyệt phổ biến. Dữ liệu được thu thập bằng cách chạy thử nghiệm trên người dùng "trong tự nhiên", vì vậy nó sẽ được cập nhật.


3
Thật không may, điều đó không được cập nhật từ xa
Dave Lawrence

@DaveLawrence Tôi vừa kiểm tra và bộ dữ liệu đầy đủ dường như chứa Chrome 60 và 61 khá cập nhật.
Simon East

24

Với IE6 / IE7, người ta có thể điều chỉnh số lượng yêu cầu đồng thời trong sổ đăng ký. Đây là cách để đặt nó thành bốn mỗi.

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

15
-1. OP nói without having my users modify their browser settings. Ngoài ra, nó không thực tế vì người ta sẽ phải làm điều này trên mỗi khách hàng.
Razort4x

23
Tuy nhiên, đây là một điều rất hữu ích để biết, liên quan đến vấn đề này. Có lẽ nó sẽ được đăng tốt hơn trong một bình luận hơn là một câu trả lời?
JD Smith

7

Tôi vừa kiểm tra với www.browserscope.org và với IE9 và Chrome 24, bạn có thể có 6 kết nối đồng thời đến một tên miền và tối đa 17 đến nhiều kết nối.


6

Theo IE 9 - Điều gì đã thay đổi? trên blog httpWatch, IE9 vẫn có giới hạn 2 kết nối khi qua VPN.

Sử dụng VPN Still Clobbers IE 9 Performance

Trước đây chúng tôi đã báo cáo về việc thu nhỏ lại số lượng kết nối đồng thời tối đa trong IE 8 khi PC của bạn sử dụng kết nối VPN. Điều này xảy ra ngay cả khi lưu lượng truy cập trình duyệt không đi qua kết nối đó.

Thật không may, IE 9 bị ảnh hưởng bởi các kết nối VPN theo cùng một cách:


6

Tôi đã viết một tệp thử nghiệm AJAX duy nhất. Tận hưởng đi !!! Chỉ vì tôi gặp vấn đề với nhà cung cấp dịch vụ lưu trữ của mình

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

Chỉnh sửa: Tất nhiên, điều này giả định, phía máy chủ không đưa ra bất kỳ giới hạn bổ sung nào. Tốt nhất là sử dụng kết hợp với bảng điều khiển net firebird (hoặc tương đương trình duyệt của bạn)
r có nghĩa là hàng và thời gian chờ đợi.
Khi ban đầu bạn nhấn nút bắt đầu 80 (hoặc bất kỳ số nào khác) của yêu cầu ajax đồng thời được khởi chạy bằng javascript, nhưng như đã biết, chúng được trình duyệt lưu lại. Ngoài ra, chúng được yêu cầu đến máy chủ song song (giới hạn số lượng nhất định, đây là thực tế của câu hỏi này). Ở đây các yêu cầu được giải quyết phía máy chủ với độ trễ ngẫu nhiên (được thiết lập bởi w). Tại thời điểm bắt đầu, tất cả thời gian cần thiết để giải quyết tất cả các cuộc gọi ajax được tính toán. Khi kiểm tra kết thúc, bạn có thể xem nếu mất một nửa, mất thứ ba, mất một phần tư, v.v. trong tổng thời gian, trừ đi sự song song trên các cuộc gọi đến máy chủ. Điều này không nghiêm ngặt, cũng không chính xác, nhưng thật tuyệt khi thấy trong thời gian thực các cuộc gọi ajaxs được hoàn thành như thế nào (nhìn thấy đường chéo đến). Và là một kịch bản tự chứa rất đơn giản để hiển thị cơ bản ajax.


vì vậy tôi xác nhận, FF3 khởi chạy tối đa sáu yêu cầu đồng thời
Luis Siquot

Bạn có thể giải thích những gì bạn đã làm ở đây? R và w là gì? Màn hình in kết quả phân tích sẽ được đánh giá cao
Royi Namir

4

Đã viết bài kiểm tra của riêng tôi. đã kiểm tra mã trên stackoverflow, hoạt động tốt cho tôi biết rằng chrome / FF có thể làm 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();
});

nó hoạt động cho hầu hết các trang web có thể kích hoạt sự kiện thay đổi sẵn sàng vào các thời điểm khác nhau. (còn gọi là: xả nước)

Tôi nhận thấy trên máy chủ node.js của mình rằng tôi phải xuất ít nhất 1025 byte để kích hoạt sự kiện / tuôn ra. nếu không, các sự kiện sẽ chỉ kích hoạt cả ba trạng thái cùng một lúc khi yêu cầu hoàn tất, vì vậy đây là phần phụ trợ của tôi:

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

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

app.listen(80);

Cập nhật

Tôi nhận thấy rằng Bây giờ bạn có thể có tới 2 yêu cầu nếu bạn đang sử dụng cả xhr và tìm nạp api cùng một lúc

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


Nó nói 19 của tôi, nó bị hỏng?
PauAI

Firefox Developer Edition 57.0b12 nói 2.
AnthonyB

0

Tôi tin rằng có số lượng yêu cầu http đồng thời tối đa mà các trình duyệt sẽ thực hiện cho cùng một tên miền, theo thứ tự 4-8 yêu cầu tùy thuộc vào cài đặt và trình duyệt của người dùng.

Bạn có thể thiết lập các yêu cầu của mình để đi đến các tên miền khác nhau, điều này có thể hoặc không khả thi. Các anh chàng Yahoo đã nghiên cứu rất nhiều về lĩnh vực này mà bạn có thể đọc về ( tại đây ). Hãy nhớ rằng mọi tên miền mới bạn thêm cũng yêu cầu tra cứu DNS. Các anh chàng YSlow đề xuất từ ​​2 đến 4 tên miền để đạt được sự thỏa hiệp tốt giữa các yêu cầu song song và tra cứu DNS, mặc dù điều này tập trung vào thời gian tải của trang, chứ không phải các yêu cầu AJAX tiếp theo.

Tôi có thể hỏi tại sao bạn muốn thực hiện nhiều yêu cầu như vậy? Có những lý do chính đáng để các trình duyệt giới hạn số lượng yêu cầu trong cùng một tên miền. Bạn sẽ tốt hơn tắt gói yêu cầu nếu có thể.


1
XmlHttpRequests của tôi không thể đi đến các tên miền khác nhau như bạn đề xuất, do Chính sách xuất xứ giống nhau. (Có lẽ đây là một đối số cho việc sử dụng jsonp để khắc phục vấn đề này.) Trang này là bảng điều khiển chỉ huy và kiểm soát cho nhiều máy tính; do đó, một yêu cầu được sinh ra cho mỗi lần thực hiện được yêu cầu bởi người dùng.
Michael Gundlach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.