Последние пару месяцев я пишу небольшое Ajax-приложение.
Если коротко, то это упрощенный браузерный Excel — сверху фильтр, снизу таблица с данными.
Пользователь выбирает в фильтре, что он хочет редактировать, данные загружаются в таблицу ниже, пользователь может их редактировать, после изменения данных они отправляются на сервер, там обрабатываются, записываются в базу данных, сервер генерирует новые данные, графики, отправляет данные обратно, графики отображаются отдельно в iFrame. До меня это приложение не было Ajax, а было основано на обычных формах, и пользователю приходилось ждать загрузки новой страницы после каждого изменения фильтра или данных (поскольку данные в ячейках зависели от других ячеек, это было необходимо делать перерасчет после каждого изменения), и мне была поставлена задача переделать все под Ajax. Я не javascript-программист, я из мира Delphi/Builder, где весь интерфейс можно без проблем нарисовать за полчаса, а потом написать логику.
Многому приходилось учиться на ходу, почти всё приходилось писать самому (вручную рисовать контролы и описывать события в javascript, попутно боровшись с несовместимостью или разной реакцией разных браузеров на один и тот же код - брррр, не пожелаешь на своего врага).
С начала все было хорошо, пока я работал с программой как ajax-программист, и наш PHP-программист, реализовавший серверную логику (там все гораздо сложнее, чем в браузере - большие объемы вычислений, общение с разными данными источники).
И вот, мы отладили всю логику и загрузили реальные данные, к проекту подключились тестировщики, и заказчик тоже начал тестирование.
И тут началось самое страшное.
Нагрузка на сервер многократно возросла, процессор часто загружен на 100%, особенно если на самом высоком уровне работает несколько пользователей, когда после изменения одного значения в таблице приходится пересчитывать на всех уровнях ниже и писать изменения в базе (да, не идеальное планирование и дизайн) — но это меня не сильно волновало, я отвечаю только за клиентский интерфейс.
Меня беспокоило то, что Ajax начал глючить — либо соединение прерывалось, либо ошибка 504, либо данные приходили битыми и неправильно собирались eval() (я использую формат JSON, выбрал для удобства использования: json_encode( $data) на сервере и var data = eval("("+json_string+")") в браузере).
Более того, ошибки нерегулярны и их трудно отследить.
Тогда несколько Ajax-запросов, отправленных подряд, вернутся в неправильном порядке.
Или пользователь меняет пять значений подряд, система обрабатывает все, кроме четвертого — запрос пропадал по пути, и заказчик этому, конечно, никогда не был рад. Поэтому возникла необходимость в каком-то Connection Pool, который бы управлял всеми запросами (я создаю свой Ajax-объект для каждого запроса и обрабатываю его совершенно независимо от остальных - при небольшой нагрузке и небольшом объеме данных все работало очень быстро и без сбоев), различал бы типы запросов (изменение данных - в строгом порядке и в зависимости от результатов предыдущих запросов, изменение фильтров - не более одного и т.д., также неплохо было бы заблокировать ввода до тех пор, пока не будут обработаны важные запросы), будет отправлять запросы в строгом порядке и обрабатывать их в том порядке, в котором они были отправлены, если возникнут исправимые ошибки связи, он попытается еще раз, а в случае неисправимых ошибок, он отменит запросы и т. д. .
Думаю многие уже сталкивались с подобной проблемой и как-то ее решили.
Меня больше интересует даже не готовый код, а алгоритм, описание технологии.
Ну и какие-нибудь советы от опытных Ajax-программистов.
Пожалуйста, отвечайте только по сути вопроса.
Спасибо за внимание.
Теги: #Ajax #разработка #надежность #стабильность #Разработка сайтов
-
Мой Побег(Html)
19 Oct, 24 -
Рекомендации По Созданию Презентаций
19 Oct, 24 -
Артемий Ругается Все Страстнее
19 Oct, 24