Самый эффективный способ вызова внешнего веб-сервиса в Java? - PullRequest
2 голосов
/ 11 апреля 2010

В одном из наших приложений нам нужно вызвать веб-службу Yahoo Soap для получения информации о погоде и другую связанную информацию.

Я использовал инструмент wsdl2java из axis1.4, сгенерировал необходимые заглушки и написал клиент. Я использую bean-компонент jsp для включения клиентского bean-компонента и вызова методов, определенных в клиенте, которые вызывают веб-сервис yahoo inturn.

Теперь проблема: когда пользователи совершают звонки в jsp, время отклика веб-службы сильно отличается, как у одного пользователя это заняло менее 10 секунд, а у другого в той же сети - более минуты.

Мне просто интересно, стоит ли Axis1.4 ставить запросы в очередь, даже если jsps многопоточный.

И, наконец, существует ли эффективный способ вызова веб-службы (погода Yahoo). Обычно я получаю около 200 одновременных запросов от моих пользователей.

Ответы [ 3 ]

4 голосов
/ 11 апреля 2010

Почему бы вам не запланировать один поток, чтобы узнать погоду каждую минуту или около того, и предоставить его JSP вместо того, чтобы каждый JSP мог получить свой собственный отчет о погоде?

Это намного эффективнеекак для вас, так и для Yahoo, и JSP нужно только искать локальный объект (почти мгновенно) вместо подключения к веб-службе.

РЕДАКТИРОВАТЬ

Некоторые новые требованияв комментариях к этому ответу предлагается другой способ выбора решения.

Кажется, что веб-сервис запрашивает не только погоду, которая не только не меняется так часто, но и одинакова для каждого пользователя.но также и другие данные, такие как полетные данные.

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

В качестве основы для требований я бы использовал что-то простое:

  • Пользователям быстро нравится их информация, им не нравится ждать
  • Объем данных, хранящихся на веб-сервере, конечен
  • Удаленные веб-службы имеют своего рода лицензионное соглашение и, вероятно, недовольны 200 одновременнымизапросы одних и тех же данных к одному и тому же источнику (вам)

Быстрый доступ к данным для пользователей лучше всего достигается при наличии данных локально, будь они временные (хранящиеся в компоненте) или постоянные (локальная база данных)).Это можно сделать, периодически запрашивая данные из удаленного источника и используя кэшированные данные в JSP.Это также поможет вам разобраться с третьим пунктом.

Конечное количество данных, хранящихся в веб-службе, означает, что не все может быть кэшировано.Данные, которые различаются для каждого пользователя, или большие наборы данных, которые могут меняться в течение небольших периодов времени, не могут быть легко кэшированы.Не очень хорошая идея загружать данные обо всех рейсах всех аэропортов США каждую минуту или около того.Такие запросы лучше обслуживать, если необходимо выполнить определенный запрос веб-службы.

Теперь нужно определить, когда кэширование данных осуществимо.Если это возможно, сделайте это, в противном случае выполните запрос веб-службы в фоновом режиме.Это можно сделать, представив JSP сейчас и запустив запрос веб-службы в фоновом режиме.JSP может иметь сценарий AJAX, который запрашивает у вашего веб-сервера, готовы ли данные, и вставляет эти данные на страницу, когда они готовы.

1 голос
/ 11 апреля 2010

Я бы порекомендовал локальное кэширование и пул данных. Вместо того, чтобы отправлять 200 отдельных запросов в аналогичные / одинаковые местоположения, запускайте фоновый поток, который запрашивает информацию о погоде только для тех мест, которые интересуют ваших пользователей, и кэширует их локально, этот кэш обновляется каждую минуту или около того. Когда пользователи запрашивают свои личные предпочтения, запросы попадают в кэш и повторно выбирают, если местоположение новое или данные в кэше устарели. Таким образом, пользователь получит более беспроблемную работу, и вы не нажмете на газ Yahoo и получите отказ в обслуживании.

1 голос
/ 11 апреля 2010

Я бы использовал инструменты Google, чтобы следить за продолжительностью звонка в веб-службу.

Здесь происходит несколько вещей:

  1. Сопоставление Java-бинов с запросом XML.
  2. Отправка XML-запроса на веб-сервис.
  3. Unmarshall XML-запрос на стороне веб-службы.
  4. Запрос веб-службы обрабатывает
  5. XML-ответ веб-службы
  6. Веб-служба отправляет XML-ответ клиенту Java
  7. Unmarshall XML-ответ и отображение на клиенте.

Вы не можете видеть внутри веб-службы Yahoo, но не забудьте посмотреть, что вы видите на стороне клиента, чтобы увидеть, на что тратится время.

Проверьте память. Если Axis генерирует файлы .class, возможно, ваше пространство перманента используется. Visual VM доступен для вас вместе с JDK. Прикрепите его к PID вашего клиента, чтобы увидеть, что происходит в памяти на вашем сервере приложений.

Может быть, это было бы хорошим местом для вызова AJAX. Это будет хорошим решением, если вы сможете узнать погоду в фоновом режиме, пока пользователи занимаются другими делами.

...