webdev_faq: AJAX: проблемы стабильности и надёжности при большой нагрузке на сервер.
Последние пару месяцев пишу небольшое Ajax-приложение.
Если коротко, то такой упрощённый браузерный Excel - фильтр сверху, табличка с данными снизу. Пользователь выбирает в фильтре, что он хочет редактировать, в табличку снизу подгружаются данные, пользователь их может редактировать, после изменения данных они отправляются на сервер, там обрабатываются, записываются в базу данных, сервер генерирует новые данные, графики, данные отправляет назад, графики отображаются отдельно в iFrame. До меня это приложение было не аяксовым, а основывалось на обычных формах, и пользователю приходилось ждать новой загрузки страницы после каждого изменения фильтра или данных (так как данные в ячейках зависили от других ячеек, приходилось делать пересчёт после каждого изменения), а мне поручили переделать всё под Ajax. Я не javascript-программист, я из мира Delphi/Builder, где весь интерфейс рисуется без проблем за полчаса, а потом уже пишется логика. Многое мне пришлось изучать на ходу, почти всё пришлось писать самому (вручную рисовать контролы и описывать эвенты на javascript, попутно борясь с несовместимостью или разной реакцией разных браузеров на один и тот же код - брррр, врагу не пожелаешь)
С начала всё было хорошо, пока с программкой работал я, как ajax-программист, и наш php-программист, который реализовывал серверную логику (там всё намного сложней, чем в браузере - большие объёмы вычислений, коммуницирование с разными источниками данных).
И вот, мы отладили всю логику и загрузили реальные данные, и к проекту подключились тестеры, а так же и заказчик начал тестировать. И вот тут-то и началось страшное...
Нагрузка на сервер многократно возросла, процессор часто нагружен на 100%, особенно если несколько пользователей работают на самом верхнем уровне, когда после изменения одного значения в табличке приходится пересчитывать на всех ступенях ниже и записывать изменения в базу данных (да, не идеальные планирование и проектирование) — но меня это мало касалось, я отвечаю лишь за интерфейс клиента.
Меня касалось то, что аякс начал сбоить - то связь прервётся, то ошибка 504, то данные придут битые и неправильно собираются eval()-ом (я использую JSON-формат, выбрал за простоту использования: json_encode($data) на сервере и var data = eval("("+json_string+")") в браузере). Причём ошибки нерегулярные, отслеживать трудно. То несколько отправленных подряд аякс-запросов вернутся в неправильном порядке. Или пользователь меняет подряд пять значений в табличке, системой обрабатываются все, кроме четвёртого - запрос пропал по дороге, ну и заказчика это, понятно, ни разу не радовало.
Так что возникла потребность в некоем Connection Pool-е, который бы управлял всеми запросами (у меня на каждый запрос создаётся свой аякс-объект и обрабатывается совершенно независимо от других - при малой нагрузке и небольшом количестве данных всё работало очень быстро и без сбоев), различал бы типы запросов (изменение данных — в строгой очерёдности и в зависимости от результатов предыдущих запросов, изменения фильтра — не больше одного за раз и т.п., так же было бы неплохо блокировать ввод до обработки важных запросов), отправлял бы запросы в строгой очерёдности и обрабатывал бы их в порядке отправки, при возникновении исправимых ошибок связи пытался бы снова, а в случае неисправимых ошибок отменял бы запросы и т.п.
Думаю, многие уже сталкивались с подобной проблемой и как-то её решали. Меня больше интересует даже не готовый код, а алгоритм, описание техники. Ну и любые советы бывалых аякс-программистов.
Прошу отвечать только по существу вопроса.
Спасибо за внимание.
habrahabr.ru
- Web-разработка: JSON И XML. Что лучше? Примечание: ниже перевод обзорной статьи "JSON vs XML", посвященной JSON и его сравнению с XML по ряду критериев. Публикуется в целях популяризации JSON среди читателей Хабрахабра.JSON (англ. JavaScript Object Notation) — формат обмена данными, легко читаем людьми, легко обрабатывается и генерируется программами. Основан на подмножестве языка JavaScript, Standard ECMA-262 3rd Edition — декабрь 1999.JSON — ВикипедияЧто является правильным форматом ответа на XMLHttpRequest в AJAX-прил
- Ajax: AJAX для новичков Сейчас в сети Интернет наблюдается очень активное развитие (и даже использование) новых технологий. Одна из таких технологий - AJAX.Что такое AJAX? AJAX - это аббревиатура, которая означает Asynchronous Javascript and XML. На самом деле, AJAX не является новой технологией, так как и Javascript, и XML существуют уже довольно продолжительное время, а AJAX - это синтез обозначенных технологий. AJAX чаще всего ассоцириуется с термином Web 2.0 и преподносится как новейшее Web-приложение. При исполь
- Web-разработка: jQuery для JavaScript-программистов Примечание: ниже расположен перевод статьи "jQuery for JavaScript programmers", в которой автор высказывает свое мнение об этой библиотеке, ориентируясь, в первую очередь, на продвинутых программистов, и приводит несколько десятков примеров ее использования.Когда jQuery увидела свет в январе 2006, я подумал: «очередная красивая игрушка». Выбор CSS-селекторов в качестве базиса было, конечно, изящной идеей (подробнее о ней в моей заметке getElementsBySelector), но использование цепочек преобразов
- Web-разработка: Практический опыт в AJAX: что делать с кнопкой «назад» в браузерах Примечание: статья посвящена обзору проблемы неработающей кнопки «назад» в браузере при использовании AJAX-методов для передачи содержания страниц от сервера к клиенту. В статье рассматриваются основные принципы работы AJAX и возможные пути решения заявленной проблемы. Курсивом даны мои комментарии.Эта статья является первой из списка материалов (прим.: вторая статья посвящена работе с закладками, думаю, до нее тоже руки дойдут), направленных на устранение части критики, которую адресуют сейчас
- Web-разработка: Практический AJAX: что делать с кнопкой «назад» в браузерах Примечание: статья посвящена обзору проблемы неработающей кнопки «назад» в браузере при использовании AJAX-методов для передачи содержания страниц от сервера к клиенту. В статье рассматриваются основные принципы работы AJAX и возможные пути решения заявленной проблемы. Курсивом даны мои комментарии.Эта статья является первой из ряда материалов (вторая статья посвящена работе с закладками), направленных на устранение части критики, которую адресуют сейчас AJAX, и предоставляющих обзор полезных м