Как стать автором
Обновить

AJAX: проблемы стабильности и надёжности при большой нагрузке на сервер

Время на прочтение 3 мин
Количество просмотров 5.3K
Последние пару месяцев пишу небольшое Ajax-приложение.

Если коротко, то такой упрощённый браузерный Excel — фильтр сверху, табличка с данными снизу. Пользователь выбирает в фильтре, что он хочет редактировать, в табличку снизу подгружаются данные, пользователь их может редактировать, после изменения данных они отправляются на сервер, там обрабатываются, записываются в базу данных, сервер генерирует новые данные, графики, данные отправляет назад, графики отображаются отдельно в iFrame. До меня это приложение было не аяксовым, а основывалось на обычных формах, и пользователю приходилось ждать новой загрузки страницы после каждого изменения фильтра или данных (так как данные в ячейках зависили от других ячеек, приходилось делать пересчёт после каждого изменения), а мне поручили переделать всё под Ajax. Я не javascript-программист, я из мира Delphi/Builder, где весь интерфейс рисуется без проблем за полчаса, а потом уже пишется логика. Многое мне пришлось изучать на ходу, почти всё пришлось писать самому (вручную рисовать контролы и описывать эвенты на javascript, попутно борясь с несовместимостью или разной реакцией разных браузеров на один и тот же код — брррр, врагу не пожелаешь).

С начала всё было хорошо, пока с программкой работал я, как ajax-программист, и наш php-программист, который реализовывал серверную логику (там всё намного сложней, чем в браузере — большие объёмы вычислений, коммуницирование с разными источниками данных).
И вот, мы отладили всю логику и загрузили реальные данные, и к проекту подключились тестеры, а так же и заказчик начал тестировать. И вот тут-то и началось страшное…

Нагрузка на сервер многократно возросла, процессор часто нагружен на 100%, особенно если несколько пользователей работают на самом верхнем уровне, когда после изменения одного значения в табличке приходится пересчитывать на всех ступенях ниже и записывать изменения в базу данных (да, не идеальные планирование и проектирование) — но меня это мало касалось, я отвечаю лишь за интерфейс клиента.

Меня касалось то, что аякс начал сбоить — то связь прервётся, то ошибка 504, то данные придут битые и неправильно собираются eval()-ом (я использую JSON-формат, выбрал за простоту использования: json_encode($data) на сервере и var data = eval("("+json_string+")") в браузере). Причём ошибки нерегулярные, отслеживать трудно. То несколько отправленных подряд аякс-запросов вернутся в неправильном порядке. Или пользователь меняет подряд пять значений в табличке, системой обрабатываются все, кроме четвёртого — запрос пропал по дороге, ну и заказчика это, понятно, ни разу не радовало.

Так что возникла потребность в некоем Connection Pool-е, который бы управлял всеми запросами (у меня на каждый запрос создаётся свой аякс-объект и обрабатывается совершенно независимо от других — при малой нагрузке и небольшом количестве данных всё работало очень быстро и без сбоев), различал бы типы запросов (изменение данных — в строгой очерёдности и в зависимости от результатов предыдущих запросов, изменения фильтра — не больше одного за раз и т.п., так же было бы неплохо блокировать ввод до обработки важных запросов), отправлял бы запросы в строгой очерёдности и обрабатывал бы их в порядке отправки, при возникновении исправимых ошибок связи пытался бы снова, а в случае неисправимых ошибок отменял бы запросы и т.п.

Думаю, многие уже сталкивались с подобной проблемой и как-то её решали. Меня больше интересует даже не готовый код, а алгоритм, описание техники. Ну и любые советы бывалых аякс-программистов.

Прошу отвечать только по существу вопроса.

Спасибо за внимание.
Теги:
Хабы:
+17
Комментарии 60
Комментарии Комментарии 60

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн