Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.11.2010, 14:25
Интересующийся
Отправить личное сообщение для lliberty Посмотреть профиль Найти все сообщения от lliberty
 
Регистрация: 12.03.2009
Сообщений: 14

AJAX и время запросов
Небольшое описание системы:
1. Имеется сервер и клиент. Взаимодействие через AJAX
2. Пинг до сервера пусть будет 70мс
3. Время выполнения скрипта 5мс

Если запрос происходит через GET, то данные с сервера приходят через 75-80мс. Проблема в том, что используются запросы POST (т.к. серверу для работы необходимо отправить 1-2кб данных, которые сейчас хранятся у клиента), и тогда данные с сервера приходят уже через 150-160мс (из-за отправки двух пакетов при POST (заголовок и сами данные) вместо одного).

Заказчик проекта считает что раз пинг до клиента 70 мс, то и данные он должен получать за примерно такое же время, но никак не в 2-2,5 раза дольше. В чем-то он прав, т.к. проект связан с веб-доступом к удаленной СУБД и время тут критично.

Я сейчас прикинул 2 варианта:
1) Берем данные клиента (в JSON), сжимаем их LWZ, затем переводим в Base64. Подставляем в адресную строку и отправляем как GET запрос. Минимум изменения кода как на стороне клиента так и на сервере. Опасность, влезет ли даже такой сжатый запрос в GET...
2) Хранить сами данные клиента на сервере (Memcached). На действия клиента формировать небольшие GET запросы (добавил/изменил/удалил часть запроса). Но, тут необходимы серьезные изменения в логике работы как серверной, так и клиентской частей.

Собственно вопрос к опытным программерам, может можно еще как-то загнать "большой" запрос в GET (сессии? Coockies? ???) ? Я согласен что вариант (2) более оптимален, но хотелось обойтись "малой кровью", а не переписывать пару мегабайт PHP и JS текстов...

Последний раз редактировалось lliberty, 07.11.2010 в 14:27.
Ответить с цитированием
  #2 (permalink)  
Старый 07.11.2010, 14:43
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от lliberty
3. Время выполнения скрипта 5мс
фантастика!
Сообщение от lliberty
из-за отправки двух пакетов при POST (заголовок и сами данные) вместо одного
чего?
что за бред?

я бы на вашем месте:
1) замерил бы скорость выполнения самого скрипта при разных случаях.
практически уверен, что при POST-запросе тормозит именно скрипт, либо выполняемые им запросы к СУБД
2)воспользовался бы фаербагом.
он прекрасно показывает на какие действия было потрачено время при каждом запросе.
вполне возможно, что тормозит какой-то из сетевых этапов.
я например однажды видел, как на локалхосте страница грузилась несколько секунд.
из них практически все время занимал DNS_запрос
Ответить с цитированием
  #3 (permalink)  
Старый 07.11.2010, 15:21
Интересующийся
Отправить личное сообщение для lliberty Посмотреть профиль Найти все сообщения от lliberty
 
Регистрация: 12.03.2009
Сообщений: 14

Тестил вчера, долго и упорно.
1. Время выполнения я замерял в PHP через microtime(), схематично так:
<?php
$tstart = microtime(1);

//<---
Коннект к базе, memcahced
Сам скрипт
//--->

$tend = microtime(1);
echo round(1000000*(tend-tstart));
?>

Полноценные запросы 7-10 мс (разумеется при условии что нет сложных выборок из базы, либо выборки закешированы).


А вот с POST не бред.
Сделал такой маленький тест, вместо полноценного скрипта, php-заглушка.
<?php
 echo 'test';
?>

Делаем к этому скрипту Ajax-запрос методом GET. Время отклика (firebug) 60-80мс.
Изменяем скрипт и делаем запрос методом POST. И, фантастика, время загрузки резко увеличивается до 140-180мс. нет никаких запросов к базе, скрипт не меняли (firebug показывает, что основное време тратится на "Ожидание", в то время как "DNS", "Подключение" и "Отправка" по нулям, "Загрузка" 3-5мс).

Далее, переделал 1 простой запрос (выборка 1 значения: обращение к memcached и к базе если нет в кеше) от клиента к серверу из POST в GET. Обработка данных такая же, а время загрузки ответа от сервера упало с 170мс до 70-90мс.

Далее, отказался от PHP. Написал небольшую fcgi-c++ программку (выборка 1 значения из таблицы). Запустил на сервере. Запросы POST к ней идут 150-300мс. GET запросы 65-100мс.


