Я задаюсь вопросом, что идет согласие, сколько запрашивает одновременный асинхронный ajax, обычно допустимо.
Причина, которую я спрашиваю, я работаю над персональным веб-приложением. По большей части я подавляю свои запросы одному. Однако существует несколько ситуаций, куда я отправляю до 4 запросов одновременно. Это вызывает немного задержки, поскольку браузер только обработает 2 за один раз.
Задержка не является проблемой с точки зрения удобства использования на данный момент. И это будет некоторое время, прежде чем я должен буду волноваться о масштабируемости, если когда-либо. Но я пытаюсь придерживаться лучших практик, так, как разумно. Каковы Ваши мысли? Действительно ли 4 запроса являются разумным числом?
Это действительно зависит от того, правильно ли это работает. Если логика приложения построена так, что 4 одновременных запроса имеют смысл, сделайте это так. Если логика не нарушается упаковкой нескольких запросов в один, вы можете это сделать, но только если это не усложняет код. Делайте это максимально простым и понятным, пока у вас не возникнут проблемы, а затем вы можете приступить к оптимизации.
Но вы можете спросить себя, можно ли улучшить дизайн приложения, чтобы отпала необходимость в нескольких запросах.
Также проверьте это на очень медленном соединении. Одновременные HTTP-запросы не обязательно выполняются на сервере в правильном порядке, и они также могут возвращаться в другом порядке. Это может вызвать проблемы, с которыми вы столкнетесь только на более медленных линиях.
Трудно ответить, не зная некоторых деталей. Если вы просто запускаете запросы и забываете о них, то 4 запроса могут подойти, как и 20, если пользовательский интерфейс не пострадает из-за низкой производительности. Но если вам нужно собрать информацию обратно из службы, то координация этих ответов может стать сложной задачей. Это может быть что-то для рассмотрения.
В предыдущем ответе Кристиана есть хороший момент - проверьте его на медленном соединении. Fiddler может помочь в этом, поскольку он позволяет тестировать медленные соединения, моделируя различные скорости соединения (56 КБ и выше).
Вы также можете рассмотреть возможность запуска одного асинхронного запроса, который может содержать одно или несколько сообщений, для управляющей службы, которая затем может передать сообщения соответствующим службам, собрать результаты и затем вернуться обратно клиенту. Если несколько асинхронных запросов запускаются и затем возвращаются в разное время, это может вызвать нестабильность для пользователя, поскольку каждый ответ затем отображается на странице в разное время.
Я почти уверен, что браузер в любом случае ограничивает количество подключений.
Если у вас Firefox, введите about: config
и найдите network.http.max-connections-per-server
, и там будет указан ваш максимум. Я почти уверен, что это также будет предел для соединений AJAX. Я думаю, что IE ограничен 2. Я не уверен насчет Chrome или Opera.
Изменить:
В Firefox 23 предпочтение с именем network.http.max-connections-per-server
не существует, но есть network.http.max- постоянных подключений на сервер
, а значение по умолчанию - 6.
По моему опыту, 1 - лучшее число, но я соглашусь, что могут быть некоторые редкие ситуации, которые могут потребовать одновременных звонков.
Если я помню, IE является единственным браузером, который по-прежнему ограничивает соединения до 2. Это приводит к тому, что ваши запросы ставятся в очередь, и если ваши первые 2 запроса занимают больше времени, чем ожидалось, или тайм-аут, два других запроса автоматически завершатся ошибкой. В некоторых случаях вы также получаете раздражающий диалог «разрешить продолжить сценарий» в IE.
Если ваш пользователь не может ничего сделать, пока все 4 запроса не вернутся (особенно с учетом увяддной производительности JavaScript в IE), я бы создал транспортный объект, содержащий данные для всех запросов, а затем возвращаемый транспортный объект, который можно анализировать и делегировать при возврате.
Я не эксперт в области сетей, но, вероятно, четыре не будут большой проблемой для малого и среднего приложения, однако, чем больше оно становится, тем выше нагрузка на сервер, которая в конечном итоге может вызвать проблемы. Это действительно не отвечает на ваши вопросы, но вот предложение. Если задержка не является проблемой, почему бы вам не использовать очередь.
var request = []//a queue of the requests to be sent to the server
request[request.length] = //whatever you want to send to the server
startSend();
function startSend(){//if nothing is in the queue go ahead and send this one
if(request.length===1){
send();
}
}
function send(){//the ajax call to the server using the first request in queue
var sendData = request[0];
//code to send the data
//then when you get the response (I can't remember exactly the code for it)
//send it to a function to process the data
}
function process(data){
request.splice(0,1);
if(request.length>0){//check to see if you need to do another ajax call
send();
}
//process data
}
Это, вероятно, не лучший способ сделать это, но это идея, которую вы, вероятно, могли бы изменить, чтобы сделать 2 запроса вместо одного. Кроме того, возможно, вы могли бы изменить его, чтобы отправлять столько запросов, сколько есть в очереди, как один запрос. Затем сервер разделяет их, обрабатывает каждый из них и отправляет данные обратно. Все сразу или даже по мере его передачи, так как сервер может очищать данные несколько раз.Вам просто нужно убедиться, что вы правильно анализируете текст ответа.