Java: каковы лучшие методы для связи с пакетным сервером? - PullRequest
3 голосов
/ 23 октября 2008

У меня есть веб-приложение (с чистым Java-сервлетом), которое выполняет тяжелую вычислительную работу с доступом к базе данных в асинхронном режиме. Я планирую использовать выделенный сервер для выполнения таких пакетных заданий, и мне интересно, какие инструменты / методы / протоколы использовать для связи между сервлетами на веб-сервере и пакетными заданиями на новом выделенном сервере. Я смотрю на JMS. Это правильный выбор? Существуют отраслевые стандарты и / или широко принятые методы? Мне также нужна обработка очередей и приоритетов для нескольких одновременных заданий.

Ответы [ 5 ]

3 голосов
/ 23 октября 2008

JMS - довольно стандартное решение. Высокопроизводительные платформы (например, Sun JCAPS) интенсивно используют JMS для разделения и управления рабочей нагрузкой веб-служб.

Есть много преимуществ для покупки высокопроизводительной JMS-реализации у Sun (или IBM или Microsoft). Во-первых, вы получаете такие вещи, как надежные очереди сообщений, которые возвращаются в файловую систему. Ни одно сообщение не может потеряться. Во-вторых, вы получаете некоторые инструменты мониторинга и управления.

Одна крутая вещь - это иметь очередь JMS с (потенциально) несколькими подписчиками для балансировки рабочей нагрузки.

Еще одна крутая вещь - иметь тему JMS, в которой есть процесс регистрации, а также подписка на реальный рабочий процесс. В процессе регистрации регистрируются сообщения и просто записываются основные этапы запуска и остановки задания.

2 голосов
/ 23 октября 2008

Обмен сообщениями является одним из лучших вариантов.

Сделайте структуру обмена сообщениями очень универсальной, чтобы она могла обрабатывать любые типы пакетных заданий.

Одним из подходов является наличие менеджера событий / задач, в котором вы помещаете событие в очередь, а потребитель очереди обрабатывает событие и преобразует его в набор задач. Затем задачи могут быть выполнены отдельными обработчиками задач. Задача также может генерировать еще несколько событий, которые могут быть снова помещены в очереди для обеспечения обратной связи. Таким образом, вы можете добавить рабочие процессы, подобные функциям, в инфраструктуру и позволить вашим пакетным заданиям зависеть друг от друга.

1 голос
/ 23 октября 2008

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

Надеюсь, это поможет.

1 голос
/ 23 октября 2008

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

Поскольку я не знаю, что подразумевается под связью между пакетным сервером и сервлетом, я могу только сказать, что, возможно, есть несколько вариантов, которые вы можете использовать (да, JMS - один из них). Но все они в основном полагаются на опрос вызовов сервлета, который затем каким-то образом проверит, ожидает ли что-нибудь ожидающий пакетный сервер. Это может быть просто сервлет на пакетном сервере или выполнение вызовов в очередь ответов JMS. Доступны и другие решения, но суть в том, что он не асинхронный, если только у вас нет возможности проталкивать данные от сервера пакетной обработки до конца клиента (я полагаю, браузера) через что-то вроде AJAX.

Во всяком случае, просто что-то иметь в виду.

0 голосов
/ 30 октября 2009

Мы используем JMS с веб-сервисами:

  1. Расчет клиентских запросов через веб-сервис
  2. Сервер записывает сообщение JMS и создает значение идентификатора, которое сохраняется в базе данных вместе со статусом (первоначально «Ожидание»). Сервер возвращает идентификатор клиенту.
  3. Сервер (может быть отдельным сервером) читает сообщение JMS, выполняет вычисления, а по окончании обновляет статус «Завершено» в базе данных
  4. Пока вычисления продолжаются, клиент опрашивает сервер, чтобы определить состояние, используя другой веб-сервис (вместе с идентификатором). Сервер возвращает статус, полученный из базы данных. После завершения вычислений на сервере клиент увидит состояние «Завершено» и узнает, что вычисление завершено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...