Цитата перевода статьи с developer.yahoo.com
Цитата:
Команда Yahoo! Mail обнаружила, что при использовании XMLHttpRequest, POST выполняется в браузерах как двухэтапный процесс: сначала отправляются заголовки, затем данные. Поэтому лучше использовать GET, который отправляет только один TCP-пакет (если только у Вас небольшое количество cookies). Максимальная длина URL в IE - 2K, так что, если Вы посылаете больше, чем 2 К данных, то Вы не сможете использовать GET.

Был обнаружен интересный побочный эффект: POST без отправки каких-либо данных, ведёт себя как GET. Согласно HTTP-спецификации, GET предназначен для получения информации, поэтому имеет смысл (семантически) использовать GET только тогда, когда Вы просто запрашиваете данные, а не передаёте их для хранения на стороне сервера.

Последний раз редактировалось lliberty, 07.11.2010 в 15:26.
Ответить с цитированием
  #4 (permalink)  
Старый 07.11.2010, 16:00
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

удалено.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 02.02.2011 в 14:53.
Ответить с цитированием
  #5 (permalink)  
Старый 07.11.2010, 16:07
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

чтож.
не знал о такой нерациональности в XMLHttpRequest
Сообщение от lliberty
Собственно вопрос к опытным программерам, может можно еще как-то загнать "большой" запрос в GET (сессии? Coockies? ???) ? Я согласен что вариант (2) более оптимален, но хотелось обойтись "малой кровью", а не переписывать пару мегабайт PHP и JS текстов...
сессии они исключительно на сервере, через них информацию с клиента не передашь.
попробуйте с куками поэксперементировать.
Задача весьма нетривиальная.
Ответить с цитированием
  #6 (permalink)  
Старый 07.11.2010, 16:08
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

удалено.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 02.02.2011 в 14:54.
Ответить с цитированием
  #7 (permalink)  
Старый 07.11.2010, 16:11
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

удалено.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 02.02.2011 в 14:54.
Ответить с цитированием
  #8 (permalink)  
Старый 07.11.2010, 16:13
Интересующийся
Отправить личное сообщение для lliberty Посмотреть профиль Найти все сообщения от lliberty
 
Регистрация: 12.03.2009
Сообщений: 14

Сообщение от Gozar Посмотреть сообщение
Потом, ваше время задержки не всегда будет одинаковое, в зависимости от времени суток, провайдеров, хостеров и т.д.
Абсолютно согласен. Но тесты по 100-200 запросов подряд, примерно в одно и то же время суток, и на одном и том же (абсолютно не нагруженном в данный момент VDS) я думаю более-менее объективны ))
Про лоадер согласен, но при частоте подгрузки 5-6 раз в минуту, мелькание лоадера (пусть даже на секунду), мне кажется наоборот, еще сильнее будет раздражать посетителя))

Сообщение от Gozar Посмотреть сообщение
Скорее всего вы придете к тому что ваше время задержки будет съедаться в другом месте и оно будет больше чем изначальное без извратов.
Это вполне возможно, поскольку придется переносить предварительную обработку данных которая делалась в клиенте на сервер.

Сообщение от Gozar
ps: а вообще похоже на, я написал кривое приложение или наобещал невозможного, а теперь меня не устраивает как работает протокол, технология, сервер и т.д. Кто-то здесь точно не прав и это не POST.
Похоже)) Но идея немного другая: "если физически (используя другой протокол) можно увеличить скорость отклика сервера в 1,5-2 раза, то почему бы это не сделать?"

Сообщение от Gozar Посмотреть сообщение
Если размер данных одинаков и заранее известен...
Хех, в этом то и облом что неизвестен...
Ответить с цитированием
  #9 (permalink)  
Старый 07.11.2010, 16:21
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

удалено.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 02.02.2011 в 14:54.
Ответить с цитированием
  #10 (permalink)  
Старый 07.11.2010, 16:26
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

удалено.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 02.02.2011 в 14:54.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не приходят калбэки от Ajax запросов sundevil AJAX и COMET 22 04.10.2010 13:27
Ajax разбор метода mycoding jQuery 14 21.05.2010 10:57
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23
Проблема с AJAX запросом + mod_rewrite BrokenEye AJAX и COMET 1 12.07.2009 02:08
Объясните как вызывается ajax скрипт AddressBook из формы prog90 AJAX и COMET 3 06.06.2009 16:12