Лучшее решение для вызова 10 API, сохраняя при этом хороший пользовательский опыт? - PullRequest
3 голосов
/ 23 июля 2011

У меня есть сайт, похожий на Expedia и Priceline.Пользователь вводит даты, а затем вызываются 10 различных API для возврата результатов.Получение результатов по всем 10 может (время от времени) занимать до 90 секунд.

То, что я хотел бы иметь, это заставки / экраны загрузки (похожие на Priceline), которые будут отображаться, пока пользователь ожидает результатов.

Я пытался использовать jQuery Ajax для вызова API игенерировать результаты, но некоторые браузеры испытывают проблемы (блокировка, когда результаты не достаточно быстрые).

Я нахожусь в среде LAMP и я подумал об использовании cronjob для обработки API и сохранения результатовв базе данных, но я не уверен, насколько это будет практично.

Ответы [ 3 ]

6 голосов
/ 23 июля 2011
  1. Все ваши вызовы ajax должны быть асинхронными, чтобы пользовательский интерфейс оставался активным.Это должно быть очевидно, но так как вы упомянули блокировку браузера, я подумал, что лучше упомянуть об этом.
  2. Возможно, вам придется выяснить, есть ли у браузеров какие-либо ограничения для каждого окна браузера на количество одновременных вызовов ajax, которые они допускают.Если это так, а число меньше, чем вы хотите, вам придется переосмыслить вещи.
  3. Вы определенно хотите установить некоторые индикаторы типа «Загрузка результатов ...», ожидая результатов.
  4. Если ваши данные являются видом данных, которые вы можете показывать в прогрессивном режиме (например, отображать некоторую новую информацию при каждом возврате ajax-вызова), то пользователь будет чувствовать, что функция более отзывчива, чем если вы ждете все 10чтобы закончить, прежде чем что-либо показывать.
  5. Для чего бы вы ни принимали ваши звонки, у пользователя должен быть простой способ остановить транзакцию и вернуться в полезное место на вашем сайте (без необходимости закрывать окно браузера).или покинуть свой сайт).Вы даже хотите, чтобы нетерпеливые пользователи хотя бы попытались повторить попытку, а не ушли.
  6. Если вы сталкиваетесь с имитацией браузера при одновременных подключениях, вы можете попросить прокси-сервер на вашем запросе.Отправьте небольшое количество запросов на ваш сервер и, в свою очередь, отключите столько общих запросов, сколько необходимо, и верните сопоставленные данные.
  7. Если запрашиваемые данные могут быть эффективно кэшированы или предварительно извлеченына вашем сервере, не влияя на точность, тогда это может реально помочь производительности.
  8. Убедитесь, что вы обрабатываете все условия ошибок при вызовах ajax, чтобы пользовательский опыт, по крайней мере, позволил пользователю повторить попытку или, в лучшем случае, продолжил с меньшим количествомрезультаты, если какое-либо соединение не работает.
  9. Поймите, какие значения таймаута для всех соединений установлены в вашем коде ajax, и убедитесь, что они соответствуют вашему приложению.Если время ожидания соединения по умолчанию недостаточно для инкапсуляции большинства ваших вызовов ajax, вам может потребоваться его удлинить.
  10. Разработайте условие, при котором один или несколько вызовов ajax не будут выполнены.Знайте, что произойдет в вашем приложении, и проверьте это условие, чтобы убедиться, что требуемый пользовательский интерфейс действительно работает.
  11. Помните, что (при использовании асинхронных вызовов Ajax) пользователь может взаимодействовать с вашей страницей, чтобы вы моглинеобходимо отключить, скрыть или иным образом предотвратить взаимодействие с частями страницы, с которыми они не должны возиться во время асинхронных вызовов.
  12. Другая сторона предыдущего пункта заключается в том, что вы можете разрешить определенные типы взаимодействияв ожидании завершения асинхронных вызовов.Например, вы можете позволить пользователю изменить свое мнение и начать новый запрос.Возможно, вы захотите, чтобы они взаимодействовали с некоторыми вещами на следующем этапе процесса, пока они ожидают и т. Д. В основном, чем больше вы можете предложить им во время ожидания с точки зрения информации о прогрессе, частичных результатов или чего-то еще, над чем можно поработатьтем меньше они заметят или будут ждать.
1 голос
/ 23 июля 2011

Вы пробовали что-то вроде beanstalkd ? Похоже, что если задержка составляет до 90 секунд, вы должны поставить в очередь задания и уведомить пользователя, когда результат будет готов, а не запускать задания синхронно и отобразить длительную заставку. Чтобы реализовать push-уведомление, попробуйте jQuery Comet .

0 голосов
/ 23 июля 2011

Если вам нужно показать все результаты одновременно, запустите один вызов на страницу php и позвольте ему делать вызовы через curl. Помните, установить ограничение по времени, хотя.

Иначе, разбейте работу на две-четыре страницы и запускайте вызовы ajax для каждой. Когда каждый вернется, покажите эти результаты. В этом случае достаточно простого изображения загрузки. Никаких всплесков здесь.

И не забывайте кэшировать все, что можете.

*** Edit

Обратите внимание, что я сосредотачиваюсь на php, делающем вызовы API здесь. Ваш сервер с подключением T1 + определенно будет обрабатывать на 10 вызовов быстрее, чем мой дозвон. :.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...